と、言うわけで基本から調べることに。昔ちょろっとやったことはあるので、それほど拒否反応はないんだけど結構忘れてるところが・・・。GUIってUNIXな人から見ると*1かなり慣れないというか派手っていう印象だよねー。
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/index.html
標準 Windows API
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
この辺が参考になりそうです。
サンプル
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int nCmdShow){
HWND hWnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(wc); /* 構造体の大きさ */
wc.style = CS_HREDRAW | CS_VREDRAW; /* スタイル */
wc.lpfnWndProc = WndProc; /* メッセージ処理関数 */
wc.cbClsExtra = 0; /* ウインドウクラスが使用する余分のメモリ */
wc.cbWndExtra = 0; /* ウインドウが使用する余分のメモリ*/
wc.hInstance = hInstance; /* モジュールのインスタンスハンドル */
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* アイコン */
wc.hCursor = LoadCursor(NULL, IDC_ARROW); /* カーソル */
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); /* 背景 */
wc.lpszMenuName = NULL; /* メニュー名 */
wc.lpszClassName = "Sample001"; /* クラス名 */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* 小さなアイコン */
RegisterClassEx(&wc); /* ウインドウクラスを登録 */
hWnd = CreateWindow(
"Sample001", /* ウインドウクラス名 */
"Window", /* ウインドウのタイトル */
WS_OVERLAPPEDWINDOW, /* ウインドウスタイル */
32,32, /* ウインドウ表示位置 */
256,256, /* ウインドウの大きさ */
NULL, /* 親ウインドウのハンドル */
NULL, /* メニューのハンドル */
hInstance, /* インスタンスのハンドル */
NULL); /* 作成時の引数保存用ポインタ */
ShowWindow(hWnd, nCmdShow); /* ウインドウを表示 */
UpdateWindow (hWnd); /* 再描画 */
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch(nMsg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, nMsg, wParam, lParam);
}
return 0;
}WindowsプログラムはWinMain()から始まります。
- hInstance
- 現在のアプリケーションのハンドル
- hPrevInstance
- 以前のインスタンス(win32では常にNULL)
- szCmdLine
- 引数
- nShowCmd
- ウインドウの状態
で、プログラムの流れとしては
- ウインドウクラスを登録
- 登録したクラスのインスタンスを作成
- ウインドウの表示
- メッセージ(イベント)に対する処理のループ
という流れになる。何かイベントが発生するとWndProc()というコールバックルーチンが呼ばれるので、そこに適当に処理を書いておけばよい。つまりWinMain()の中身は大体同じような感じで、肝心の処理はコールバックルーチンに書く、ということになるのかと。
WinMain()の中のループ。
- GetMessage()
- スレッドのメッセージキューからメッセージを取ってきます。
- TranslateMessage()
- でキーボード入力をcharに変換します。
- DispatchMessage()
- ウインドウプロシージャーにメッセージをディスパッチします。
ってな感じで♪*2