22章 モーダルダイアログボックスの制御に関する考察

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"></meta>
<title>22章 モーダルダイアログボックスの制御に関する考察</title>
</head>

<body bgcolor="WHITE">
<font size="5">22章 モーダルダイアログボックスの制御に関する考察</font>
<hr>
<p>
 18章で、ダイアログボックスは、コントロールを使いやすくする一種のウインドウであることを示唆しました。また、19章と20章では、モーダルダイアログボックスの作成方法を学びました。
<p>
 また、21章では、モードレスダイアログボックスを学びました。モードレスダイアログボックスは制御の流れという観点に立つなら、基本的には、オーナー付きウインドウと酷似していました。オーナー付きウインドウと異なったのは、画面構成をダイアログテンプレートで定義すること。ウインドウプロシージャでなく、ダイアログプロシージャを用いた事。そして、メッセージループにIsDialogMessage関数が組み込まれ、コントロールがより使いやすくなった事だけでした。
<p>
 <b><i><u>この章では、モーダルウインドウを作成し、モーダルダイアログボックスの制御に関する考察を行います</u></i></b>。
<p align="CENTER">
<a href="chap22.lzh">ダウンロード</a>
<hr>
<p>
 では、いつものように、重要な個所のみソースファイルを載せることにしましょうか。すべてのソースファイルを見たい方は、ソースを<a href="chap22.lzh">ダウンロード</a>してください。
<p>
 まず、モーダルウインドウを呼ぶ側のウインドウプロシージャから見てみましょうか。
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト22-1
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 22章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */
/* このファイルでは、メインウインドウのウインド*/
/*ウプロシージャが定義されている */

#define STRICT
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include "wndproc.h"
#include "modal.h"
#include "resource.h"

/*===============================================================================*/

/* このファイル内でのみ用いられる関数のプロトタイプ宣言 */
static LRESULT Wm_CreateProc(HWND,LPCREATESTRUCT);
static LRESULT Wm_DestroyProc(void);
static LRESULT Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl);

/* メインウインドウのウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
  switch(message)
   {
       case    WM_CREATE:
           return  Wm_CreateProc(hwnd,(LPCREATESTRUCT)lparam);
       case    WM_DESTROY:         /*  ウインドウの破壊後処理          */
           return  Wm_DestroyProc();
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
   }
   return  DefWindowProc(hwnd,message,wparam,lparam);
}

/*===============================================================================*/

/* このファイルの中でのみ用いられる変数 */
static HINSTANCE InstanceHandle; /* インスタンスハンドル */

static LRESULT Wm_CreateProc(HWND hwnd,LPCREATESTRUCT cs)
{
  InstanceHandle=cs-&gt;hInstance;        /*  インスタンスハンドルの保存  */
   return  0;
}

static LRESULT Wm_DestroyProc(void)
{
  PostQuitMessage(0);
   return  0;
}

static LRESULT Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  if(wID==ID_MODALWINDOW)
       <b>OpenModalWindow(hwnd,InstanceHandle);</b>   /*  ここでモーダルウインドウを開ける    */
   return  0;
}
</pre>
</table>
<p>
 モーダルダイアログボックスを作成したときと同じで、あっけないですね。メニューに応答して、太文字で示した1つのユーザー定義の関数を呼ぶだけです。ただ、引数は、モーダルダイアログボックスを作成する<b><i><u>DialogBoxParam関数</u></i></b>の引数のサブセットであることに注意してください。
<hr>
<p>
 では、モーダルウインドウのソースを見てみましょう。
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト22-2
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 22章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */

#define STRICT
#include &lt;windows.h&gt;
#include "resource.h"
#include "modal.h"

/* 関数プロトタイプ宣言 */
static ATOM RegModalWindowClass(HINSTANCE);
LRESULT CALLBACK ModalProc(HWND,UINT,WPARAM,LPARAM);

/* モーダルウインドウを作成し、表示する関数*/
void OpenModalWindow(HWND hParentWnd,HINSTANCE InstanceHandle)
{
  HWND            hwnd;       /*  メインウインドウのウインドウハンドル    */
   MSG             msg;        /*  メッセージキューから取得したメッセージ  */

  /*  ここで親ウインドウを使用不可にする  */
   EnableWindow(hParentWnd,FALSE);

  /*  モーダルウインドウのウインドウクラスを登録  */
   if(RegModalWindowClass(InstanceHandle)==0)
   {
       /*  ここで親ウインドウを使用可にする    */
       EnableWindow(hParentWnd,TRUE);
       /*  ここで親ウインドウをアクティブにする*/
       SetActiveWindow(hParentWnd);
       return;
   }

  hwnd=CreateWindow(  "ModalWindowClass", /*  ウインドウ作成          */  
                       "モーダルウインドウ",
                       WS_OVERLAPPEDWINDOW,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       200,
                       130,
                       hParentWnd,
                       (HMENU)NULL,
                       InstanceHandle,
                       0);
   if(hwnd==NULL)      /*  ウインドウの作成に失敗した場合  */
   {
       /*  ウインドウクラスの登録破棄  */
       UnregisterClass("ModalWindowClass",InstanceHandle);
       /*  ここで親ウインドウを使用可にする    */
       EnableWindow(hParentWnd,TRUE);
       /*  ここで親ウインドウをアクティブにする*/
       SetActiveWindow(hParentWnd);
       return;
   }

  ShowWindow(hwnd,SW_SHOW);           /*  ウインドウの表示        */
   UpdateWindow(hwnd);                 /*  ウインドウの最初の更新  */
<b>
  while(GetMessage(&msg;,NULL,0,0))    /*  メッセージループを持っていることに注意  */
   {
       TranslateMessage(&msg;);
       DispatchMessage(&msg;);
   }
</b>
  /*  ウインドウクラスの登録破棄  */
   UnregisterClass("ModalWindowClass",InstanceHandle);
   /*  ここで親ウインドウを使用可にする    */
   EnableWindow(hParentWnd,TRUE);
   /*  ここで親ウインドウをアクティブにする*/
   SetActiveWindow(hParentWnd);

  return;
}

/* モーダルなウインドウのウインドウクラスを登録する*/
static ATOM RegModalWindowClass(HINSTANCE hInstance)
{
  WNDCLASS        wc;             /*  ウインドウクラス登録用の構造体          */

  wc.style        =0;
   wc.lpfnWndProc  =ModalProc;
   wc.cbClsExtra   =0;                         /*  DEBUG   */
   wc.cbWndExtra   =0;
   wc.hInstance    =hInstance;
   wc.hIcon        =LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));
   wc.hCursor      =LoadCursor(NULL,IDC_ARROW);
   wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName =NULL;
   wc.lpszClassName="ModalWindowClass";
   
   return  RegisterClass(&wc;);     /*  ウインドウクラス登録    */
}

/* モーダルウインドウのウインドウプロシージャ */
LRESULT CALLBACK ModalProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
  switch(message)
   {
       case    WM_DESTROY:
           PostQuitMessage(0);
           return  0;
   }
   return  DefWindowProc(hwnd,message,wparam,lparam);
}
</pre>
</table>
<p>
 リスト22-2を見て、何か感じませんか?そうですよね。2章で扱った最もシンプルなアプリケーションと構造が非常によく似ていることです。<b><i><u>特に、モーダルウインドウは、独自のメッセージループを持っていることに注意してください</u></i></b>。それゆえ、CreateWindows関数の第8引数をNULLとする事で、モーダルウインドウは、親ウインドウを持たずに、単独で用いる事が出来ます。そして、<b><i><u>この事は、モーダルダイアログボックスでも当てはまります</u></i></b>。
<hr>
<p>
 次回は、モーダルダイアログボックスをメインウインドウとして用いて、VisualBASIC感覚でSDKプログラミングを楽しんでみましょう。
<p>
 では、お楽しみに。
<p align="RIGHT">
2001年4月10日<br>
修正2001年4月10日<br>
修正2001年4月11日<br>
<hr>
<p align="RIGHT">
<a href="/web/20150425235901/http://web.kyoto-inet.or.jp:80/people/ysskondo/index.html">目次</a><br>
<a href="chap23.html">次へ</a>
<hr>
<p align="RIGHT">
著作権者:近藤妥

</body>
</html>

  • 最終更新:2018-03-11 05:07:53

このWIKIを編集するにはパスワード入力が必要です

認証パスワード