class CGridCtrl : public CWnd
{
DECLARE_DYNAMIC(CGridCtrl)
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);
}
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); void HScroll(UINT, UINT);
LPCTSTR GetClassName() {
return _T("GridCtrl");
}
LPCTSTR GetWindowName() {
return _T("GridCtrl");
}
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
private:
bool 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;
CScrollBar scHorizon;
CScrollBar scVertical;
double dbHScroll;
CPoint mouseP;
COLORREF clrBK,clrSelect,clrForeground;
};

.cpp

#include "pch.h"
#include "CGridCtrl.h" bool CGridCtrl::m_bRegisted = false;
IMPLEMENT_DYNAMIC(CGridCtrl, CWnd)
BEGIN_MESSAGE_MAP(CGridCtrl, CWnd)
ON_WM_PAINT()
ON_WM_HSCROLL()
ON_WM_HSCROLL_REFLECT()
ON_WM_MBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONUP()
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 | SS_NOTIFY /*| WS_HSCROLL | WS_VSCROLL*/, rect, pParent, nID);
scHorizon.Create(SBS_HORZ, rect, this, nID + 3);
scHorizon.EnableScrollBar(ESB_DISABLE_RIGHT); scVertical.Create(SBS_VERT, rect, this, nID + 32);
scVertical.EnableScrollBar(ESB_ENABLE_BOTH); scHorizon.SetScrollRange(0, 200);
clrBK = RGB(23, 100, 100);
clrSelect = RGB(223, 100, 233);
} 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::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
//scHorizon.SetScrollPos(nPos);
int TempPos = pScrollBar->GetScrollPos();
//SCROLLINFO si;
//GetScrollInfo(SB_HORZ, &si, SIF_ALL);
//m_ImgVScrollPos = si.nPos;
//dbHScroll = si.nPos;
dbHScroll = nPos;
Invalidate(TRUE);
scHorizon.SetScrollPos(nPos);
switch (nSBCode)
{
case SB_THUMBPOSITION://拖动滑块
pScrollBar->SetScrollPos(nPos);
break;
case SB_LINELEFT://点击左边的箭头
if (TempPos > 1)
{
TempPos--;
}
pScrollBar->SetScrollPos(TempPos);
break;
case SB_LINERIGHT://点击右边的箭头
if (TempPos < 100)
{
TempPos++;
}
pScrollBar->SetScrollPos(TempPos);
break;
}
} void CGridCtrl::HScroll(UINT nSBCode, UINT nPos)
{
scHorizon.SetScrollPos(nPos);
} void CGridCtrl::OnPaint()
{
CWnd::OnPaint();
CClientDC dc(this);
CRect cr;
CRect rectClient;
GetClientRect(&rectClient);
//dc.Draw3dRect(0, 0, cr.Width(), cr.Height(), RGB(233, 0, 0), RGB(0, 233, 0)); int nRowHeight = 30;
int nColWidth = 150;
double dbHorScrollRange = 0;
double dbVerScrollRange = 0;
cr.SetRect(0, 0, nColWidth, nRowHeight);
bool bShowHorizen = false;
bool bShowVertical = false;
for (int nRow = 0; nRow < vctRows.size(); nRow++)
{
for (int nCol = 0; nCol < vctRows[nRow].size(); nCol++)
{
int nCoordX = nCol * nColWidth - dbHScroll;
int nCoordY = nRow * nRowHeight;
cr.MoveToXY(nCoordX, nCoordY);
//cr.OffsetRect(nCoordX, nCoordY);
if (nColWidth + nCoordX > rectClient.Width())
{
dbHorScrollRange = nColWidth + nCoordX;
bShowHorizen = true;
}
if (nRowHeight + nCoordY > rectClient.Height())
{
//dbVerScrollRange = nCo + nCoordX;
bShowVertical = true;
}
CString ss = vctRows[nRow][nCol];
if (cr.PtInRect(mouseP))
{
dc.FillSolidRect(&cr, clrSelect);
//dc.Draw3dRect(&cr, RGB(255, 0, 0), RGB(13, 255, 312));
// dc.SetBkColor(RGB(200, 200, 200));
}
else {
dc.FillSolidRect(&cr, clrBK);
}
//
dc.MoveTo(nCoordX, nCoordY);
dc.LineTo(nCoordX, nCoordY + nRowHeight);
dc.MoveTo(nCoordX, nCoordY);
dc.LineTo(nCoordX + nColWidth, nCoordY);
dc.DrawText(vctRows[nRow][nCol], &cr, DT_CENTER | DT_SINGLELINE | DT_VCENTER); }
}
/*CRect ell;
ell.SetRect(-10, -10, 10, 10);
ell.MoveToXY(mouseP.x - 10, mouseP.y - 10);
dc.Ellipse(ell);*/
if (bShowHorizen)
{
CRect cr;
cr.SetRect(0, rectClient.Height() - 20, rectClient.Width(), rectClient.Height());
scHorizon.MoveWindow(cr);
scHorizon.ShowScrollBar();
scHorizon.SetScrollRange(0, dbHorScrollRange);
//scHorizon.SetScrollPos(3);
//this->EnableScrollBar(WS_VSCROLL);
} /*if (bShowVertical)
{
CRect cr;
cr.SetRect(rectClient.Width() - 40, 0, rectClient.Width(), rectClient.Height());
scVertical.MoveWindow(cr);
scVertical.ShowScrollBar();
}*/
} void CGridCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnMButtonDown(nFlags, point);
mouseP = point;
Invalidate();
} void CGridCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CWnd::OnLButtonDblClk(nFlags, point);
mouseP = point;
Invalidate();
} void CGridCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{ } void CGridCtrl::InsertCol(LPCTSTR lpctRow)
{
m_nCurRow = vctRows.size();
} bool 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_WINDOWFRAME + 1);//::GetSysColor(COLOR_WINDOW);
w.lpfnWndProc = (WNDPROC)AfxWndProc;//::DefWindowProc;//(WNDPROC)CGridCtrl::GridCtrlProc;
if (!AfxRegisterClass(&w))
{
AfxThrowResourceException();
return false;
}
return true;
} LRESULT CGridCtrl::GridCtrlProc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam)
{
return AfxWndProc(hWnd, msgType, wParam, lParam);
}

封装的grid控件的更多相关文章

  1. 完全使用一组 DSL 来操作 Grid 控件

    最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...

  2. FineUI Grid控件高度自适应

    引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...

  3. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  4. FineUI Grid控件右键菜单的实现

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

  5. 实现控件WPF(4)----Grid控件实现六方格

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...

  6. 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

    原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...

  7. wpf研究之道-grid控件

    想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...

  8. Grid控件

    Grid控件是WPF布局容器中功能最强大.最灵活的控件.Grid控件基本上能够完成其他WPF容器控件所能完成的功能,Microsoft建议大多数界面的布局都使用Grid控件来实现,因此默认情况下.vs ...

  9. fine ui grid控件添加行号

    grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...

  10. C# grid控件用数据库分页后台怎么写?

    C#grid控件使用数据库分页的写法如下: mySystem.GetDataa(gridName.PageIndex *gridName.PageSize + 1, (gridName.PageInd ...

随机推荐

  1. vue 实现商品列表的添加、删除,搜索

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  2. Python3基本语法(新)

    目录 基本语法 输出print() 格式化输出 标识符 import关键字 保留字(关键字) 注释 多行注释 1.单引号(''') 2.双引号(""") 缩进 空行 同一 ...

  3. 从零开始的常用MySQL语句练习大全

    先说一些废话 很多时候深入学习固然很重要,但是想要写下一篇给新手都能看得懂看的很香,并且老鸟可以查漏补缺的的练习博客,还是挺有难度, 所以今天尝试写一些关于MySQL的语句练习大全,供想要从零开始练习 ...

  4. vue3使用表格el-table-infinite-scroll.js:18 Uncaught (in promise) Error: [el-table-infinite-scroll]: .el-scrollbar__wrap element not found.

    先看下表格里面有没有这个el-scrollbar__wrap class类 没有的话升级一下element-plus到最新的就行 你可以先查看element-plus的版本 npm view elem ...

  5. IceRPC之依赖注入>快乐的RPC

    作者引言 很高兴啊,我们来到了IceRPC之依赖注入>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界. 依赖注入和IceRPC 了解 IceRPC (C#) 如何为依赖注入 ...

  6. FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid

    ​XviD是个开源的视频编解码器,它与DivX一同被纳入MPEG-4规范第二部分的视频标准,但DivX并未开源.早期的MP4视频大多采用XviD或者DivX编码,当时的视频格式被称作MPEG-4.现在 ...

  7. INFINI Labs 产品更新 | Easysearch 1.8.0 发布数据写入限流功能

    INFINI Labs 产品又更新啦~,包括 Easysearch v1.8.0.Gateway.Console.Agent.Loadgen v1.25.0.本次各产品更新了很多亮点功能,如 Easy ...

  8. JVM性能分析与故障排查

    引言 JVM调优 程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高.请求延迟.tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高 ...

  9. xxlJob端口号及故障转移设置,解决负载均衡调度任务执行

    xxlJob端口号及故障转移设置,解决负载均衡调度任务执行 my.xxljob.executorPort = 1162 my.xxljob.executorAppName = myService-jo ...

  10. injectionIII iOS代码注入工具(上)

    injectionIII iOS代码注入工具(上) 前言 如果之前用过injection的朋友一定会对其热重载的特性印象深刻,如今injection经过多次更新,现在以injectionIII之名上架 ...