1.逃跑按钮的实现
(1)创建两个相同的按钮(交替隐藏)
(2)按钮窗口捕捉鼠标移动消息
1.创建一个从CButton类派生的新类CNewButton,然后将按钮控件和这种新类型的成员变量相关联,从而就把按钮控件和一个自定义的按钮窗口类关联起来
2.在CDialogDlg类的头文件中包含CNewButton类的头文件
3.让CNewButton类捕获鼠标移动的消息
4.在CNewButton * 中定义一个成员变量CNewButton * m_pBtn指向另一个按钮在CDialogDlg类的OnInitDialog函数的最后添加代码实现
m_btn1.m_pBtn = &m_btn2;
m_btn2.m_pBtn = &m_btn1;
5.在OnMouseMove中添加代码
ShowWindow(SW_HIDE);(隐藏按钮窗口(隐含this指针))
m_pBtn->ShowWindow(SW_SHOW);(显示另一按钮窗口)
(3)可以用SetWindowPos(设置窗口的位置和大小)设置按钮在屏幕上显示的新位置
2.属性表单和向导的创建
(1)一个属性表单由一个或多个属性页组成
1.创建属性页:对应的MFC类是CPropertyPage(CDialog类的派生类,一个属性页窗口其实就是一个对话框窗口),该类生成的对象代表了属性表单中一个单独的属性页
2.添加属性页资源(对话框资源的子选项)
3.设置属性页窗口
4.生成相应的属性页类(注意Dialog ID对应)
5.创建属性表单
(1)为了创建一个属性表单,首先需要创建一个CPropertySheet对象,接下来,在此对象中为每一个属性页创建一个对象(CPropertyPage类型),并调用AddPage函数添加每一个属性页,然后调用DoModal函数显示一个模态属性表单,或者调用Create函数创建一个非模态属性表单
(2)创建属性表单对象(添加新类 CPropSheet 基类为CPropertySheet)
(3)在属性表单对象的构造函数中添加属性页对象(注意包含头文件)
(4)在属性表单对象中(构造函数)添加属性页:CPropertySheet类AddPage
函数原型:void AddPage(CPropertyPage *pPage);//参数为属性页对象指针
(5)显示属性表单(CPropertySheet类是从CWnd类派生来的,而不是派生于CDialog类,但是CPropertySheet对象和CDialog对象的操纵方式是类似的)
(6)创建按钮,添加消息响应函数,函数体中定义CPropertySheet对象并显示
(7)将属性页资源的语言改为Chinese否则显示乱码(属性页资源默认选英语)
(2)向导的创建
1.创建一个向导类型的对话框,应该遵循创建一个标准属性表单的步骤来实现,但在调用属性表单对象的DoModal函数之前,应该先调用SetWizardMode这一函数。
2.修改按钮:CPropertySheet类提供的SetWizardButton成员函数
函数原型:void SetWizardButton(DWORD dwFlags);// dwFlags有一些预定义的值
3.一般来说,应该在属性页的OnSetActive函数中调用SetWizardButton这个函数,当属性页被选中,成为一个活动的页面时,应用程序就会调用ONSetActive这个函数,它时一个虚函数,需要我们重写,然后根据需要设置该属性页上的按钮
4.在属性页类中重写OnSetActive函数,其中要调用属性表单的SetWizardButton函数,可以用GetParent函数获取属性页父窗口属性表单的指针(该函数返回的是一个CWnd类型的指针,要强制转换为CPropertySheet类型的指针,然后利用该指针调用函数)
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
(3)处理第一个页面
1.对每个页面做判断,如果没有选择,则禁止进入下一个页面
2.对一组单选按钮来说,需要设置该组中第一个单选按钮的Group属性(随后的两个按钮和这个按钮就成为同一组了)
3.为页面上的单选按钮关联一个成员变量,并在构造函数中初始化为-1,选中第一个单选按钮该变量值为0,选中第二个1,第三个2,这样就可以知道哪个被选中
4.当用户单击属性页上的【下一步】按钮后,程序将调用OnWizardNext这个虚函数,如果函数返回0,那么程序自动进入当前向导下一个属性页。如果返回-1,将禁止属性页发生变更,因此我们为CProp1类添加OnWizardNext这个虚函数的处理,在其中判断是否做出选择
5.在OnWizardNext函数中判断之前要先调用UpdateData函数(系统不会自动调用DoExchange函数,要用UpdateData函数调用)来从控件得到成员变量的值
6.在属性页显示之前向列表框中增加一些工作地点,因此,为CProp1类添加WM_INITDIALOG消息的响应函数OnInitDialog,在MFC中,对控件的操作都是通过相关的MFC类来完成的,列表框对应的MFC类:CListBox,该类提供了一个成员函数AddString,用于向列表框中添加字符串,因此,在OnInitDialog函数着那个,首先获得这个列表框控件,然后调用该对象的AddString函数完成工作地点的添加。
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(”北京”);
7.给列表框关联一个成员变量,和判断单选按钮是否选中一样,判断列表框是否选中。
(4)处理第二个页面
为四个复选框控件分别关联一个成员变量(BOOL型),对于复选框,若选中,它所关联的成员变量值为TRUE,否则为FAlSE(其余判断同上)
(5)处理第三个页面
1.组合框对应的MFC类为:CComboBox,该类也有一个成员函数:AddSrting,用于向组合框中的列表框中添加字符串选项
2.设置组合框编辑框中有一个初始选择的项,可以通过组合框的成员函数:SetCurSel来完成,该函数功能是选择组合框的列表框中的一个字符串,并将其显示
函数原型:int SetCurSel(int nSelect),参数是一个基于0的索引,指定选择项的索引位置,若为-1,则移出组合框的当前选择,并清空该组合框的编辑框的内容
(6)接受用户在向导中所做的选择
1.给CProp3类添加一个虚函数:OnWizardFinish,处理【完成】按钮的单击消息
2.为了获取用户选择的薪资选项,要先得到该选项的索引值,可以利用CComboBox类的GetCurSel成员函数实现,获得索引后,再利用CComboBox的GetLBText从组合框的列表框中指定位置处得到一个字符串
函数原型:void GetLBText(int nIndex,CString& rString) const;//第一个参数为索引位置
3. 在对话框程序中让对话框捕捉WM_KEYDOWN消息
一般情况下,对话框不会响应按键消息,是因为在对话框中,某些特定的消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理)或者被发送给了子控件进行处理,所以在对话框中就捕获不到按键的消息了,我们可以找到底层处理按键消息的函数,然后在子类中重写它,就能在对话框中处理按键消息了。
在MFC中,是利用BOOL ProcessMessageFilter(int code,LPMSG lpMsg)这个虚函数来过滤或响应菜单和对话框的特定Windows消息。