27章 ダイアログボックスって何?

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"></meta>
<title>27章 ダイアログボックスって何?</title>
</head>

<body bgcolor="WHITE">
<font size="5">27章 ダイアログボックスって何?</font>
<hr>
<p>
 今回は、モーダルでもモードレスでも、リソースエディタを用いれば、VisualBASICの様に画面が作成でき、ウインドウクラスの登録無しに使えるダイアログボックスって何物なのか、理解してみようと思います。
<p>
 モーダルダイアログボックスもモードレスダイアログボックスも、ウインドウクラスの登録をしなくて良いという点で同じなので、ソースコードが小さくなるモーダルダイアログボックスをサンプルして、説明しようと思います。
<hr>
<p>
<b>
・結論
</b>
<p>
 どこから説明しようか迷ったのですが、結論から言ってしまいます。
<p>
 ダイアログボックスは、<b><u><i>OSによって定義されたウインドウクラスを持っている</i></u></b>、<b><u><i>ウインドウプロシージャはDefDlgProc関数である</i></u></b>、そして、<b><u><i>DefDlgProc関数がユーザー定義のダイアログプロシージャを呼び出す</i></u></b>。
<p>
 そして、CreateDialogBoxParam系関数でダイアログテンプレートをもとにダイアログボックスを作成した場合は、アプリケーションでメッセージループを共有しモードレスダイアログボックスになる。同様に、DialogBoxParam系関数でダイアログテンプレートをもとにダイアログボックスを作成した場合は、独自のメッセージループを持つ。
<hr>
<center>
<a href="chap27.lzh">ダウンロード</a><br>
</center>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト27-1
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 27章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */

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

/* メインウインドウとなるダイアログボックスのダイアログプロシージャのプロトタイプ宣言 */
extern BOOL CALLBACK MainWindowProc(HWND,UINT,WPARAM,LPARAM);

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
                 HINSTANCE    hPrevInstance,
                  LPSTR        CmdLine,
                  int          CmdShow)
{
  /*  ここでメインウインドウを開ける  */
   DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainWindowProc);
   return  0;
}

/* メインウインドウとなるダイアログボックスのダイアログプロシージャで用いられる関数の
                                                          プロトタイプ宣言    */

static BOOL Wm_CommandProc(HWND,WORD,WORD,HWND);
static BOOL Wm_CloseProc(HWND);

/* メインウインドウとなるダイアログボックスのダイアログプロシージャ */
BOOL CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
  switch(msg)
   {
       /*  コントロールに応答          */
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
       /*  終了ボタンに対応    */
       case    WM_CLOSE:
           Wm_CloseProc(hwnd);
           return  TRUE;
   }
   return  FALSE;
}

/* コントロールに応答する関数 */
static BOOL Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  if(wID==IDC_BUTTON1 &amp;&amp; wNotifyCode==BN_CLICKED)
   {   /*  クラス名を調べる    */
       char    classname[100];
       char    Display[200];
       <b>GetClassName(hwnd,classname,100)</b>;
       sprintf(Display,"このメインウインドウのクラス名は、%sです",classname);
       MessageBox(hwnd,Display,"クラス名",MB_OK|MB_ICONINFORMATION);
   }
   else if(wID==IDC_BUTTON2 &amp;&amp; wNotifyCode==BN_CLICKED)
   {   /*  クラスのウインドウプロシージャを調べる  */
       if(<b>GetWindowLong(hwnd,GWL_WNDPROC)==(LONG)DefDlgProc</b>)
           MessageBox(hwnd,"このメインウインドウのウインドウプロシージャはDefDlgProc()です",
                           "ウインドウプロシージャ名",MB_OK|MB_ICONINFORMATION);
       else
           MessageBox(hwnd,"このメインウインドウのウインドウプロシージャはDefDlgProc()ではありません",
                           "ウインドウプロシージャ名",MB_OK|MB_ICONINFORMATION);           
   }
   return  TRUE;
}

/* アプリケーションを閉じるときの確認の関数 */
static BOOL Wm_CloseProc(HWND hwnd)
{
  if(MessageBox(hwnd,"終了しますか?","警告",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
       EndDialog(hwnd,IDOK);

  return  TRUE;
}
</pre>
</table>
<p>
<b>
・GetClassName関数
</b>
<p>
 この関数は、ウインドウのクラス名を取得する関数です。<br>
 第一引数は、名前を知りたいウインドウのハンドル。第二引数は、ウインドウクラスの名前を受け取るバッファーへのポインタ。第三引数は、第二引数のバッファーの大きさです。<br>
 ダイアログボックスでは、使えそうに無いように思いますが、きちんと使えます。
<p>
<b>
・GetWindowLong関数
</b>
<p>
 この関数は、ウインドウの情報を取得する関数です。<br>
 第一引数は、情報を知りたいウインドウのハンドル。第二引数は、知りたい情報です。数種類の情報を取得できます。そして、GWL_WNDPROCを指定する事で、ウインドウプロシージャのアドレスを32ビット値で取得できます。<br>
<p>
 <b>何が原因か分かりませんが、Windows95OSR2では、結論通り動作しません。WindowsNT4SP5では、結論通り動作します。</b>NT系WindowsはWIN32APIを完全にサポートしているので、この辺で動作の違いが出ているのかもしれません。
<hr>
<p>
 次回は、ダイアログボックスはウインドウクラスを持つ、そして、ウインドウプロシージャは、一種のDefDlgProc関数であるという性質を利用して、23章のサンプルを<b>クラスレベルでカスタマイズ</b>してみようと思います。
<p>
 では、お楽しみに。
<br>
<p align="RIGHT">
2002年7月17日<br>
修正2002年8月4日<br>
<hr>
<p align="RIGHT">
<a href="/web/20160726212418/http://web.kyoto-inet.or.jp:80/people/ysskondo/index.html">目次</a><br>
<hr>
<p align="RIGHT">
著作権者:近藤妥
</body>
</html>

  • 最終更新:2018-03-11 05:23:35

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

認証パスワード