一、逃跑按钮的巧妙实现。
1,添加按钮类CSeanBtn,基类为CButton;
2,在对话框上添加2个按钮IDC_BUTTON1,IDC_BUTTON2;
3,对两个按钮分别添加关联控件变量:
CSeanBtn m_btn1;//关联IDC_BUTTON1
CSeanBtn m_btn2;//关联IDC_BUTTON2
4,在CSeanBtn类中添加一个指向CSeanBtn类型的指针变量 m_pBtn(用于指向另一个按钮)
5,交换地址
m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn=&m_btn1;
6,对CSeanBtn类添加WM_MOUSEMOVE虚函数处理
CSeanBtn::OnMouseMove()
{
ShowWindow(SW_HIDE); //隐藏自己
m_pBtn->ShowWindow(SW_SHOW);//显示别人
}
二、制作属性表单 PropertySheet
1,插入属性页资源(在Dialog资源分类里)IDD_PROP1,IDD_PROP2,IDD_PROP3
2,分别为每个属性页资源添加一个类CProp1,CProp2,CProp3(基类为CPropertyPage);
3,添加一个属性表单类CSeanPropSheet(基类为CPropertySheet)
4,为CSeanPropSheet类添加成员变量
private:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;
5,将三个属性页成员添加到属性表单中,方法是:
在CSeanPropSheet类的两个重载函数中均添加以下代码:
CSeanPropSheet::CSeanPropSheet(....)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
至此,属性表单类设计完成
6,主程序显示属性表单
CSeanPropSheet propsheet;
propsheet.DoModal();//显示模态属性表单
//propsheet.Create(..);//显示非模态属性表单
propsheet.Detach();
三、制作向导 Wizard
1,制作方法与属性表单方法制作完全一样,只是在主程序调用DoModal之前需调用SetWizardMode成员函数.如:
CSeanPropSheet propsheet;
propsheet.setWizardMode();//设置表单为向导表单
propsheet.DoModal();
2,修改或取消向导中属性页的按钮(如取消第一页中的"上一步",更改最后页的"下一步"为"完成")
重写CProp1(或CProp2或CProp3)的虚函数OnSetActive,在此函数中调用CSeanPropSheet对象的 SetWizardButtons设置本属性页的按钮:
BOOL CProp1::OnSetActive()
{ //只设置"下一步"按钮
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp2::OnSetActive()
{ //设置"下一步"和"上一步"按钮
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnSetActive()
{ //设置"完成"和"上一步"按钮
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_FINISH | PSWIZB_DISABLEDFINISH | PSWIZB_BACK );
return CPropertyPage::OnSetActive();
}
3,对向导页上按钮的事件响应
重写CProp1(或CProp2或CProp3)类的虚函数OnWizardNext,OnWizardBack,OnWizardFinish分别响应用户点击"下一步","上一步","完成"按钮
4,向导最后一步用户点击的是取消还是完成?
根据DoModal()的返回值判断
if(ID_WIZFINISH==prop.DoModal())
{
//用户按下"完成"
}