转自:http://webbery.tianyablog.com
阅读本文前,我们假设您已经:
1,知道如何创建一个单文档的App Wizard
2,知道C++ 类、函数重载等简单知识
3,知道如何给View类或者Doc文档添加成员变量
4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试
5,知道如何为某个框架类添加虚函数或消息处理函数
一、 简单的逃跑按钮
//注意下列方法,定义一个类为了捕获鼠标移动点的方便
1,创建一个基于对话框的MFC AppWizard工程
2,在View窗口点右键,添加一个自定义的类(或者用Classwizard工具添加),基类为CButton
class CWeiXinBtn : public CButton
3,给CWeiXinBtn类添加成员变量CWeiXinBtn* m_pBtn;
4,给对话框添加俩按钮,每个按钮都关联一个CWeiXinBtn的变量
5,在OnInitDialog添加
m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn=&m_btn1;
6,CWeiXinBtn::OnMouseMove中添加交换显示的语句
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
大功告成!
当然可以SetWindowPos函数实现更客观
二、 属性页的编辑
1,CPropertyPage类
在sheet的构造函数中添加propertyPage
prop1sheet::AddPage 把页面添加到sheet
2,属性页变向导类型
prop1sheep.SetWindowMode();//向导模式语句
prop1sheet.DoModal();
3,第一页的"上一步",最后一页的"下一步"取消方法
在第一个/最后一页属性页类添加虚函数PnSetActive,并在其中添加
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_NEXT);//第一页
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);//中间的页
((CPropertySheet *)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);//最后一页
4,"下一步"之前,检查是否已完成“选择”等
在PropertyPage的OnWizardNext函数中检查
5,编辑对话框/属性页上的ComBox控件
((CComoBox *)GetDlgItmem(IDC_ComBOX1))->AddString(" ");//增加选项
6,获取List(ComBox)控件,并进行编辑
int sel=((CComoBox *)GetDlgItmem(IDC_ComBOX1))->GetCurSel();
CString m_str;
((CComoBox *)GetDlgItmem(IDC_ComBOX1))->GetLBText(sel,&m_str);//取出用户的选择
7,窗口IDOK==xxx.DoModal()后,其上面的控件生命期仍有效,所以可以用变量接受其值
8,List控件的sort属性选中/不选中,表示是否自动排序,注意有时不需要自己排序
下面讲述一个属性页对话框的使用例程。
1,VC++经常问题。
不能为已建好的类打开文件
在VC中为资源(对话框、属性页等)添加类时,打开classwizard=>添加类,输入类名,选择baseclass,点OK之后,弹出不能打开文件的错误"Unable to open the file(XXX.h,XXX.cpp) for class xxx"
解决办法:删除类信息文件XXX.clw;再次调用classwizard,重新产生一个xxx.clw即可
2,属性页资源的增加
在Resource View里Dialog处点击右键InsertèDialogèIDD_PROPPAGE_LARGE(English(U.S.))
注意看属性页资源的属性:类型-Child,Border-Thin,System menu不复选,More style中复选了Disabled
也可以通过修改普通对话框,而成为属性页。
3,创建类
给属性页对话框添加类的时候,基类选为CPropertyPage,而不是CDialog
4,创建属性表单
利用Classwizard插入一个新的类,基类选为CPropertySheet
5,给属性表单添加三个public变量
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;
6,在属性表单的两个构造函数增加表单
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
7,在View类添加一个菜单项,添加响应函数,添加下列语句
CPropSheet propSheet("维新属性表单程序");
//propSheet.SetWizardMode();//向导类时增加这一句
if(ID_WIZFINISH==propSheet.DoModal())
{
//获取各个表单项的选项,仅作为例子
m_iOccupation=propSheet.m_prop1.m_occupation;
m_strWorkAddr=propSheet.m_prop1.m_workAddr;
m_bLike[0]=propSheet.m_prop2.m_football;
m_strSalary=propSheet.m_prop3.m_strSalary;
Invalidate();
}
属性表单创建完毕。属性页具体内容的编辑和内容的显示过程省略
向导类的创建
1,在Domodal之前添加
propSheet.SetWizardMode();
2,设置最初/末页的“上一步”和“下一步”
在CProp1类处右键,加载需函数OnSetActive,并在CProp1::OnSetActive中添加
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
在CProp4::OnSetActive中添加
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
为每一页添加限制条件:只有在当页进行必要操作后,才能“下一步”
1, 为每个属性页添加虚函数DoDataExchange,其中不添加代码
2, 为最后一页添加虚函数OnWizardFinish,其他页添加OnWizardNext函数,并在其中添加“下一步”的判断条件
数据交换
UpdateData(TRUE);//从控件中取回值
UpdateData(FALSE);//给变量值赋赋控件