MFC 完全自定义控件
头文件
#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 完全自定义控件的更多相关文章
- MFC 自定义控件
需要在MFC实现自定义控件功能,网上搜集找的如下方法实现: 以下是步骤说明. 一.自定义一个空白控件 1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appli ...
- MFC可编辑ListBox控件CEditableListBox
左击选中单元格,右击进入编辑状态. MFC自定义控件的添加方法C#自定义控件编译后就自动出现在工具箱里.MFC的自定义控件需要先拖个基类到对话框上,然后添加一个控件变量.再修改源代码中的控件名为扩展控 ...
- MFC如何添加自定义控件
project->add to project->components and controls在Registered ActiveX Controls下找到你注册的自定义控件就可以了 ...
- MFC自定义控件如何向父窗口发送自定义消息
自定义了一个控件 class CHtmlEditCtrlEx : public CHtmlEditCtrl 想在这个控件接收到Ctrl+V键盘消息的时候,向该控件所在的窗口发送一个自定义消息.具体 ...
- 2013 duilib入门简明教程 -- 结合win32和MFC (16)
虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况.如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话 ...
- 第二十八篇:SOUI中自定义控件开发过程
在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件 ...
- 快笑死,侯捷研究MFC的原因
与我研究VCL框架代码的原因一模一样:就是N年了,感觉自己还是没有掌握Delphi,惊叹别人各种各样神奇的效果,自己却不会,更不知为什么这样做,离高手的距离还有十万八千里.而且编程的时候,就像侯捷说的 ...
- MFC双缓冲和裁剪问题导致闪烁
问题描述: 应用场景:在对话框中,自定义一个MFC图形控件(为了描述方便,暂定为HSPaintControl),控件覆盖整个对话框的客户区,属于最底层的控件,在这之上放置了很多其他的小图形控件. 问题 ...
- MFC 对话框不显示,返回-1 原因
DoModal失败原因 1.MFC 通常对话框不显示的原因有 1 父窗口HWND无效 2 在ONINITDIALOG里用了ENDDIALOG 3 无效的对话框资源ID 4 使用没有注册的的自定义控件 ...
- MFC中的一些视图
本章主要介绍MFC中主要的视图类,这些继承自Cview类. 继承关系如上图所示. 滚动视图 CscrollView给Cview添加了基本的滚动功能,它包含WM_VSCROLL和WM_HSCROLL消息 ...
随机推荐
- Git三大区域
1.工作区 2.暂存区 3.版本库
- Go的接口与多态
什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他的变量是一堆方法. 一个简单的案例: r,_ := http.Get("http://www.baidu.com") i ...
- rhcsa练习题容易错的地方
rhcsa练习题容易错的地方 yum仓库的配置 注意 配置yum仓库的时候,baseurl的路径不要写错 dnf clean all && dnf makecache //检查错误 s ...
- IDEA:java: Compilation failed: internal java compiler error
java: Compilation failed: internal java compiler error 解决方法: 1.打开菜单 ,File - Project Structure - Proj ...
- 如何监控文件变化,比如密码修改导致 shadow 文件变化
原始需求是如果系统的密码被修改,或者创建了新用户,就告警出来.本质上,只需要监控 /etc/shadow 文件变化即可.但是在指标监控体系里,这个事情就比较棘手,只能把文件的 mtime 作为指标的值 ...
- vue安装及升级
先装好note.js 安装过程很简单,一直点下一步就ok了.1.1我们通过打开命令行工具(win+R),输入node -v查看node的版本,若出现相应的版本号说明你安装成功了 1.2.npm包管理器 ...
- babel 基础概念 & 从零到一写一个 babel 插件
babel 基础概念 简单来说,做语法转换兼容的, 复杂一点的说,babel可以将我们写的 ES6+ 的Javascript语法转换为向后兼容的语法,以便能够在旧版本的浏览器或者其他环境运行. bab ...
- 阅读mmdetection3d框架的源码探索其构建dataset的流程
在查看一些基于mmdetection3d构建的代码的时候,一开始会摸不着头脑,它的dataset到底是怎么构造的? 接下来就直接下载mmdetection3d这个仓库,然后去分析里面的代码. 可以看到 ...
- python重拾基础第二天
本节内容 列表.元祖操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换 1. 列表操作 ...
- 解决keil5仿真错误:Encountered an improper argument
--- title: 解决keil5仿真错误:Encountered an improper argument date: 2020-06-18 03:13:18 categories: tags: ...