FC2ブログ

まったり開発日誌

embossの工具箱(J2EE Java2 Linux Zaurus C++)

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_DEFBUTTON11番目のボタンを既定のプッシュボタンにします。
MB_DEFBUTTON22番目のボタンを既定のプッシュボタンにします。
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);
   


次に「はい」、「いいえ」を使ったダイアログボックスを作ってみます。
MessageBoxの第4引数にMB_YESNOや、MB_YESNOCANCELを指定することで「はい」「いいえ」や、「はい」「いいえ」「キャンセル」を選択することができます。MessageBoxの戻り値でどのボタンが押されたかを判定することができます。

    // 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
;
   }

全ソースを表示します。

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,              // インスタンスハンドル
       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;
}

きょうはここまで。

スポンサーサイト

テーマ:Windows Mobile - ジャンル:コンピュータ

  1. 2008/06/23(月) 23:59:19|
  2. WindowsMobileではじめるWin32APIプログラミング入門
  3. | トラックバック:0
  4. | コメント:0
<<006:文字を表示する | ホーム | 004:クロスプラットフォームに対応する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://emboss.blog28.fc2.com/tb.php/86-8e1f6ee3
この記事にトラックバックする(FC2ブログユーザー)

RSSフィード

カレンダー

07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文: