放課後にプログラムの部活みたいなのをやれればいいねーみたいな話になったので、そのときちょこっとだけ教えられるようにとWIN32API周りを復習しております。
何度やっても初期化のあたりは忘れるので、今超適当に組んだコードを保存しておく。今後はこいつのコピペで済ませよう…。
#include <windows.h> #include <tchar.h> //定数など namespace { const TCHAR* APPNAME = _T("01CreateWindow"); const int APP_W = 400; const int APP_H = 300; } //メッセージ処理 LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wp, lp); } //エントリポイント int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, TCHAR*, int) { //ウィンドウクラスの登録 WNDCLASS wc; memset(&wc, 0, sizeof(wc)); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW); wc.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION); wc.lpfnWndProc = MyWndProc; wc.hInstance = hInst; wc.lpszClassName = APPNAME; //クラス登録 if(!RegisterClass(&wc)) { //メッセージなどを出して終了 exit(1); } //ウィンドウサイズの調整 RECT r; SetRect(&r, 0, 0, APP_W, APP_H); AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE); //ウィンドウの作成 HWND hWnd = CreateWindow(APPNAME, APPNAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top, NULL, NULL, hInst, NULL); //作成できない場合のエラー処理 if(!hWnd) { //メッセージなどを出して終了 exit(1); } //ウィンドウの表示 ShowWindow(hWnd, SW_SHOW); //メインループ while(true) { //メッセージ処理 MSG msg; while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { DispatchMessage(&msg); } //終了時はループからぬける if(msg.message == WM_QUIT) break; //この辺にメインロジックを書く } return 0; }こんなのが出ます。
PeekMessageを使っているのは、今後このスケルトンをゲーム用に拡張していくため。GetMessageとかは使わないです。ポーリングも自前でできればいいけど、面倒なときはメインループの末端にSleep(1)とか入れとけばいい。次回はDirect3D9の初期化でもやるか。