头文件

  1. #pragma once
  2. #include "pch.h"
  3. class CGridCtrl : public CWnd
  4. {
  5. public:
  6. void Create(CWnd* pParent, DWORD dwStyle, RECT rect, UINT nId);
  7. void InsertColumn(LPCTSTR lpstColName);
  8. void InsertRow();
  9. void Set(int Row, int Col, CString data)
  10. {
  11. while (vctRows[Row].size() < Col)
  12. {
  13. vctRows[Row].push_back(_T(""));
  14. }
  15. vctRows[Row].push_back(data);
  16. }
  17.  
  18. LPCTSTR GetClassName() {
  19. return _T("GridCtrl");
  20. }
  21. LPCTSTR GetWindowName() {
  22. return _T("GridCtrl");
  23. }
  24. afx_msg void OnPaint();
  25. DECLARE_MESSAGE_MAP()
  26. private:
  27. void RegisterCtrl();
  28. //void(int nRow,int nCol);
  29. void InsertCol(LPCTSTR lpctRow);
  30. std::vector<LPCTSTR> GetRows();
  31. static bool m_bRegisted;
  32. static LRESULT GridCtrlProc(HWND, UINT, WPARAM, LPARAM);
  33. typedef std::vector<CString> Cells;
  34. std::vector<Cells> vctRows;
  35. int m_nCurRow;
  36.  
  37. };

cpp

  1. #include "pch.h"
  2. #include "CGridCtrl.h"
  3.  
  4. bool CGridCtrl::m_bRegisted = false;
  5.  
  6. BEGIN_MESSAGE_MAP(CGridCtrl, CWnd)
  7. ON_WM_PAINT()
  8. END_MESSAGE_MAP()
  9.  
  10. void CGridCtrl::Create(CWnd* pParent, DWORD dwStyle, RECT rect, UINT nID)
  11. {
  12. WNDCLASS windowclass;
  13. HINSTANCE hInst = AfxGetInstanceHandle();
  14.  
  15. if (!::GetClassInfo(hInst, GetClassName(), &windowclass))
  16. {
  17. RegisterCtrl();
  18. }
  19.  
  20. CWnd::Create(GetClassName(), GetWindowName(), dwStyle, rect, pParent, nID);
  21. }
  22.  
  23. void CGridCtrl::InsertColumn(LPCTSTR lpstColName)
  24. {
  25. if (vctRows.size() >= 1)
  26. (vctRows.end() - 1)->push_back(lpstColName);
  27. }
  28.  
  29. void CGridCtrl::InsertRow()
  30. {
  31. Cells cells;
  32. vctRows.push_back(cells);
  33. }
  34.  
  35. void CGridCtrl::OnPaint()
  36. {
  37. CWnd::OnPaint();
  38. CClientDC dc(this);
  39. CRect cr;
  40. GetClientRect(&cr);
  41. dc.Draw3dRect(0, 0, cr.Width(), cr.Height(), RGB(233, 0, 0), RGB(0, 233, 0));
  42. int nRowHeight = 30;
  43. int nColWidth = 150;
  44. cr.SetRect(0, 0, nColWidth, nRowHeight);
  45. for (int nRow = 0; nRow < vctRows.size(); nRow++)
  46. {
  47. for (int nCol = 0; nCol < vctRows[nRow].size(); nCol++)
  48. {
  49. int nCoordX = nCol * nColWidth;
  50. int nCoordY = nRow * nRowHeight;
  51. cr.MoveToXY(nCoordX, nCoordY);
  52. //dc.Draw3dRect(nCoordX, nCoordY, nColWidth, nRowHeight, RGB(12, 0, 3), RGB(32, 22, 12));
  53. CString ss;
  54. ss = vctRows[nRow][nCol];
  55. dc.DrawText(vctRows[nRow][nCol], cr, DT_CENTER);
  56. }
  57. }
  58. }
  59.  
  60. void CGridCtrl::InsertCol(LPCTSTR lpctRow)
  61. {
  62. m_nCurRow = vctRows.size();
  63.  
  64. }
  65.  
  66. void CGridCtrl::RegisterCtrl()
  67. {
  68. WNDCLASS w;
  69. memset(&w, 0, sizeof(WNDCLASS)); // start with NULL defaults
  70. w.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
  71. w.lpszClassName = GetClassName();
  72. w.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
  73. w.hIcon = NULL;//GetIcon(FALSE);
  74. w.hInstance = AfxGetInstanceHandle();
  75. w.lpszMenuName = NULL;//_T("Menu");
  76. w.cbClsExtra = w.cbWndExtra = 0;
  77. w.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//::GetSysColor(COLOR_WINDOW);
  78. w.lpfnWndProc = (WNDPROC)AfxWndProc;//::DefWindowProc;//(WNDPROC)CGridCtrl::GridCtrlProc;
  79. if (!AfxRegisterClass(&w))
  80. {
  81. AfxThrowResourceException();
  82. return;
  83. }
  84. }
  85.  
  86. LRESULT CGridCtrl::GridCtrlProc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam)
  87. {
  88. return AfxWndProc(hWnd, msgType, wParam, lParam);
  89. }

MFC 完全自定义控件的更多相关文章

  1. MFC 自定义控件

    需要在MFC实现自定义控件功能,网上搜集找的如下方法实现: 以下是步骤说明. 一.自定义一个空白控件  1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appli ...

  2. MFC可编辑ListBox控件CEditableListBox

    左击选中单元格,右击进入编辑状态. MFC自定义控件的添加方法C#自定义控件编译后就自动出现在工具箱里.MFC的自定义控件需要先拖个基类到对话框上,然后添加一个控件变量.再修改源代码中的控件名为扩展控 ...

  3. MFC如何添加自定义控件

    project->add to project->components and controls在Registered ActiveX Controls下找到你注册的自定义控件就可以了   ...

  4. MFC自定义控件如何向父窗口发送自定义消息

    自定义了一个控件 class CHtmlEditCtrlEx : public CHtmlEditCtrl   想在这个控件接收到Ctrl+V键盘消息的时候,向该控件所在的窗口发送一个自定义消息.具体 ...

  5. 2013 duilib入门简明教程 -- 结合win32和MFC (16)

        虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况.如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话 ...

  6. 第二十八篇:SOUI中自定义控件开发过程

    在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件 ...

  7. 快笑死,侯捷研究MFC的原因

    与我研究VCL框架代码的原因一模一样:就是N年了,感觉自己还是没有掌握Delphi,惊叹别人各种各样神奇的效果,自己却不会,更不知为什么这样做,离高手的距离还有十万八千里.而且编程的时候,就像侯捷说的 ...

  8. MFC双缓冲和裁剪问题导致闪烁

    问题描述: 应用场景:在对话框中,自定义一个MFC图形控件(为了描述方便,暂定为HSPaintControl),控件覆盖整个对话框的客户区,属于最底层的控件,在这之上放置了很多其他的小图形控件. 问题 ...

  9. MFC 对话框不显示,返回-1 原因

    DoModal失败原因 1.MFC 通常对话框不显示的原因有 1 父窗口HWND无效 2 在ONINITDIALOG里用了ENDDIALOG 3 无效的对话框资源ID 4 使用没有注册的的自定义控件 ...

  10. MFC中的一些视图

    本章主要介绍MFC中主要的视图类,这些继承自Cview类. 继承关系如上图所示. 滚动视图 CscrollView给Cview添加了基本的滚动功能,它包含WM_VSCROLL和WM_HSCROLL消息 ...

随机推荐

  1. Swoole 源码分析之 Timer 定时器模块

    原文首发链接:Swoole 源码分析之 Timer 定时器模块 大家好,我是码农先森. 引言 Swoole 中的毫秒精度的定时器.底层基于 epoll_wait 和 setitimer 实现,数据结构 ...

  2. es 排序突然很慢的原因

    今天突然之间发现一个访问es的查询很慢.由刚上线之前测试的100ms直接到了5s左右.瞬间懵逼. 这个用户索引大概200w的数据. 查询语句如下 GET /user/_search{"fro ...

  3. Android 13 - Media框架(6)- NuPlayer

    关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们通过 NuPlayerDriver 了解了 NuPlayer 的使用方式,这一节我们一起来学习 NuPlayer 的部分实现细节. ps: ...

  4. Android 13 - Media框架 - 异步消息机制

    关注公众号免费阅读全文,进入音视频开发技术分享群! b7693967-317e-4c46-96d3-d40d9d87e382 由于网上已经有许多优秀的博文讲解了Android的异步消息机制(ALoop ...

  5. WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

    在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None".AllowsTransparency="True" 这两个 ...

  6. (性能测试)--记录一次高可用场景导致CPU资源升高

    测试场景:高可用场景--限流测试: 被测交易:查询类交易,HTTP协议: 交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp .co ...

  7. js浮点数类型

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  8. minos 1.2 内存虚拟化——guest

    首发公号:Rand_cs minos 1.2 内存虚拟化--guest 项目来自乐敏大佬:https://github.com/minosproject/minos 本文继续讲述 minos 中的内存 ...

  9. 架构与思维:了解Http 和 Https的区别(图文详解)

    1 介绍 随着 HTTPS 的不断普及和使用成本的下降,现阶段大部分的系统都已经开始用上 HTTPS 协议. HTTPS 与 HTTP 相比, 主打的就是安全概念,相关的知识如 SSL .非对称加密. ...

  10. nginx虚拟主机实战

    基于nginx部署网站 虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站.FTP.邮件等. Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点. 一.为什么配 ...