005:MessageBoxを使ってhello,world

さて、ようやくウィンドウが表示できるようになりました。そろそろ何か表示をさせてみましょうか。まずは比較的簡単にメッセージを表示させることの出来るMessageBoxを使ってhello,worldを行います。

MessageBox関数

int MessageBox(
    HWND hWnd,          // オーナーウィンドウのハンドル
    LPCTSTR lpText,    
// メッセージボックス内のテキスト
    LPCTSTR lpCaption, 
// メッセージボックスのタイトル
    UINT uType         
// メッセージボックスのスタイル
);

hWndにはオーナーウィンドウのハンドルを指定します。NULLを指定すればオーナウィンドウなしのメッセージボックスになります。
lpTextには、メッセージボックスに表示したい文字列を指定します。_T()マクロを使用しています。
lpCaptionには、メッセージボックスのタイトルを指定します。
uTypeには、メッセージボックスの内容と動作を指定します。以下のいくつかのフラグを組み合わせて使用することができます。

ボタン

MB_OK 

メッセージボックスに[OK]プッシュボタンだけを表示します。これは既定のメッセージボックスタイプです。
MB_OKCANCEL メッセージボックスに[OK]、[キャンセル]の各プッシュボタンを表示します。
MB_RETRYCANCEL メッセージボックスに[再試行]、[キャンセル]の各プッシュボタンを表示します。
MB_YESNO メッセージボックスに[はい]、[いいえ]の各プッシュボタンを表示します。
MB_YESNOCANCEL メッセージボックスに[はい]、[いいえ]、[キャンセル]の各プッシュボタンを表示します。

アイコン

MB_ICONEXCLAMATION 感嘆符(!)アイコンを表示します。
MB_ICONINFORMATION 丸の中に小文字の「i」が描かれたアイコンを表示します。

MB_ICONQUESTION

疑問符(?)アイコンを表示します。
MB_ICONSTOP 停止マークアイコンを表示します。

デフォルトボタン

MB_DEFBUTTON1 1番目のボタンを既定のプッシュボタンにします。
MB_DEFBUTTON2 2番目のボタンを既定のプッシュボタンにします。
MB_DEFBUTTON3  3番目のボタンを既定のプッシュボタンにします。
MB_DEFBUTTON4  4番目のボタンを既定のプッシュボタンにします。

その他のオプション

MB_TOPMOST メッセージボックスを最前面ウィンドウとして作成します。

uTypeにはそのほかにも色々なオプションがあります。詳しくはMSDNの「プラットフォーム SDK」で確認してみてください。

ちなみにMessageBoxはUNICODEマクロが定義されているので実際にはMessageBoxWが呼ばれます。

int MessageBoxW(
    HWND hWnd ,         // オーナーウィンドウのハンドル
    LPCWSTR lpText,     // メッセージボックス内のテキスト
    LPCWSTR lpCaption,  // メッセージボックスのタイトル
    UINT uType);        // メッセージボックスのスタイル
);

サンプルは次のような感じになります。

    // MessageBoxサンプル
    MessageBox(hWnd,_T("こんにちは,世界"),_T("TITLE"),MB_OK);
   

全ソースを表示します。

WinMain関数内で描画したウィンドウのハンドルを取得するために、InitInstance()関数の戻り値を BOOLからHWNDに変更してあります。 そのほかは、MessageBox関数を追加した以外変更していません。

// text001.cpp
//
// "hello, world"サンプル

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
HWND InitInstance(HINSTANCE, int);

WCHAR szClassName[] = _T("win02"); // ウィンドウクラス。UNICODEとしての文字列定数

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nShowCmd)
{
   MSG msg;
   BOOL bRet;
   HWND hWnd;

   if (!InitApp(hInstance))
       return FALSE;
   if (!(hWnd = InitInstance(hInstance,nShowCmd)))
       return FALSE;

   // MessageBoxサンプル
   MessageBox(hWnd,_T("こんにちは,世界"),_T("TITLE"),MB_OK);

   // YES,NO,キャンセルを持つメッセージボックス
   int iRtnValue;
   iRtnValue = MessageBox(hWnd,_T("あなたは男性ですか?"),_T("性別"),MB_YESNOCANCEL);

   switch (iRtnValue)
   {
   case IDYES:
       MessageBox(hWnd,_T("「はい」が選択されました"),_T("男性"),MB_OK);
       break;
   case IDNO:
       MessageBox(hWnd,_T("「いいえ」が選択されました"),_T("女性"),MB_OK);
       break;
   case IDCANCEL:
       MessageBox(hWnd,_T("「×」が選択されました"),_T("分からない"),MB_OK);
       break;
   }

   while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
       if (bRet == -1){
           break;
       } else {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
       }
   }
   return (int)msg.wParam;
}

// ウィンドウクラスの登録

ATOM InitApp(HINSTANCE hInst)
{
   WNDCLASS wc;
   wc.style        = CS_HREDRAW|CS_VREDRAW;
   wc.lpfnWndProc  = WndProc;  // プロシージャ名
   wc.cbClsExtra   = 0;
   wc.cbWndExtra   = 0;
   wc.hInstance    = hInst;
   wc.hIcon        = NULL;     // 未サポート
   wc.hCursor      = NULL;     // 未サポート
   wc.hbrBackground= (HBRUSH) COLOR_WINDOW;
   wc.lpszMenuName = NULL;     // 未サポート
   wc.lpszClassName=(LPCTSTR) szClassName;

   return (RegisterClass(&wc));
}

// ウィンドウの生成
HWND InitInstance(HINSTANCE hInst, int nShowCmd)
{
   HWND hWnd;

   hWnd = CreateWindow(szClassName,_T("Window Title"),
       WS_CLIPCHILDREN,    // ウィンドウの種類
       CW_USEDEFAULT,      // x座標
       CW_USEDEFAULT,      // y座標
       CW_USEDEFAULT,      // 幅
       CW_USEDEFAULT,      // 高さ
       NULL,               // 親ウィンドウのハンドル。親を作るのでNULL
       NULL,               // メニューハンドルまたは子ウィンドウID
       hInst,    &n
bsp;         // インスタンスハンドル
       NULL);
   if (!hWnd)
       return FALSE;
   ShowWindow(hWnd, nShowCmd);
   UpdateWindow(hWnd);
   return hWnd;
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
   switch (msg){
       case WM_DESTROY:
           PostQuitMessage(0);
           break;
       default:
           return (DefWindowProc(hWnd, msg, wp, lp));
   }
   return 0;
}

きょうはここまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です