




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
属性页和属性表单在程序中应用很广,一般在安装程序或者一些设置向导中的都是属性表单,这一次在看完孙鑫老师的书后总结一下一些关于属性表单和属性页的一些基本的操作。源码下载要创建属性表单首先就要先创建属性页,属性页对应的MFC类就是 CPropertyPage类,它是从CDialog类中派生而来的,所以属性页也是一个对话框。这次的程序要创建三个属性页,首先要添加三个属性页资源,可以直接添加三个IDD_PROPPAGE_LARGE的对话框资源,当然也可以直接添加一般的对话框资源,然后在它的属性设置中设置为满足属性页的,至于什么属性才是属性页对话框的属性,大家可以自己创建一个属性页资源和一个一般对话框资源然后比较一个,本程序是直接创建三个属性页资源,下面是最终的三个属性页的效果:要注意的是属性页资源默认的是英语,所以要在属性中将语言改为简体中文,不然就会出现乱码了。还有就是在第一个属性页的的list Box和第三个属性页的Combo Box中,在他们的属性中都有一个排序的属性,默认情况下是选中的,这种情况下你添加进去的内容的顺序和最后显示出来的顺序一般是不一样的,所以这次的程序是不要排序的,要把那个勾去掉。为了创建属性表单,首先就要创建一个CPropertySheet 对象,然后在这个对象中添加三个属性页的对象(CPropertyPage 类型),然后调用AddPage函数添加每一个属性页,最后调用DoModal函数创建一个模态属性表单,或者是Create函数创建一个非模态属性表单。要创建CpropertySheet对象,当然首先是要添加一个派生于CPropertySheet类的子类,在这里命名为CPropSheet. 下面是AddPage函数的原型:void AddPage( CPropertyPage *pPage);参数是一个属性页的指针,所以在CPropSheet类中添加了三个属性页的对象后,就可以在属性表单的构造函数中进行属性页的添加了,发现CpropSheet类有两个构造函数view plain1. CPropSheet:CPropSheet(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. :CPropertySheet(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= NULL, UINTiSelectPage= 0 );当然还有一个是没参数的构造函数,那个不鸟先,在这两个构造函数里面后面两个参数是一样的没而且都有设默认值。第二个参数设为空,也就是说属性表单的父窗口就是应用程序的主窗口,第三个函数是指定属性表单初始选择的属性页,默认是第一个页面,我们可以修改这个来改变属性表单第一页的显示。CPropertySheet类是派生于CWnd类的,而不是CDialog类,但是CPropertySheet和CDialog类的操作是类似的。接下来在菜单项里添加一个新的菜单“属性表单”,通过它来显示属性表单。在属性表单正确创建后,我们希望把它创建成一个向导类型的对话框,那么就要在调用DoModal函数之前先调用SetWizardMode函数,这样出现的效果就会是上一步,下一步这样的向导型的按钮了。这时候这些按钮的设置是不正确的,第一页的上一步按钮应该是不可以活动的,最后一个也应该是完成按钮而不是下一步,要设置向导按钮的显示,需要调用SetWizardButtons函数,要在哪里调用呢。在属性页资源里我们并没有看到这些按钮,所以这些按钮是属于属性表单的,所以要在属性表单类里去调用这个函数。一般情况下,应该在属性页的OnSetActive函数里面去调用设置向导按钮的函数,当属性页被选中的时,成为一个活动页面,应用程序框架就会调用OnSetActive函数。这个函数是一个虚函数,因此应该在属性页子类中重写这个函数,然后再设置该属性页上面的向导按钮。下面是三个属性页的OnSetActive函数的代码:view plain1. BOOLCProp1:OnSetActive()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. (CPropSheet*)GetParent()-SetWizardButtons(PSWIZB_NEXT);5. returnCPropertyPage:OnSetActive();6. view plain1. BOOLCProp2:OnSetActive()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()-SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);5. returnCPropertyPage:OnSetActive();6. 这样三个属性页的向导按钮的显示就符合操作习惯了,新的问题出来了,现在我们要让操作者有了选择以后才可以进入下一个页面,我们一个一个页面来操作:处理第一个页面:先要为单选框添加关联变量,我们在MFC 的Class Wizard 的Member Variable里面找不到单选按钮的ID,这是因为我们这三个单选按钮是在一个组框里面的,所以要把第一个单选按钮的Ground属性勾上,这样就可以在Member Variable里面找到第一个单选框的ID了。变量命名为m_occupation,在CProp1的构造函数里,这个变量被初始化为-1,就是没有一个单选按钮被选中,第一个被选中的话,该值就是0,以此类推。接下来要为list Box添加可以选择的工作地点,要在List Box中添加串的话,一般是在WM_INITDIALOG的响应函数中进行添加。下面是添加工作地点的函数代码:view plain1. BOOLCProp1:OnInitDialog()2. 3. CPropertyPage:OnInitDialog();4. 5. /TODO:Addextrainitializationhere6. (CListBox*)GetDlgItem(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;/returnTRUEunlessyousetthefocustoacontrol13. /EXCEPTION:OCXPropertyPagesshouldreturnFALSE14. AddString函数是CListBox类的成员函数,所以获得该控件的指针后要进行强制转换后才可以掉用。现在第一个页面已经初始化完毕了,接下来就是要在操作者按下 下一步 按钮的时候判断作者是否两个都选择了,要怎么判断呢?在MFC中,当用户单击下一步按钮后,程序会自动调用OnWizardNext这个虚函数,如果这个函数返回0,那么就会进入下一个属性页,如果返回-1,就会禁止属性页的变更。因此,我们可以在CProp1中添加这个函数进行判断,下面是这个函数的代码: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. returnCPropertyPage:OnWizardNext();19. 其中m_workAddrs是List Box 控件的关联变量。CString 类型。在上面的函数中,UpdateData()这个函数很重要,如果忘记添加的话,那么控件的关联变量的值就不会更新,那样就算你都按要求选择了,也是进步了第二个页面的。处理第二个页面:第二个页面是六个复选框,为每一个复选框关联一个变量,这里就用6个BOOL类型(只有这个类型的选择而已)的变量来关联,命名就是m_+运动项目的英文。例如:m_tennis,m_football等。可以看到在CProp2的构造函数里,他们都被初始化为FALSE;在CProp2中类似Cprop1那样添加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;12. 13. 处理第三个页面:第三个页面是一个组合框由一个编辑框和一个列表框组成,对应的是MFC的CCombo Box类,该类也有AddString函数,用来向组合框中添加字符串选项。因此在CProp3的OnInitDialog中初始化。另外我们还希望在第三个属性页初始化显示的时候,在组合框中一个初始选择的项,这个可以通过组合框的一个函数:SetCulSel来实现,该函数的功能是选择组合框的列表框的一个字符串,并将其显示在该组合框的编辑框中。int SetCurSel( intnSelect);该函数的参数nSelect,是一个基于0的索引,指定选择项的索引位置。如果设为-1,那么将移除该组合框的当前选择,并清空组合框的编辑框中的内容。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(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. 到这一步,属性表单中的所有控件都已经设置完毕了,这个也是可以用的了。我们现在希望当用户选好按下完成后,可以在窗口中输出他的选择。像响应下一步按钮的OnWinzardNext一样,相应完成按钮的函数是 OnWizardFinish 。先要保存用户的选择,用一个CString变量 m_strSalary来保存。view plain1. BOOLCProp3:OnWizardFinish()2. 3. /TODO:Addyourspecializedcodehereand/orcallthebaseclass4. 5. intindex;6. index=(CComboBox*)GetDlgItem(IDC_COMBO1)-GetCurSel();7. (CComboBox*)GetDlgItem(IDC_COMBO1)-GetLBText(index,m_strSalary);8. 9. returnCPropertyPage:OnWizardFinish();10. 其中函数GetCulSel是返回用户选择的索引,用那个作为函数GetLBText的参数就可以保存用户的选择了。void GetLBText( intnIndex, CString&rString) const;第一个参数就是索引值,第二个是用来装载的变量。接下来为了可以在窗口中显示用户得选择,需要定义变量来保存用户在每一页中的选择。定义的变量和初始值如下: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. 这里要再说一个重点的东西,一般情况下,CPropertySheet类的DoModal函数返回的是IDOK或者是IDCANCEL。但是如果属性表单已经被创建为向导了,那么该函数的返回值就是ID_WIZFINISH或者ID_CANCEL。因此要在VIEW中对DoModal的返回值进行判断。还要注意,当DoModal函数返回后,属性表单窗口就被摧毁了,但是propSheet这个属性表单对象的生命期还没有结束。因此,仍然可以利用这个对象去访问它的内部成员。view plain1. voidCPropView:OnPropertysheet()2. 3. /TODO:Addyourcommandhandlercodehere4. CPropSheetpropsheet(属性表单);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_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函数的代码: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(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化馆文化演出策划师招聘面试模拟题及答案
- 圆的认识教学设计与课件
- 2025年生物实验员面试模拟试卷本科院校及答案
- 2025年仓储管理师库存管理考试题
- 2025年电子商务推广专家考试试题及答案解析
- 2025年新能源汽车销售顾问考试题库
- 说礼貌语做文明事课件
- 机油培训知识课件
- 2025年喷漆安全操作测试题及答案集
- 清溪县急救知识培训课件
- 新媒体视听节目制作
- 数字化教学环境下小学语文板书设计优化策略
- JG/T 237-2008混凝土试模
- JG/T 232-2008卫浴型散热器
- 灭火员初级习题库
- T/CAQP 001-2017汽车零部件质量追溯体系规范
- 燃气入户可行性报告
- 技术赋能医疗创新-深入解析数字化口腔诊所建设指南
- 眼内炎护理疑难病例讨论
- 配送车辆消毒管理制度
- 理发店消防安全制度
评论
0/150
提交评论