放課後にプログラムの部活みたいなのをやれればいいねーみたいな話になったので、そのときちょこっとだけ教えられるようにと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の初期化でもやるか。
0 件のコメント:
コメントを投稿