// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); // メイン メッセージ ループ: while (GetMessage(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } } return TRUE; } BOOL OnPaint() { return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
とりあえず、Visual Studioが作ってくれるテンプレ //// 関数: MyRegisterClass()//// 目的: ウィンドウ クラスを登録します。//ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDC...
なんか、Visual Studioが自動生成するコードじゃ 面白くないよね 適当にMyWindowクラスに したてあげてみよっか? PeekMsgじゃなくて MsgWaitを使った タイマー有りのマルチパンプとキー入力 ...
年末年始 ちょっとづづ ゆっくりやるね
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。//#include "stdafx.h"#include "WindowsProject7.h"#define MAX_LOADSTRING 100// グローバル変数:HINSTANCE hInst; ...
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。//#include "stdafx.h"#include "WindowsProject7.h"#define MAX_LOADSTRING 100// グローバル変数:HINSTANCE hInst; ...
解説を入れておくと グローバル関数のリストに 自分自身をコンストラクタで登録 デストラクタで削除する簡単なシステムを作る 商業だとこんな雑ではダメだけど テストならこれでOK s...
次の解説 staticキーワードを付けることで クラス内にグローバル関数から呼べる関数を作る これでHWNDを通して グローバル関数にthisポインタを伝える static MyWindow * find(HWND key) { std::list&l...
解説 この部分でfindを呼んで ペアのthis関数を見つけて グローバル関数からクラスメソッドを呼び出す 実質このtargetがthisポインタ相当になって this->OnPaintと呼ぶのと同じ効果を出し...
みやすいように フルソース 青い■を表示するだけ // WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。//#include "stdafx.h"#include "WindowsProject7.h"#define MAX_L...
ソース全部だと長いけど ようするに 違いはこの部分 CreateSolidBrush が 色を決めている Rect で位置と大きさを FillRectで書いている 英語が読めればかなり簡単な OnPaint=作画関数 BOOL On...
タイマーを使ったアニメーションを付けた // WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。//#include "stdafx.h"#include "WindowsProject7.h"#define MAX_LOADSTRING 100...
描画部分の違い 変数 y をつかって 高さが8までで移動するように yが変わると■のいちも変わるから タイマーで呼び出されるたbに 下へ 下へと作画される だから まぁ アニメー...
こんな感じ GetMessageの上にタイマーも扱える MsgWaitForMultipleObjectsExを追加 GetMessageだとタイマーを処理できないのでPeekMessageに変更 >なぜかは ちょっと考えると面白い Getのときは必要な...
次回 キー処理 ちなみに、グローバル関数>クラスメソッドのやりかたは 雑なやりかただけど書いてあるから クラス化の利点を生かして 同時にWindowを2枚出して 同じ処理をしてみ...
テトリス風?プログラムに向けて 第何回だろうな キー入力を追加した まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ) タイマーで自動落下 でもまぁ ...
つ https://anond.hatelabo.jp/20190101174449 いまコレの解説中
あまり関係ないけど せっかくクラス化したから Windowを2枚開けるようにすると おもしろいよね。 とはいえ、そのまえに キー入力と作画をやるね その次は タイマー 多分そのぐ...
Windows版の無料の開発環境 https://visualstudio.microsoft.com/ja/free-developer-offers/ Visual Studio Community
たしかに、男職場だからプログラマーいいかもな このぐらいができるなら https://anond.hatelabo.jp/20181228210311 初心者には結構レベルは高め
いない間にWin32API講座が ペゾルド本を初心者に与えると第一章でさえ挫折しそう というか、そもそも設計が色々おかしい おかしいが、もうこの前提から当面も離れられないんだよなあ ...