天天看点

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

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