您的位置:首页 > 编程语言

Windows编程学习笔记(十三)

2010-02-05 23:41 337 查看
第九章对话框

模态对话框

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

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

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函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: