博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010中如何实现自定义MFC控件
阅读量:4302 次
发布时间:2019-05-27

本文共 2059 字,大约阅读时间需要 6 分钟。

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

       一、自定义一个空白控件

       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.     
  6.        if(hInstance)   
  7.               hInstance = AfxGetInstanceHandle();   
  8.           
  9.        if (!(::GetClassInfo(hInstance, className, &windowclass)))   
  10.        {                
  11.               windowclass.style = CS_DBLCLKS;   
  12.               windowclass.lpfnWndProc = ::DefWindowProc;   
  13.               windowclass.cbClsExtra = windowclass.cbWndExtra = 0;   
  14.               windowclass.hInstance = hInstance;   
  15.               windowclass.hIcon = NULL;   
  16.               windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);   
  17.               windowclass.hbrBackground=\'#\'" >   
  18.               windowclass.lpszMenuName = NULL;   
  19.               windowclass.lpszClassName = className;   
  20.     
  21.               if (!AfxRegisterClass(&windowclass))   
  22.               {   
  23.                      AfxThrowResourceException();   
  24.                      return FALSE;   
  25.               }   
  26.        }   
  27.     
  28.        return TRUE;   
  29. }  

       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.         
  9.        dc.MoveTo(0,0);   
  10.        dc.LineTo(rect.right,rect.bottom);   
  11. }  

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

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

转载地址:http://mcmws.baihongyu.com/

你可能感兴趣的文章
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>
Git(四) - 分支管理
查看>>
PHP Curl发送数据
查看>>
HTTP协议
查看>>
HTTPS
查看>>
git add . git add -u git add -A区别
查看>>
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>