mfc窗口继承

65 篇文章 2 订阅

窗口的继承,子类窗口可以拥有父类窗口的一些属性、风格和方法等,将极大的简化代码量,本例将完成一个mfc窗口继承的实例:

1.新建一个基于对话框的dialog,作为父类窗口,本例名称TemplateDlg

TemplateDlg.h:


 
 
  1. // TemplateDlg.h : 头文件
  2. //
  3. #pragma once
  4. // CTemplateDlg 对话框
  5. class CTemplateDlg : public CDialog
  6. {
  7. // 构造
  8. public:
  9. //CTemplateDlg(CWnd* pParent = NULL); // 标准构造函数
  10. CTemplateDlg(UINT nIDTemplate,CWnd* pParent = NULL);
  11. //enum { IDD = IDD_TEMPLATE_DIALOG };
  12. protected:
  13. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  14. // 生成的消息映射函数
  15. DECLARE_MESSAGE_MAP()
  16. public:
  17. //afx_msg void OnPaint(); //原版OnPaint
  18. virtual afx_msg void OnPaint(); //virtual虚方法,留待method dialog重写
  19. void HelloWorld();
  20. };

TemplateDlg.cpp:


 
 
  1. // TemplateDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Template.h"
  5. #include "TemplateDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // CTemplateDlg 对话框
  10. /*
  11. 标准构造函数
  12. IDD_TEMPLATE_DIALOG:template dialog的控件资源id
  13. */
  14. //CTemplateDlg::CTemplateDlg(CWnd* pParent /*=NULL*/)
  15. // : CDialog(IDD_TEMPLATE_DIALOG,pParent)
  16. //{
  17. //
  18. //}
  19. /*
  20. 方便继承的构造函数
  21. nIDTemplate:子窗口的控件资源id
  22. */
  23. CTemplateDlg::CTemplateDlg(UINT nIDTemplate,CWnd* pParent /*=NULL*/)
  24. : CDialog(nIDTemplate,pParent)
  25. {
  26. }
  27. void CTemplateDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29. CDialog::DoDataExchange(pDX);
  30. }
  31. BEGIN_MESSAGE_MAP(CTemplateDlg, CDialog)
  32. //}}AFX_MSG_MAP
  33. ON_WM_PAINT()
  34. END_MESSAGE_MAP()
  35. // CTemplateDlg 消息处理程序
  36. void CTemplateDlg::OnPaint()
  37. {
  38. CRect rect;
  39. CPaintDC dc(this);
  40. GetClientRect(rect);
  41. dc.FillSolidRect(rect,RGB( 0, 255, 0)); //设置为绿色背景
  42. CDialog::OnPaint();
  43. }
  44. void CTemplateDlg::HelloWorld()
  45. {
  46. AfxMessageBox( L"Hello world!");
  47. }

2.新建一个基于TemplateDlg的对话框,名称MethodDlg:

MethodDlg.h:


  
  
  1. #pragma once
  2. #include "TemplateDlg.h" //引用模板窗口
  3. // CMethodDlg 对话框
  4. //class CMethodDlg : public CDialog
  5. class CMethodDlg : public CTemplateDlg //继承template
  6. {
  7. DECLARE_DYNAMIC(CMethodDlg)
  8. public:
  9. CMethodDlg(CWnd* pParent = NULL); // 标准构造函数
  10. // 对话框数据
  11. enum { IDD = IDD_METHODDLG };
  12. protected:
  13. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  14. DECLARE_MESSAGE_MAP()
  15. public:
  16. //没有在method dialog的消息映射中出现,但是可以重写template dialog的消息处理
  17. afx_msg void OnPaint();
  18. //添加一个属于method dialog自己的消息处理
  19. afx_msg void OnBnClickedButton1();
  20. };

MethodDlg.cpp:


  
  
  1. // MethodDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Template.h"
  5. #include "MethodDlg.h"
  6. // CMethodDlg 对话框
  7. IMPLEMENT_DYNAMIC( CMethodDlg, CDialog)
  8. //: CDialog(CMethodDlg::IDD, pParent)
  9. CMethodDlg:: CMethodDlg(CWnd* pParent /*=NULL*/)
  10. : CTemplateDlg( CMethodDlg::IDD,pParent) //继承template
  11. {
  12. }
  13. void CMethodDlg::DoDataExchange(CDataExchange* pDX)
  14. {
  15. //CDialog::DoDataExchange(pDX); //原继承CDialog
  16. CTemplateDlg::DoDataExchange(pDX); //继承template
  17. }
  18. //BEGIN_MESSAGE_MAP(CMethodDlg, CDialog) //原只处理method自己的消息映射
  19. BEGIN_MESSAGE_MAP( CMethodDlg, CTemplateDlg) //继承template dialog的所有消息映射
  20. ON_BN_CLICKED(IDC_BUTTON1, & CMethodDlg::OnBnClickedButton1) //method dialog自己的消息映射处理
  21. END_MESSAGE_MAP()
  22. // CMethodDlg 消息处理程序
  23. void CMethodDlg::OnPaint()
  24. {
  25. CRect rect;
  26. CPaintDC dc( this);
  27. GetClientRect(rect);
  28. dc.FillSolidRect(rect,RGB( 0, 0, 255)); //设置为蓝色背景
  29. CDialog::OnPaint();
  30. }
  31. void CMethodDlg::OnBnClickedButton1()
  32. {
  33. //调用父窗口中的方法
  34. CTemplateDlg::HelloWorld(); //this->HelloWorld();
  35. }

3.修改一下Template.cpp(本例项目名Template)

修改为启动我们的子类窗口MethodDlg:


   
   
  1. BOOL CTemplateApp::InitInstance()
  2. {
  3. // 如果一个运行在 Windows XP 上的应用程序清单指定要
  4. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  5. //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
  6. INITCOMMONCONTROLSEX InitCtrls;
  7. InitCtrls.dwSize = sizeof(InitCtrls);
  8. // 将它设置为包括所有要在应用程序中使用的
  9. // 公共控件类。
  10. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  11. InitCommonControlsEx(&InitCtrls);
  12. CWinApp::InitInstance();
  13. AfxEnableControlContainer();
  14. // 标准初始化
  15. // 如果未使用这些功能并希望减小
  16. // 最终可执行文件的大小,则应移除下列
  17. // 不需要的特定初始化例程
  18. // 更改用于存储设置的注册表项
  19. // TODO: 应适当修改该字符串,
  20. // 例如修改为公司或组织名
  21. SetRegistryKey(_T( "应用程序向导生成的本地应用程序"));
  22. //CTemplateDlg dlg;
  23. CMethodDlg dlg; //启动method dialog
  24. m_pMainWnd = &dlg;
  25. INT_PTR nResponse = dlg.DoModal();
  26. if (nResponse == IDOK)
  27. {
  28. // TODO: 在此放置处理何时用
  29. // “确定”来关闭对话框的代码
  30. }
  31. else if (nResponse == IDCANCEL)
  32. {
  33. // TODO: 在此放置处理何时用
  34. // “取消”来关闭对话框的代码
  35. }
  36. // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  37. // 而不是启动应用程序的消息泵。
  38. return FALSE;
  39. }


4.编译运行,效果如下:



本例启动的是子类窗口MethodDlg,但是他具有父类窗口TemplateDlg的风格(蓝色底色,无控件),因为加载自己的控件资源,所有显示了属于自己的控件(Button1),点击Button1,调用了属于父类窗口的方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值