本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明。

一、自定义一个空白控件

 1、先创建一个MFC工程

NEW Project-->MFC-->MFC Application-->name:  “CustomCtr”-->Application Type选择“Dialog based”。

 2、在窗口中添加一个自定义控件

Toolbox-->“Custom Control”-->属性-->class随便填写一个控件类名“CMyWin”, 这个名字用于以后注册控件用的,注册函数为RegisterWindowClass()。

3、创建一个类

在窗口中,右击custom control 控件-->ClassWizard-->ClassWizard-->Add Class-->类名CMyTest(以C开头)-->Base class:CWnd。

4、注册自定义控件MyWin

在MyTest类.h文件中声明注册函数BOOL   RegisterWindowClass(HINSTANCE hInstance = NULL)。

C++代码
  1. BOOL CMyTest::RegisterWindowClass(HINSTANCE hInstance)
  2. {
  3. LPCWSTR className = L"CMyWin";//"CMyWin"控件类的名字
  4. WNDCLASS windowclass;
  5. if(hInstance)
  6. hInstance = AfxGetInstanceHandle();
  7. if (!(::GetClassInfo(hInstance, className, &windowclass)))
  8. {
  9. windowclass.style = CS_DBLCLKS;
  10. windowclass.lpfnWndProc = ::DefWindowProc;
  11. windowclass.cbClsExtra = windowclass.cbWndExtra = 0;
  12. windowclass.hInstance = hInstance;
  13. windowclass.hIcon = NULL;
  14. windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
  15. windowclass.hbrBackground=\'#\'" >
  16. windowclass.lpszMenuName = NULL;
  17. windowclass.lpszClassName = className;
  18. if (!AfxRegisterClass(&windowclass))
  19. {
  20. AfxThrowResourceException();
  21. return FALSE;
  22. }
  23. }
  24. return TRUE;
  25. }

5、在MyTest类的构造器中调用 RegisterWindowClass()。

C++代码
  1. CMyTest::CMyTest()
  2. {
  3. RegisterWindowClass();
  4. }

 6、控件与对话框数据交换

在CustomCtrDlg.h中定义一个变量:

CMyTest    m_draw;

在对话框类的CustomCtrDlg.cpp的DoDataExchange函数中添加DDX_Control(pDX,IDC_CUSTOM1,m_draw)。

C++代码
  1. void CCustomCtrDlg::DoDataExchange(CDataExchange* pDX)
  2. {
  3. CDialogEx::DoDataExchange(pDX);
  4. DDX_Control(pDX,IDC_CUSTOM1,m_draw);
  5. }

以上是自定义一个空白控件。
 
       二、在控件上绘图

1、在CMyTest类中添加一个绘图消息

在VS2010最左侧Class View中右击CMyTest类-->ClassWizard-->Messages-->WM_PAINT-->双击,开发环境自动添加OnPaint()函数及消息队列。

 2、编写OnPaint()函数

例如:画一条直线

C++代码
  1. void CMykk::OnPaint()
  2. {
  3. CPaintDC dc(this); // device context for painting
  4. // TODO: Add your message handler code here
  5. // Do not call CWnd::OnPaint() for painting messages
  6. CRect rect;
  7. this->GetClientRect(rect);
  8. dc.MoveTo(0,0);
  9. dc.LineTo(rect.right,rect.bottom);
  10. }

来自:http://6208051.blog.51cto.com/6198051/1058634

转自:http://www.jizhuomi.com/software/181.html

VS2010中如何实现自定义MFC控件的更多相关文章

  1. 设置VS2010中自带的ActiveX控件测试容器TstCon

    ActiveX控件:可以看做一个极小的服务器应用程序,他不能单独运行,需要嵌入到某个程序中才可以运行,我们可以自己写一个程序来测试自己写的程序(具体方法在下一篇文章阐述),第二种方法是利用VS(本人编 ...

  2. asp.net中自定义验证控件

    在windows2003中,可能iis版本太底,不支持TextBox的类型设为Number类型,所以会报错,所以去掉后直接用验证控件来控制必须输入数字好了. <asp:RegularExpres ...

  3. Android中自定义组合控件

    Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件.前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式:后者是通过组合已有的控件,来实现结构的简 ...

  4. Android中自定义IP控件

    最近在搞Android项目,之前并没有系统的去学过这方面的编程,只能边看书边撸代码.在项目的开发的过程中,需要一个IP控件,后面了解到Android中并没有这样的控件,于是网上搜索,发现得到的结果并不 ...

  5. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  6. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  7. asp.net webform 自定义分页控件

    做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...

  8. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

  9. MFC控件的SubclassDlgItem

    MFC控件的SubclassDlgItem 要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派 ...

随机推荐

  1. 4606: [Apio2008]DNA

    4606: [Apio2008]DNA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 36[Submit][Status][D ...

  2. 23种设计模式之解释器模式(Interpreter)

    解释器模式属于类的行为型模式,描述了如何为语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子,这里的“语言”是使用规定格式和语法的代码.解释器模式主要用在编译器中,在应用系统开发中很少 ...

  3. Linux批量杀死进程

    杀死进程在linux中使用kill命令了,我们可以下面来给各位介绍一篇关于Linux下批量杀死进程的例子,希望此例子可以对各位同学带来帮助的哦. 批量杀死包含关键字“php-fpm”的进程. kill ...

  4. android极光杀掉程序收不到通知

    http://docs.jpush.io/guideline/faq/#android 第三方系统收不到推送的消息 由于第三方 ROM 的管理软件需要用户手动操作 小米[MIUI] 自启动管理:需要把 ...

  5. 【微信小程序】---授权登陆---【巷子】

    Page({ onLoad: function() { var that = this; // 查看是否授权 wx.getSetting({ success: function(res) { if ( ...

  6. SSH客户端提示 用户密钥未在远程主机上注册

    今天在一台使用已久的内网服务器上面帮一位新同事添加账户,添加完成之后就把账号交付于他,过了10分钟他告诉我说无法登陆,觉得很诧异 这么轻车熟路的 这么会 登陆不上去了,自己也用Xshell 登陆了一下 ...

  7. 持续集成之jenkins

    代码部署规划 安装jenkins yum -y install java-1.8.0cd /etc/yum.repos.d/wget http://pkg.jenkins.io/redhat/jenk ...

  8. HDU 5636 Shortest Path(Floyed,枚举)

    Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tot ...

  9. web移动端开发经验总结

    整理web移动端开发经验,部分内容借鉴于网上的博文. 1.meta标签 <meta name="viewport" content="width=device-wi ...

  10. Linux的/etc/services文件的作用?

    4)端口分配 Linux系统的端口号的范围为0–65535,不同范围有不同的意义. 0 不使用 1--1023 系统保留,只能由root用户使用 1024---4999 由客户端程序自由分配 5000 ...