ちいさいWin32APIのプログラムを作る

Win32APIの理解をすすめるために小さいプログラムを作った.
OKボタンとキャンセルボタンがあるダイアログだけのもの.

ソース

リソースファイルはリソースエディタで適当に作ってください.

#include "stdafx.h"
#include "Win32Test.h"

INT_PTR CALLBACK MainDialogProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  MSG msg;
  BOOL stat;
  HWND hWnd;

  hWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAIN_DIALOG),
		      NULL, MainDialogProc);

  if (!hWnd) {
    return FALSE;
  }

  ShowWindow(hWnd, nCmdShow); /* (1) */
  UpdateWindow(hWnd);

  while (stat = GetMessage(&msg, NULL, 0, 0)) {
    if (stat == -1) {  // Error
      return FALSE;
    }
    DispatchMessage(&msg);  /* (2) */
  } 
  
  return (int) msg.wParam;
}

INT_PTR CALLBACK MainDialogProc(HWND hDlg, UINT message,
				WPARAM wParam, LPARAM lParam)
{
  switch (message) {
  case WM_INITDIALOG:
    return (INT_PTR)TRUE;
    
  case WM_COMMAND:
    switch (LOWORD(wParam)) {
    case IDOK:
    case IDCANCEL:
      PostQuitMessage(0);
    }
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  }
  return (INT_PTR) FALSE;
}

実行結果

f:id:kei10in:20080413214732j:image

ボタンを押すと終了します.

ちょっとした説明

(1) ShowWindow(hWnd, nCmdShow);
リソースファイルに定義したダイアログのスタイルによっては表示されないかもしれないので念のため.
(2) DispatchMessage(&msg);
これがないとプロシージャにメッセージがわたりません.この行をなくすとうんともすんとも言わないダイアログができます.