阅读本文前,我们假设您已经: 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);//给变量值赋赋控件 |
欢迎以任何形式转载本文,只要对您有用 |
韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载) 韦伯Blog: http://webbery.tianyablog.com |
参考书目和网站: |
(1)孙鑫VC++视频 |
(2)1-6章主要参考: hbyufan的BLog |
(3)11-20章主要参考: songpeng的Blog |