头文件

#pragma once
#include "pch.h"
class CGridCtrl : public CWnd
{
public:
void Create(CWnd* pParent, DWORD dwStyle, RECT rect, UINT nId);
void InsertColumn(LPCTSTR lpstColName);
void InsertRow();
void Set(int Row, int Col, CString data)
{
while (vctRows[Row].size() < Col)
{
vctRows[Row].push_back(_T(""));
}
vctRows[Row].push_back(data);
} LPCTSTR GetClassName() {
return _T("GridCtrl");
}
LPCTSTR GetWindowName() {
return _T("GridCtrl");
}
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
private:
void RegisterCtrl();
//void(int nRow,int nCol);
void InsertCol(LPCTSTR lpctRow);
std::vector<LPCTSTR> GetRows();
static bool m_bRegisted;
static LRESULT GridCtrlProc(HWND, UINT, WPARAM, LPARAM);
typedef std::vector<CString> Cells;
std::vector<Cells> vctRows;
int m_nCurRow; };

cpp

#include "pch.h"
#include "CGridCtrl.h" bool CGridCtrl::m_bRegisted = false; BEGIN_MESSAGE_MAP(CGridCtrl, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP() void CGridCtrl::Create(CWnd* pParent, DWORD dwStyle, RECT rect, UINT nID)
{
WNDCLASS windowclass;
HINSTANCE hInst = AfxGetInstanceHandle(); if (!::GetClassInfo(hInst, GetClassName(), &windowclass))
{
RegisterCtrl();
} CWnd::Create(GetClassName(), GetWindowName(), dwStyle, rect, pParent, nID);
} void CGridCtrl::InsertColumn(LPCTSTR lpstColName)
{
if (vctRows.size() >= 1)
(vctRows.end() - 1)->push_back(lpstColName);
} void CGridCtrl::InsertRow()
{
Cells cells;
vctRows.push_back(cells);
} void CGridCtrl::OnPaint()
{
CWnd::OnPaint();
CClientDC dc(this);
CRect cr;
GetClientRect(&cr);
dc.Draw3dRect(0, 0, cr.Width(), cr.Height(), RGB(233, 0, 0), RGB(0, 233, 0));
int nRowHeight = 30;
int nColWidth = 150;
cr.SetRect(0, 0, nColWidth, nRowHeight);
for (int nRow = 0; nRow < vctRows.size(); nRow++)
{
for (int nCol = 0; nCol < vctRows[nRow].size(); nCol++)
{
int nCoordX = nCol * nColWidth;
int nCoordY = nRow * nRowHeight;
cr.MoveToXY(nCoordX, nCoordY);
//dc.Draw3dRect(nCoordX, nCoordY, nColWidth, nRowHeight, RGB(12, 0, 3), RGB(32, 22, 12));
CString ss;
ss = vctRows[nRow][nCol];
dc.DrawText(vctRows[nRow][nCol], cr, DT_CENTER);
}
}
} void CGridCtrl::InsertCol(LPCTSTR lpctRow)
{
m_nCurRow = vctRows.size(); } void CGridCtrl::RegisterCtrl()
{
WNDCLASS w;
memset(&w, 0, sizeof(WNDCLASS)); // start with NULL defaults
w.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
w.lpszClassName = GetClassName();
w.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
w.hIcon = NULL;//GetIcon(FALSE);
w.hInstance = AfxGetInstanceHandle();
w.lpszMenuName = NULL;//_T("Menu");
w.cbClsExtra = w.cbWndExtra = 0;
w.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//::GetSysColor(COLOR_WINDOW);
w.lpfnWndProc = (WNDPROC)AfxWndProc;//::DefWindowProc;//(WNDPROC)CGridCtrl::GridCtrlProc;
if (!AfxRegisterClass(&w))
{
AfxThrowResourceException();
return;
}
} LRESULT CGridCtrl::GridCtrlProc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam)
{
return AfxWndProc(hWnd, msgType, wParam, lParam);
}

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. 最小生成树Kruskal算法的实现原理

    到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...

  2. 一文带你了解.NET能做什么?

    前言 在DotNetGuide技术社区微信交流群经常看到有小伙伴问:.NET除了能写桌面应用和Web应用还能做什么?今天大姚将通过本篇文章来简单讲讲.NET能做哪些开发,对.NET感兴趣的小伙伴也可以 ...

  3. Qt-FFmpeg开发-打开本地摄像头录制视频(7)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头录制视频[软解码+ OpenGL显示YUV] 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头录制视频[软 ...

  4. FreeRTOS例程开发

    环境配置 下载官方源码 https://www.freertos.org/ 找到这个,他就是visual studio示例demo,我们主要在这个的基础上修改 下载visio studio https ...

  5. js整数类型

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

  6. kettle从入门到精通 第五十五课 ETL之kettle Excel输入

    1. Excel输入,Microsoft Excel输入步骤的作用是从Microsoft Excel中读取数据,如下图所示: 1)Excel输入步骤从文件D:\data\测试数据.xlsx读取数据. ...

  7. python 如何判断一组数呈上升还是下降趋势

    1. python 判断一组数呈上升还是下降趋势的方法 要判断一组数(数列)是呈上升趋势.下降趋势还是无明显趋势,我们可以比较数列中相邻元素的差值.如果大部分差值都是正数,则数列呈上升趋势:如果大部分 ...

  8. 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值

    函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制. 1 整数型参数传递 这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型, ...

  9. java springboot 读取自定义配置文件

    java springboot 读取自定义配置文件 application.properties.test.properties maven中引用 : <dependency> <g ...

  10. 利用ADB获取APP资源

    最近小编经常受到失眠的困扰,因为在编写一个安卓体能评定的软件,同时又在构思一个桌面管理应用,不管是构想还是操作上都遇到了很多难题,所以寄希望于小编手机上的一款软件,因为版权问题,就不说出它叫啥名字了. ...