ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:483.29KB ,
资源ID:9324988      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9324988.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC学习笔记之属性页与属性表单.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC学习笔记之属性页与属性表单.docx

1、MFC学习笔记之属性页与属性表单属性页和属性表单在程序中应用很广,一般在安装程序或者一些设置向导中的都是属性表单,这一次在看完孙鑫老师的书后总结一下一些关于属性表单和属性页的一些基本的操作。源码下载要创建属性表单首先就要先创建属性页,属性页对应的MFC类就是 CPropertyPage类,它是从CDialog类中派生而来的,所以属性页也是一个对话框。这次的程序要创建三个属性页,首先要添加三个属性页资源,可以直接添加三个IDD_PROPPAGE_LARGE的对话框资源,当然也可以直接添加一般的对话框资源,然后在它的属性设置中设置为满足属性页的,至于什么属性才是属性页对话框的属性,大家可以自己创建

2、一个属性页资源和一个一般对话框资源然后比较一个,本程序是直接创建三个属性页资源,下面是最终的三个属性页的效果:要注意的是属性页资源默认的是英语,所以要在属性中将语言改为简体中文,不然就会出现乱码了。还有就是在第一个属性页的的list Box和第三个属性页的Combo Box中,在他们的属性中都有一个排序的属性,默认情况下是选中的,这种情况下你添加进去的内容的顺序和最后显示出来的顺序一般是不一样的,所以这次的程序是不要排序的,要把那个勾去掉。为了创建属性表单,首先就要创建一个CPropertySheet 对象,然后在这个对象中添加三个属性页的对象(CPropertyPage 类型),然后调用Ad

3、dPage函数添加每一个属性页,最后调用DoModal函数创建一个模态属性表单,或者是Create函数创建一个非模态属性表单。要创建CpropertySheet对象,当然首先是要添加一个派生于CPropertySheet类的子类,在这里命名为CPropSheet. 下面是AddPage函数的原型:void AddPage( CPropertyPage *pPage);参数是一个属性页的指针,所以在CPropSheet类中添加了三个属性页的对象后,就可以在属性表单的构造函数中进行属性页的添加了,发现CpropSheet类有两个构造函数view plain1. CPropSheet:CPropSh

4、eet(UINTnIDCaption,CWnd*pParentWnd,UINTiSelectPage)2. :CPropertySheet(nIDCaption,pParentWnd,iSelectPage)3. 4. /voidAddPage(CPropertyPage*pPage);5. AddPage(&m_prop1);6. AddPage(&m_prop2);7. AddPage(&m_prop3);8. 9. 10. CPropSheet:CPropSheet(LPCTSTRpszCaption,CWnd*pParentWnd,UINTiSelectPage)11. :CPrope

5、rtySheet(pszCaption,pParentWnd,iSelectPage)12. 13. AddPage(&m_prop1);14. AddPage(&m_prop2);15. AddPage(&m_prop3);16. 这两个构造函数对应的父类的构造函数只有第一个参数不一样,下面是类CPropertySheet的两个构造函数:CPropertySheet( UINTnIDCaption, CWnd *pParentWnd= NULL, UINTiSelectPage= 0 );CPropertySheet( LPCTSTRpszCaption, CWnd *pParentWnd=

6、 NULL, UINTiSelectPage= 0 );当然还有一个是没参数的构造函数,那个不鸟先,在这两个构造函数里面后面两个参数是一样的没而且都有设默认值。第二个参数设为空,也就是说属性表单的父窗口就是应用程序的主窗口,第三个函数是指定属性表单初始选择的属性页,默认是第一个页面,我们可以修改这个来改变属性表单第一页的显示。CPropertySheet类是派生于CWnd类的,而不是CDialog类,但是CPropertySheet和CDialog类的操作是类似的。接下来在菜单项里添加一个新的菜单“属性表单”,通过它来显示属性表单。在属性表单正确创建后,我们希望把它创建成一个向导类型的对话框,

7、那么就要在调用DoModal函数之前先调用SetWizardMode函数,这样出现的效果就会是上一步,下一步这样的向导型的按钮了。这时候这些按钮的设置是不正确的,第一页的上一步按钮应该是不可以活动的,最后一个也应该是完成按钮而不是下一步,要设置向导按钮的显示,需要调用SetWizardButtons函数,要在哪里调用呢。在属性页资源里我们并没有看到这些按钮,所以这些按钮是属于属性表单的,所以要在属性表单类里去调用这个函数。一般情况下,应该在属性页的OnSetActive函数里面去调用设置向导按钮的函数,当属性页被选中的时,成为一个活动页面,应用程序框架就会调用OnSetActive函数。这个函

8、数是一个虚函数,因此应该在属性页子类中重写这个函数,然后再设置该属性页上面的向导按钮。下面是三个属性页的OnSetActive函数的代码:view plain1. BOOLCProp1:OnSetActive()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. (CPropSheet*)GetParent()-SetWizardButtons(PSWIZB_NEXT);5. returnCPropertyPage:OnSetActive();6. view plain1. BOOLCProp2:OnSetActive(

9、)2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. (CPropSheet*)GetParent()-SetWizardButtons(PSWIZB_NEXT|PSWIZB_BACK);5. returnCPropertyPage:OnSetActive();6. view plain1. BOOLCProp3:OnSetActive()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. (CPropSheet*)GetParent()-SetW

10、izardButtons(PSWIZB_BACK|PSWIZB_FINISH);5. returnCPropertyPage:OnSetActive();6. 这样三个属性页的向导按钮的显示就符合操作习惯了,新的问题出来了,现在我们要让操作者有了选择以后才可以进入下一个页面,我们一个一个页面来操作:处理第一个页面:先要为单选框添加关联变量,我们在MFC 的Class Wizard 的Member Variable里面找不到单选按钮的ID,这是因为我们这三个单选按钮是在一个组框里面的,所以要把第一个单选按钮的Ground属性勾上,这样就可以在Member Variable里面找到第一个单选框的I

11、D了。变量命名为m_occupation,在CProp1的构造函数里,这个变量被初始化为-1,就是没有一个单选按钮被选中,第一个被选中的话,该值就是0,以此类推。接下来要为list Box添加可以选择的工作地点,要在List Box中添加串的话,一般是在WM_INITDIALOG的响应函数中进行添加。下面是添加工作地点的函数代码:view plain1. BOOLCProp1:OnInitDialog()2. 3. CPropertyPage:OnInitDialog();4. 5. /TODO:Addextrainitializationhere6. (CListBox*)GetDlgIte

12、m(IDC_LIST1)-AddString(广州);7. (CListBox*)GetDlgItem(IDC_LIST1)-AddString(汕头);8. (CListBox*)GetDlgItem(IDC_LIST1)-AddString(上海);9. (CListBox*)GetDlgItem(IDC_LIST1)-AddString(北京);10. (CListBox*)GetDlgItem(IDC_LIST1)-AddString(杭州);11. (CListBox*)GetDlgItem(IDC_LIST1)-AddString(天津);12. returnTRUE;/retur

13、nTRUEunlessyousetthefocustoacontrol13. /EXCEPTION:OCXPropertyPagesshouldreturnFALSE14. AddString函数是CListBox类的成员函数,所以获得该控件的指针后要进行强制转换后才可以掉用。现在第一个页面已经初始化完毕了,接下来就是要在操作者按下 下一步 按钮的时候判断作者是否两个都选择了,要怎么判断呢?在MFC中,当用户单击下一步按钮后,程序会自动调用OnWizardNext这个虚函数,如果这个函数返回0,那么就会进入下一个属性页,如果返回-1,就会禁止属性页的变更。因此,我们可以在CProp1中添加这个

14、函数进行判断,下面是这个函数的代码:view plain1. LRESULTCProp1:OnWizardNext()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. UpdateData();5. 6. if(m_occupation=-1)7. 8. MessageBox(请选择你的职业!);9. return-1;10. 11. 12. if(m_workAddrs=)13. 14. MessageBox(请选择你的工作地点!);15. return-1;16. 17. 18. returnCPropertyPa

15、ge:OnWizardNext();19. 其中m_workAddrs是List Box 控件的关联变量。CString 类型。在上面的函数中,UpdateData()这个函数很重要,如果忘记添加的话,那么控件的关联变量的值就不会更新,那样就算你都按要求选择了,也是进步了第二个页面的。处理第二个页面:第二个页面是六个复选框,为每一个复选框关联一个变量,这里就用6个BOOL类型(只有这个类型的选择而已)的变量来关联,命名就是m_+运动项目的英文。例如:m_tennis,m_football等。可以看到在CProp2的构造函数里,他们都被初始化为FALSE;在CProp2中类似Cprop1那样添加

16、OnWizardNext函数view plain1. LRESULTCProp2:OnWizardNext()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. UpdateData();5. 6. if(m_basketball|m_football|m_tabletennis|m_tennis|m_badminton|m_volleyball)7. returnCPropertyPage:OnWizardNext();8. else9. 10. MessageBox(请选择你的兴趣爱好!);11. return-1;

17、12. 13. 处理第三个页面:第三个页面是一个组合框由一个编辑框和一个列表框组成,对应的是MFC的CCombo Box类,该类也有AddString函数,用来向组合框中添加字符串选项。因此在CProp3的OnInitDialog中初始化。另外我们还希望在第三个属性页初始化显示的时候,在组合框中一个初始选择的项,这个可以通过组合框的一个函数:SetCulSel来实现,该函数的功能是选择组合框的列表框的一个字符串,并将其显示在该组合框的编辑框中。int SetCurSel( intnSelect);该函数的参数nSelect,是一个基于0的索引,指定选择项的索引位置。如果设为-1,那么将移除该组

18、合框的当前选择,并清空组合框的编辑框中的内容。view plain1. BOOLCProp3:OnInitDialog()2. 3. CPropertyPage:OnInitDialog();4. 5. /TODO:Addextrainitializationhere6. (CComboBox*)GetDlgItem(IDC_COMBO1)-AddString(1000元以下);7. (CComboBox*)GetDlgItem(IDC_COMBO1)-AddString(1000元-2000元);8. (CComboBox*)GetDlgItem(IDC_COMBO1)-AddString(

19、2000元-3000元);9. (CComboBox*)GetDlgItem(IDC_COMBO1)-AddString(3000元-4000元);10. (CComboBox*)GetDlgItem(IDC_COMBO1)-AddString(4000元以上);11. 12. (CComboBox*)GetDlgItem(IDC_COMBO1)-SetCurSel(0);13. returnTRUE;/returnTRUEunlessyousetthefocustoacontrol14. /EXCEPTION:OCXPropertyPagesshouldreturnFALSE15. 到这一步

20、,属性表单中的所有控件都已经设置完毕了,这个也是可以用的了。我们现在希望当用户选好按下完成后,可以在窗口中输出他的选择。像响应下一步按钮的OnWinzardNext一样,相应完成按钮的函数是 OnWizardFinish 。先要保存用户的选择,用一个CString变量 m_strSalary来保存。view plain1. BOOLCProp3:OnWizardFinish()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. 5. intindex;6. index=(CComboBox*)GetDlgItem(IDC

21、_COMBO1)-GetCurSel();7. (CComboBox*)GetDlgItem(IDC_COMBO1)-GetLBText(index,m_strSalary);8. 9. returnCPropertyPage:OnWizardFinish();10. 其中函数GetCulSel是返回用户选择的索引,用那个作为函数GetLBText的参数就可以保存用户的选择了。void GetLBText( intnIndex, CString&rString) const;第一个参数就是索引值,第二个是用来装载的变量。接下来为了可以在窗口中显示用户得选择,需要定义变量来保存用户在每一页中的选

22、择。定义的变量和初始值如下:view plain1. CStringm_strSalary;2. BOOLm_bLike6;3. CStringm_strWorkAddr;4. intm_iOccupation;view plain1. CPropView:CPropView()2. 3. /TODO:addconstructioncodehere4. m_iOccupation=-1;5. m_strWorkAddr=;6. memset(m_bLike,0,sizeof(m_bLike);7. m_strSalary=;8. 这里要再说一个重点的东西,一般情况下,CPropertyShee

23、t类的DoModal函数返回的是IDOK或者是IDCANCEL。但是如果属性表单已经被创建为向导了,那么该函数的返回值就是ID_WIZFINISH或者ID_CANCEL。因此要在VIEW中对DoModal的返回值进行判断。还要注意,当DoModal函数返回后,属性表单窗口就被摧毁了,但是propSheet这个属性表单对象的生命期还没有结束。因此,仍然可以利用这个对象去访问它的内部成员。view plain1. voidCPropView:OnPropertysheet()2. 3. /TODO:Addyourcommandhandlercodehere4. CPropSheetpropshee

24、t(属性表单);5. /设置向导对话框6. propsheet.SetWizardMode();7. if(ID_WIZFINISH=propsheet.DoModal()8. 9. m_iOccupation=propsheet.m_prop1.m_occupation;10. m_strWorkAddr=propsheet.m_prop1.m_workAddrs;11. m_bLike0=propsheet.m_prop2.m_tennis;12. m_bLike1=propsheet.m_prop2.m_badminton;13. m_bLike2=propsheet.m_prop2.m

25、_tabletennis;14. m_bLike3=propsheet.m_prop2.m_football;15. m_bLike4=propsheet.m_prop2.m_basketball;16. m_bLike5=propsheet.m_prop2.m_volleyball;17. m_strSalary=propsheet.m_prop3.m_strSalary;18. /让视图窗口无效,从而引起窗口重绘19. Invalidate();20. 21. 在函数后面那个Invaliddate()函数调用后,窗口就会发生重绘,这样就可以在OnDraw函数中进行输出了。下面是OnDraw

26、函数的代码:view plain1. voidCPropView:OnDraw(CDC*pDC)2. 3. CPropDoc*pDoc=GetDocument();4. ASSERT_VALID(pDoc);5. /TODO:adddrawcodefornativedatahere6. CFontfont;7. font.CreatePointFont(300,宋体);8. 9. CFont*pOldFont;10. pOldFont=pDC-SelectObject(&font);11. 12. pDC-SetTextColor(RGB(44,23,111);13. CStringstrte

27、mp;14. strtemp=你的职业:;15. 16. switch(m_iOccupation)17. 18. case0:19. strtemp+=程序员;20. break;21. case1:22. strtemp+=系统工程师;23. break;24. case2:25. strtemp+=项目经理;26. break;27. default:28. break;29. 30. pDC-TextOut(0,0,strtemp);31. 32. strtemp=你的工作地点:;33. strtemp+=m_strWorkAddr;34. 35. TEXTMETRICtm;36. pDC-GetTextMetrics(&tm);37. 38. pDC-Text

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1