孙鑫VC++视频学习笔记之7: 对话框编程(2)

时间:2022-05-14 21:12:50

转自: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);//给变量值赋赋控件