本文简要讲解在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. [转]Windows上搭建Kafka运行环境

    [转]http://www.cnblogs.com/alvingofast/p/kafka_deployment_on_windows.html Windows上搭建Kafka运行环境   完整解决方 ...

  2. C语言如何产生随机数

    1.基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand(unsigned int n); rand()函数和srand()函数被声明在头文件stdlib ...

  3. AD添加LOGO的方法

    1 将logo图片转换成单色的BMP 图像.简单的方法是使用Windows自带的画图程序,在将图片另存为时, 在文件类型下拉列表中选择单色.bmp即可.我们以Altium为例,如图所示将蓝色logo另 ...

  4. ios三张图片组合一张

    - (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 { UIGraphicsBeginImageContext(imag ...

  5. tomcat内存溢出:PermGen space解决方法

    最近集群服务器中的几台服务器在半夜自动重启tomcat后一段时间便都会报java.lang.OutOfMemoryError: PermGen space. 习惯性的百度,得到的答案基本上都是统一的解 ...

  6. Hibernate的10个常见面试问题及答案

    在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的.Hibernate框架在Java界的成功和高度的可接受性使得它成为了Java ...

  7. Druid的Segment Balance及其代价计算函数分析

    Balance $Cost(X, Y) $ $$ J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} { ...

  8. vue报错/ style-loader: Adds some css to the DOM by adding a <style> tag

    1.1.1.   vue-cli搭建的项目引入.styl/css文件报错 http://blog.csdn.net/z852064121/article/details/72660327 / styl ...

  9. 如何使ul中li元素横向排列且不换行

    外层div容器宽度固定,ul宽度随li(li宽度固定)的增加而撑开,但是当ul中li的宽度之和大于div时,ul没有撑开,而是li换行了,如何使li不换行? 解决方法:主要是外面容器设置为white- ...

  10. Docker命令详解(build篇)

    命令格式:docker build [OPTIONS] <PATH | URL | -> Usage: Build an image from a Dockerfile. 中文意思即:使用 ...