FC2ブログ

まったり開発日誌

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

2008年10月19日

  1. 018:モーダイルダイアログを作る(10/19)

018:モーダイルダイアログを作る

モーダルダイアログを作る

今まで、ウィンドウを使ったプログラムを作成してきました。でもちょっとした情報の表示や設定を行いたいだけの場合には、ダイアログが便利です。
また、ダイアログの場合は、VisualC++の「リソースエディタ」を用いて、WYSIWYGにダイアログを作成することが可能ですので、ちょっとしたアプリケーションの作成に向いています。

ダイアログリソースを作成する

まずダイアログリソースの作成を行います。
[ソリューション エクスプローラ]の中の、[リソースファイル]を右クリックします。
メニューから[追加(D)]-[リソース(R)...]を選択します。

[リソースの追加]ウィンドウが開くのでDialogを選択し[新規作成(N)]ボタンをクリックします。

OKとキャンセルのボタンがデフォルトで表示されています。ここにCheck Box、Static Text、Radio Button、Edit Controlを貼り付けてみます。

実行してみましょう。ダイアログの生成方法は、Windowsの場合と同じです。
モーダルダイアログ(ダイアログボックスを閉じるまで、他の操作が出来ない)で表示するソースです。

// SampleDialog001.cpp
// モーダルダイアログを作成する

#include <windows.h>
#include "resource.h"

BOOL DlgProc(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine,int nShowCmd)
{
   DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);

}

// ダイアログプロシージャ
BOOL DlgProc(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
   switch (uMsg){
   case WM_COMMAND:
       switch( LOWORD(wParam) ) {
       case IDOK:
           EndDialog(hDlg,IDOK);
           break;
       case IDCANCEL:
           EndDialog(hDlg,IDCANCEL);
           break;
       }
       break;
   case WM_CLOSE:
       DestroyWindow(hDlg);
       break;
   }
   return FALSE;
}

 

リソースエディタでの表示と、WindowsMobile上での表示が異なっていますね。チェックボックスとラジオボタンの上下か切れてしまっています。



これを修正するには、ダイアログのフォントをWindowsMobileにデフォルトで導入されているフォントに変更します。
では、フォントをTahomaにかえてサイズを9ポイントに設定して実行してみましょう。

このように、正しく表示されました。

なぜダイアログではこのような事が起こるのでしょう。実はダイアログではフォントのサイズを基にして、ダイアログの幅、高さ、オブジェクトの幅、高さを決めているのです。ダイアログにデフォルトで設定されているフォント "MS Shell Dlg"がWindowsMobileには存在しないため、ダイアログやオブジェクトの幅が正しく設定されず、文字が切れたり、チェックボックスやラジオボタンの上下が切れてしまったのです。

ダイアログボックスには、今回作成したモーダルダイアログボックスの他に、モードレスダイアログボックスというものがあります。

モーダルダイアログボックスダイアログボックスを閉じるまで、他の操作が出来ません。通常のアプリケーションではよくこれを使いますね。
モードレスダイアログボックスダイアログボックスを開いている間にも他の操作が出来ます。ダイアログボックスを開いたまま、ブラウザを開いたり、電卓を開いたりすることができます。Excelの検索ダイアログがこれにあたりますね。Excelでは検索ダイアログを開いたまま操作ができますよね。
 
 

では、今回のプログラムの説明です。

モーダルダイアログを作るには、DialogBox関数を呼び出します。ダイアログボックスを閉じるときにはEndDialog関数を呼び出します。

DialogBox関数
モーダルダイアログを表示します。

int DialogBox(
  HINSTANCE
hInstance,      // インスタンスハンドル
  LPCTSTR lpTemplate,       // ダイアログボックステンプレート
  HWND hWndParent,          // 親ウィンドウのハンドル
  DLGPROC lpDialogFunc      // ダイアログプロシージャのポインタ
);

EndDialog関数
モーダルダイアログボックスを破棄し、そのダイアログボックスに関係するすべての処理を終了します。

BOOL EndDialog(
  HWND
hDlg,        // ダイアログボックスのハンドル
  INT_PTR nResult   // 返したい値
);

WinMain関数を見てください。今までのプログラムとは違い、メッセージループがありません。これは、DialogBox関数の処理はEndDialog関数が呼び出されるまで終了しないためです。

DialogBox関数のlpTemplateにはダイアログリソースを指定します。リソース識別子を指定する場合、上位ワードに 0 を、下位ワードに識別子を指定しなければなりません。MAKEINTRESOURCEマクロを使用すれはリソース識別子を作成できます。

lpDialogFuncにはダイアログプロシージャを指定します。

ダイアログプロシージャDlgProcを見てみましょう。ダイアログでは、ボタンが押されるなどのイベントが発生すると、WM_COMMANDメッセージが届きます。これだけでは、どのボタンが押されたのかわかりませんね。追加の情報がwParamに格納されています。どのボタンか判断するにはLOWORD(wParam)とします。これで押されたボタンのIDがわかります。
LOWORDは特定の値の下位ワードを取り出すマクロです。つまりwParamの下位ワードに押されたボタンのIDが格納されているのです。

サンプルでは、IDOKとIDCANCELの処理を別々に書いていますが、ダイアログプロシージャの中での処理が特にない場合はまとめて下のように書きます。EndDialogの第2引数にLOWORD(wParam)を指定するのがポイントです。

        switch( LOWORD(wParam) ) {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlg,LOWORD(wParam));
            break;
        }

今日はここまでです。

スポンサーサイト

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

  1. 2008/10/19(日) 17:07:29|
  2. WindowsMobileではじめるWin32APIプログラミング入門
  3. | トラックバック:0
  4. | コメント:0

RSSフィード

カレンダー

09 | 2008/10 | 11
- - - 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 -

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

リンク

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

メールフォーム

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