在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。
模态对话框domodal
CTestDlg dlg;
dlg.DoModal();
- 非模态对话框create
CSon dlg;
dlg->Create(IDD_DIALOG2,this);
dlg->ShowWindow(SW_SHOW);
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{}
如果父窗口的指针是NULL,则对话框的父窗口是主应用程序窗口。
在构造函数的时候,传递的父窗口指针为空。模态对话框不用传递父指针,它堵住了程序的运行。
非模态对话框在create的时候可以传递父窗口的指针。不同的使用方法会产生不同的效果。定义指针,在堆上分配内存。
堆上分配的内存,与程序的整个生命周期是一致的。CDialog的ONOK()函数,调用EndDialog函数,这个函数用于终止模态对话框。对于非模态对话框,这个函数只是使非模态对话框不可见,并不销毁它。
所以,非模态对话框ONOK时必须重写,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框的工作。ONCANCEL也是一样的。动态创建按钮
CWnd对象都有一个成员变量:m_hWnd,用来保存与窗口对象相关联的窗口句柄。如果窗口对象没有与任何一个窗口相关联,这个句柄就为NULL。静态文本控件在默认状态下是不发送通告消息的。
为了能够相应通告消息:
1、添加消息响应函数。
2、notify打钩。GetDialogItem()返回值为CWnd类型的指针
GetDialogItemText()将GetDialogItem()和GetWindowText()结合起来。
DDX_为前缀的函数,这些函数分别用于不同控件的数据交换。
Dialog Data ExchangeDDV_为前缀的函数,这些函数用于数据校验。
对话框伸缩功能的实现。
UpdateData TRUE的时候,变量获取对话框的数据。FALSE的时候,对话框赋值。
static CRect rectLarge;
static CRect rectSmall;
if(rectLarge.IsRectNull())
{
CRect rectSeparator;
GetWindowRect(&rectLarge);
GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);
rectSmall.left=rectLarge.left;
rectSmall.top=rectLarge.top;
rectSmall.right=rectLarge.right;
rectSmall.bottom=rectSeparator.bottom;
}
静态变量。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋初值空字符。
SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),
SWP_NOMOVE | SWP_NOZORDER);
SWP_NOMOVE 忽略x和y参数
SWP_NOZORDER 忽略pWndInsertAfter参数。
- 窗口的Z次序。假想轴,从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其他的窗口。
兄弟窗口,共享同一个父窗口的多个子窗口叫兄弟窗口。
系统管理3个独立的Z次序。
顶层窗口
兄弟窗口
最顶层窗口
活动窗口是应用程序的顶层窗口。只有一个顶层窗口是活动窗口。
主窗口的建立代表应用程序的开始。
逃跑按钮的实现
属性表单和向导的创建
CAboutDlg,派生于CDialog类。显示关于对话框。
CTestApp,派生于CWinApp类,派生于CWinThread类。它的对象代表了应用程序本身。
属性表单,解决了无法在一个对话框中显示的问题。
属性页:MFC类是 CPropertyPage
CPropertyPage
添加了三个继承于CPropertyPage的类。CPROP1,CPROP2,CPROP3
CPropertyPage派生于CDialog,CDialog派生于CWnd
CPropertySheet派生于CWnd,也可以用domodal
向导的创建
第一个radio的group设置为TRUE。
第一个radio添加变量。m_occupation
-1没有选中任何东西
0选中第一个
1选中第二个
WM_CHAR和WM_KEYDOWN这两个消息被对话框上的控件截获了,不能到达这两个消息响应函数。
删掉对话框上的控件时,可以截获WM_KEYDOWN消息。
但是依然不能获得WM_CHAR消息
必须重载PreTranslateMessage这个函数才能实现。