Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

Windows编程学习笔记(十三)

第九章 对话框

模态对话框 

     对话框有两类,一中是【模态】一中是【非模态】,模态对话框是指当我们结束这个对话框时,才能对同一个程序中的另一个对话框进行交互,不过这时我们可以切换到其他程序。而非模态对话框则不具有这种性质。

    当我们建立一个对话框后,会生成一个建立的模板,比如:

ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100

STYLE DS_MODALFRAME
| WS_POPUP

FONT
8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON
"OK",IDOK,66,80,50,14

ICON
"ABOUT1",IDC_STATIC,7,7,21,20

CTEXT
"About1",IDC_STATIC,40,12,100,8

CTEXT
"About Box Demo Program",IDC_STATIC,7,40,166,8

CTEXT
"(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8

END

·其中DIALOG DISCARDABLE 是关键字,后四个数字是对话框的位置和大小,位置是相对于父窗口显示的。

·然后是STYLE

·FONT 字体

      当然这些东西我们也可以在对话框属性里面调整。

如果我们想在对话框中用我们自定义的控件,比如一个椭圆形的OK按钮,我们可以使用一个子窗口来实现:

·先在main函数里注册一个类,”ok_button”

·然后我们就可以在上述的模板中,添加一个控件:”ok_button”,可以写成如下形式:

CONTROL   "OK",IDOK,"ok_button",WS_GROUP | WS_TABSTOP,73,79,32,14

·这样,我们就可以在dialog中创建一个自定义的按钮了

 

对话框的处理程序

BOOL CALLBACK DialogProc(HWND , UINT , WPARAM , LPARAM );

对话框的处理程序和窗口消息处理程序的区别:

·窗口消息处理程序WndProc返回LRESULT,而DialogProc返回BOOL

·如过WndProc不处理这个消息,那么将会呼叫DefWindowProc,而DialogProc如果不处理传回FALSE

·对话框程序不需要处理WM_PAINT 或 WM_DESTROY消息,对话框程序不接受WM_REATE消息,而是哎WM_INITDIALOG消息处理期间对对话框进行初始化工作。

激活对话框

    如果我们显示叫一个定义好的对话框,我们可以这样做:

DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);

    即使程序在显示对话框时,WndProc也可以接收消息。我们可以从对话框程序内部给WndProc发送消息:

SendMessage(GetParent(hDlg), …);

    当我们需要控制对话框的控件时,我们可以使用函数来通过对话框句柄和控件ID来获得控件的句柄:

GetDlgItem(hDlg,ID);       

非模态对话框

   非模态对话框可以让我们在同一个程序中在不同的对话框中切换。模态对话框是用DialogBox来创建的,而非模态对话框则是用CreateDialog来建立的。

   非模态对话框与模态对话框有几点区别:

·非模态对话框通常包含一个标题列和系统菜单按钮。

·非模态对话框消息要通过程序式的消息队列,要将这些消息传送给对话框消息窗口处理程序,则必须改变消息队列。

·非模态对话框使用DestroyWindow而不是EndDialog来结束非模态对话框。(如果使用了Close按钮来结束对话框,我们必须处理WM_CLOSE消息,windows内的对话框窗口消息处理程序并不处理WM_CLOSE消息。

 

while(GetMessage(&msg,NULL,0,0))
{
if(hDlgModeless == 0 || !IsDialogMessage(hDlgModeless,&msg))
  {
   TranslateMessage(
&msg);
   DispatchMessage(
&msg);
  }
}

    如果消息是发给对话框的,那么IsDialogMessage将它发送给对话框消息处理程序,并传回TRUE。只有hDlgMedeless为0或者消息不是该对话框消息时,才必须呼叫TranslateMessage函数。

 

posted on 2010-02-05 23:41  Lvpengms  阅读(556)  评论(0编辑  收藏  举报