MFC自定义控件

需要在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)。

BOOL CMyTest::RegisterWindowClass(HINSTANCE hInstance)   
{   
      LPCWSTR className = L"CMyWin";//"CMyWin"控件类的名字   
       WNDCLASS windowclass;         
       if(hInstance)   
              hInstance = AfxGetInstanceHandle();   
          
       if (!(::GetClassInfo(hInstance, className, &windowclass)))   
       {                
              windowclass.style = CS_DBLCLKS;   
              windowclass.lpfnWndProc = ::DefWindowProc;   
              windowclass.cbClsExtra = windowclass.cbWndExtra = 0;   
              windowclass.hInstance = hInstance;   
              windowclass.hIcon = NULL;   
              windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);   
              windowclass.hbrBackground=::GetSysColorBrush(COLOR_WINDOW);  
              windowclass.lpszMenuName = NULL;   
              windowclass.lpszClassName = className;   
    
              if (!AfxRegisterClass(&windowclass))   
              {   
                     AfxThrowResourceException();   
                     return FALSE;   
              }   
       }   
       return TRUE;   
} 

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

CMyTest::CMyTest()   
{   
       RegisterWindowClass();   
}  

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

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

       CMyTest    m_draw;

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

void CCustomCtrDlg::DoDataExchange(CDataExchange* pDX)   
{   
       CDialogEx::DoDataExchange(pDX);   
       DDX_Control(pDX,IDC_CUSTOM1,m_draw);   
}  

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

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

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

 2、编写OnPaint()函数

       例如:画一条直线

void CMykk::OnPaint()   
{   
       CPaintDC dc(this); // device context for painting   
       // TODO: Add your message handler code here   
       // Do not call CWnd::OnPaint() for painting messages   
       CRect rect;   
       this->GetClientRect(rect);   
        
       dc.MoveTo(0,0);   
       dc.LineTo(rect.right,rect.bottom);   
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈满iOS

报错笔记:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

https://stackoverflow.com/questions/24337791/exc-bad-instruction-code-exc-i386-i...

832
来自专栏向治洪

android分包方案

当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILE...

18710
来自专栏Golang语言社区

[译]使用 LLDB 调试 Go 程序

我一般调试Go程序都是通过log日志,性能调试的话通过 pprof 、trace、flamegraph等,主要是Go没有一个很好的集成的debugger,前两年...

1023
来自专栏CRPER折腾记

Vue 折腾记 - (10) 给axios做个挺靠谱的封装(报错,鉴权,跳转,拦截,提示)

不推荐完全copy过去,可以看看我是如何针对我这边业务; 做的一个axios的封装及实现的思路

1612
来自专栏流媒体

基于FFmpeg进行RTMP推流(一)简介

这里的bin、include、lib就是我们刚才在FFmpeg下载的相关文件。 src是我们的项目源码目录。 新建Win32控制台应用程序、选择位置、...

5232
来自专栏Albert陈凯

Hadoop数据分析平台实战——250JSSDK数据收集引擎编写离线数据分析平台实战——250JSSDK数据收集引擎编写

离线数据分析平台实战——250JSSDK数据收集引擎编写 JsSDK设计规则 在js sdk中我们需要收集launch、pageview、chargeReque...

3308
来自专栏hotqin888的专栏

bootstrap treeview 增删改的正确姿势

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1063
来自专栏郭耀华‘s Blog

LitePal——Android数据库框架完整使用手册

LitePal for Android LitePal是一个开源的Android库,使开发人员使用SQLite数据库非常简单。您无需编写任何SQL语句就可以完...

2877
来自专栏林德熙的博客

win10 uwp win2d CanvasVirtualControl CanvasAnimatedControlCanvasVirtualControl其他博客

本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件。

761
来自专栏张善友的专栏

Quartz.NET 3.0 正式发布

1808

扫码关注云+社区