さて、ようやくウィンドウが表示できるようになりました。そろそろ何か表示をさせてみましょうか。まずは比較的簡単にメッセージを表示させることの出来る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;
}
きょうはここまで。