核心是对话框上的按钮捕获WM_MOUSEMOVE,而不是让对话框来捕获这个消息,因为如果对话框捕获的话,当指针移动到窗口上就触发了。
1. 创建一个CTestButton类,派生于CButton。
2. 在Dialog上的两个按钮在创建变量(m_btn1,m_btn2)的时候让他们的类型选用TestButton类。
3. 为CTestButton类创建一个成员指针变量,CTestButton* m_pBtn。用来保存当前button对象所对应的另一个button对象的地址。
4. 在Dialog类的OnInitDialog方法中添加:
m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn=&m_btn1;
5. 为CTestButton类创建On_MouseMove的消息响应函数。
6. 在其中添加如下代码:
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
CButton::OnMouseMove(nFlags, point);
2. 属性与向导对话框:
Insert->Resource->Dialog->IDD_PROPPAGE_LARGE/MEDIUM/SMALL
手动添加三个属性页对话框prop1,prop1,prop3
CPropertySheet sheet("page sample"); //创建属性表单。
CProp1 prop1; //在使用类中将之声明为成员变量
CProp2 prop2;
CProp3 prop3;
sheet.AddPage(&prop1);
sheet.AddPage(&prop2);
sheet.AddPage(&prop3);
sheet.DoModal();//模态显示属性设置对话框
sheet.Create(); //非模态显示属性对话框
sheet.SetWizardMode(); //设置向导模式
在向导模式下,对于第一个属性页应该没有上一页这个按钮,对于最后一个属性页应该没有下一页按钮,而是完成按钮。在每个属性页(CProp)类中的OnSetActive函数中使用SetWizardButtons方法,添加如下代码:
//因为上下页按钮属于属性表单窗口,是属性页窗口的父窗口,所以调用GetParent方法
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT); //第一页
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT); //第二页
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH); //最后一页
在向导模式下,在点击上下页和完成的按钮时,应该对属性页的当前页上的内容进行检测,如果检测不通过,则不能进入下一页。那么检测的代码应该放在OnWizardNext(非结束页)或OnWizardFinish(结束页)方法中。(还有一个是OnWizardBack),这些函数都是虚函数,而不消息响应函数。