总结几点VC中关于对话框小知识供大家参考。
一、对话框属性
1.Styles->Clip siblings:排除子窗口之间的相对区域,也就是说,当一个特定的窗口接收到绘图消息时,将所有重叠窗口排除在外,只重绘指定的子窗口。
Styles->Clip children:当在父窗口内绘图时,排除子窗口区域。
2.More Styles
System modal:系统模式对话框
Absolute align:坐标相对于屏幕原点
Set foreground:设置为前台窗口
No fail create:应用于Windows 95
No idle message:不发送空闲消息
Control:不使用标题栏的对话框
Center:在屏幕中心显示对话框
Center mouse:以鼠标坐标为对话框中心显示对话框
Local edit:指定编辑控件的正文将存储于应用程序的局部数据段中
3.Extended Styles
Tool Window:工具栏窗体
Client edge:对话框边框下凹
Static edge:对话框边框为实边框
Accept files:是否接受文件拖放
Control parent:用<Tab>键在窗口的子窗口间搜索
Context help:在窗口标题栏添加一个问号按钮
No parent notify:以这个风格创建的窗口在创建和销毁时,不向父窗口发送WM_PARENTNOTFY消息
WS_POPUP WS_OVERLAPPED WS_CHILD
重叠的窗口
一个重叠窗口是顶层窗口有一个标题栏,边框和客户区,它的目的是作为一个应用程序的主窗口。 它也可以有一个窗口菜单,最小化和最大化按钮和滚动条。 重叠的窗口作为主窗口使用通常包括所有这些组件。
通过CreateWindowEx函数中指定的WS_OVERLAPPED或WS_OVERLAPPEDWINDOW风格,一种应用程序创建一个重叠的窗口。 如果您使用WS_OVERLAPPED风格,窗口有一个标题栏和边框。 如果您使用WS_OVERLAPPEDWINDOW风格,窗口有一个标题栏,边框大小,窗口菜单,最小化和最大化按钮。
弹出窗口
弹出窗口是顶级窗口,并连接到桌面窗口的子窗口的列表。 应用程序通常使用对话框弹出窗口。 主要的区别弹出和重叠的窗口是弹出式窗口不需要有标题和重叠的窗口必须有标题。 当一个弹出窗口没有标题,它可以创建无边框。 弹出式窗口可能拥有其他顶级窗口或由其他顶级窗口或两者拥有。 所有弹出窗口都具有WS_CLIPSIBLINGS风格,即使是没有指定。 弹出窗口不能创建与CW_USEDEFAULT值无论是位置或窗口的大小。 弹出窗口,使用CW_USEDEFAULT会存在,但不会有任何大小或没有能力或两者兼而有之。 重叠的窗口通常是保留给应用程序的主窗口,而事实上,有时也被称为主窗口或框架窗口。 弹出窗口通常用于与用户在对话框的形式和消息框。
一个弹出窗口是一个特殊类型的重叠窗口的对话框,消息框使用,以及其他外部的应用程序的主窗口中出现的临时窗口。 标题栏的弹出式窗口选择,否则,弹出窗口作为窗口重叠的WS_OVERLAPPED风格相同。
您创建一个通过指定CreateWindowEx WS_POPUP风格的弹出窗口。 要包含一个标题栏,指定WS_CAPTION样式。 使用WS_POPUPWINDOW风格创建一个弹出窗口,具有边框和窗口菜单。 该WS_CAPTION样式必须结合WS_POPUPWINDOW风格使窗口菜单中可见。
子窗口
子窗口必须有一个父窗口,并只限于其母公司的客户区。 这是在子窗口和重叠和弹出窗口的主要区别。 子窗口家长可以顶层窗口或其他子窗口。 子窗口的位置,从他们的父窗口的左上角,而不是从上层作为屏幕的左侧是顶层窗口。 子窗口是夹在他们父母的客户区。 在一个对话框中的控件的子窗口,其母公司是对话框。 子窗口创建不能为任何位置或窗口的大小CW_USEDEFAULT值。 子窗口,使用CW_USEDEFAULT会存在,但不会有任何大小或位置或两者兼而有之。
有一个子窗口WS_CHILD样式,并只限于它的父窗口的客户区。 应用程序通常使用子窗口功能区划分成一个父窗口客户区。 您创建一个通过指定CreateWindowEx函数WS_CHILD样式的子窗口。
一个子窗口必须有一个父窗口。 父窗口可以是重叠的窗口,弹出一个窗口,甚至是另一个子窗口。 您指定的父窗口时调用CreateWindowEx。 如果您指定在CreateWindowEx WS_CHILD样式,但没有指定一个父窗口,系统不创建窗口。
一个孩子,但没有一个窗口客户区的其他功能,除非他们明确要求。 应用程序可以请求一个标题栏,窗口菜单,最小化和最大化按钮,边框,滚动窗花一个孩子,但一个子窗口不能有菜单。 如果应用程序指定一个菜单句柄,或者当它注册孩子的窗口类或创建子窗口,菜单句柄将被忽略。 如果没有指定边框样式,系统将创建一个无边框窗口。 应用程序可以使用无国界划分一个子窗口的父窗口的客户区的划分,同时保持对用户不可见。
二、对话框的创建与显示
1.模态对话框:
CDlg dlg;
dlg.DoModal();
CDialog::OnOK();//或CDialog::OnCancel()关闭模态对话框
2.非模态对话框
创建:
CDlg *dlg=new CDlg;
dlg->Create(IDD_DIALOG,this);
dlg->ShowWindow(SW_SHOW);
销毁:
若在一个非模态对话框中实现OnCancel方法,需在内部调用 DestroyWindow方法,
//不要调用基类的OnCancel方法,因为它调用EndDialog方法将使对话框不可见,但不销毁对话框。
delete this; //需要在对话框的OnNcDestroy方法中delete释放对象本身, 注意 DestroyWindow只销毁窗口,但不释放对象。。
三、遍历对话框中的控件
控件也是窗口,所有可以用CWnd类的方法操作控件,GetTopWindow方法可以获得第一个属于CWnd的子窗口,GetNextWindow方法返回窗口管理器中的下一个窗口。首先在对话框中添加几个控件,然后在主窗口的OnInitDialog中添加:
CWnd* pWnd = GetTopWindow();
while(pWnd != NULL)
{
int i = pWnd->GetDlgCtrlID();
CString str;
str.Format("ID是:%d",i);
pWnd->SetWindowText(str);
pWnd = pWnd->GetNextWindow();
}
四、消息处理函数共享
指多个连续ID的控件都发出相同的消息,使用ON_CONTROL_RANGE宏来实现,类向导不支持ON_CONTROL_RANGE宏,需手动添加:
afx_msg OnButtonClicked();
ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON3,OnButtonClicked).
然后在OnButtonClicked()中添加消息响应