【转】第七章 对话框编程(2)

阅读本文前,我们假设您已经:
      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;

6CWeiXinBtn::OnMouseMove中添加交换显示的语句

ShowWindow(SW_HIDE);

       m_pBtn->ShowWindow(SW_SHOW);

大功告成!

当然可以SetWindowPos函数实现更客观

二、           属性页的编辑

1CPropertyPage

 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,"下一步"之前,检查是否已完成“选择”等

 PropertyPageOnWizardNext函数中检查

5,编辑对话框/属性页上的ComBox控件

 ((CComoBox *)GetDlgItmem(IDC_ComBOX1))->AddString(" ");//增加选项

6,获取ListComBox)控件,并进行编辑

 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属性选中/不选中,表示是否自动排序,注意有时不需要自己排序

下面讲述一个属性页对话框的使用例程。

1VC++经常问题。

不能为已建好的类打开文件

VC中为资源(对话框、属性页等)添加类时,打开classwizard=>添加类,输入类名,选择baseclass,点OK之后,弹出不能打开文件的错误"Unable to open the file(XXX.h,XXX.cpp) for class xxx"

解决办法:删除类信息文件XXX.clw;再次调用classwizard,重新产生一个xxx.clw即可

2,属性页资源的增加

         Resource ViewDialog处点击右键InsertèDialogèIDD_PROPPAGE_LARGE(English(U.S.))

         注意看属性页资源的属性:类型-ChildBorder-ThinSystem 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);//给变量值赋赋控件

    欢迎以任何形式转载本文,只要对您有用
    欢迎给我来信 webbery (at) sohu (dot) com (分别用@,.替换at,dot)

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)
    韦伯Blog: http://webbery.tianyablog.com
参考书目和网站: 
    (1)孙鑫VC++视频
    (2)1-6章主要参考: hbyufan的BLog
    (3)11-20章主要参考: songpeng的Blog

你可能感兴趣的:(MFC)