VS2010中如何实现自定义MFC控件
本文简要讲解在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++代码
- 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=\'#\'" >
- windowclass.lpszMenuName = NULL;
- windowclass.lpszClassName = className;
- if (!AfxRegisterClass(&windowclass))
- {
- AfxThrowResourceException();
- return FALSE;
- }
- }
- return TRUE;
- }
5、在MyTest类的构造器中调用 RegisterWindowClass()。
C++代码
- CMyTest::CMyTest()
- {
- RegisterWindowClass();
- }
6、控件与对话框数据交换
在CustomCtrDlg.h中定义一个变量:
CMyTest m_draw;
在对话框类的CustomCtrDlg.cpp的DoDataExchange函数中添加DDX_Control(pDX,IDC_CUSTOM1,m_draw)。
C++代码
- 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()函数
例如:画一条直线
C++代码
- 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);
- }
来自:http://6208051.blog.51cto.com/6198051/1058634
转自:http://www.jizhuomi.com/software/181.html
相关文章
- 哈希算法原理【Java实现】
- 队列顺序存储 - 设计与实现 - API函数
- jquery如何实现自动打开第一个链接!(实例代码)
- 如何实现远程控制你的电脑? 网穿软件
- React-Native 之 GD (十四)小时风云榜 及 当前时间操作 及 上一小时、下一小时功能实现
- Allegro如何实现交换functions操作详细指导
- JMeter中如何实现接口之间的关联?
- 一文读懂,用 jenkins+docker 实现主从模式
- Spring 如何实现 AOP
- 31 面向对象编程 接口 普通类:只有具体实现 声明类的关键字是class,声明接口关键字是interface 接口的作用
- EasyUI使用DataGrid实现动态列数据绑定
- 通过经典题目来理解多种闭包实现方式
- 如何实现情景式精准触达用户,提高用户活跃与转化?
- 实现互联网思维的“独孤九剑”
- 基于Python实现可靠数据传输协议【100010493】
- 程序员副业赚钱之我是如何通过编程实现财务独立的
- AOP的实现机制
- 小红书如何实现高效推荐?解密背后的大数据计算平台架构
- 毕业设计 SSM旅游网站设计与实现
- uni-app 全局变量的几种实现方式
- 浏览器工作原理:浅析页面循环系统 - setTimeout是如何实现的
- Win10 Ubuntu子系统设置Git服务器和SSH Server 证书登录,实现win10和macOS源码同步