CBCGPGridCtrl实践

定义说明

资源

IDC_CHECK   		.bmp类型的勾选的图片资源ID
IDC_FOLDER			.ico类型的文件夹图片资源ID
IDC_NODE			.ico类型的节点图片资源ID
IDC_PICTURE_AREA	MFC的picture控件ID,该区域用于创建CBCGPGridCtrl

控件相关
定义列号,方便后期修改

enum{
	FIRST_CHECK,		
	SECOND_ORINARY,		
	THIRD_BUTTON,	
	FOURTH_COMBBOX,
	FIVETH_PROGRESS_BAR
}

对话框中定义变量

CBCGPGridCtrl m_Grid;	
CImageList m_ImageList;

设置图片列表

m_imageList.Create(16,16, ILC_COLOR24|ILC_MASK, 0, 1)
CBitmap bmp;
bmp.LoadBitmap(IDC_CHECK);
m_ImageList.Add(&bmp, RGB(255, 0, 255));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDC_FOLDER));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDC_NODE));
m_Grid.SetImageList(&m_ImageList);

定义BCGPGrid位置

UINT controlID = IDC_PICTURE_AREA;		//控件绘制所用的MFC控件picture control
CRect rc;
pParentWnd->GetDlgItem(controlID)->GetWindowRect(&rc);
pParentWnd->ScreenToClient(&rc);
pParentWnd->GetDlgItem(controlID)->ShowWindow(SW_HIDE);	//隐藏picture control

创建

CWnd* pParentWnd = this;					//控件隶属于对话框,父窗口赋值对话框this指针
BOOL bCreate = m_Grid.Create(WS_VISIBLE|WS_CHILD|WS_BORDER, rc, pParentWnd, controlID);
m_Grid.SetVisualManagerColorTheme(TRUE);	

根据所需设置BCGPGrid属性
m_Grid.EnableColumnAutoSize(FALSE);
m_Grid.EnableGridLines(TRUE);
m_Grid.EnableMarkSortedColumn (FALSE);
m_Grid.EnableHeader (TRUE, BCGP_GRID_HEADER_MOVE_ITEMS);
m_Grid.EnableGridLines(TRUE);
m_Grid.SetClearInplaceEditOnEnter (FALSE);
m_Grid.EnableInvertSelOnCtrl ();
m_Grid.EnableHeader (TRUE, BCGP_GRID_HEADER_SORT);
m_Grid.EnableTreeLines(TRUE);

添加列

只有列头,没有数据。
InsertColumn函数最后一个参数为m_ImageList中的索引号。

//第1列为checkbox
m_Grid.InsertColumn(FIRST_CHECK, " ", 25, 2);
m_Grid.SetHeaderAlign(FIRST_CHECK, HDF_CENTER);
m_Grid.SetColumnAlign(FIRST_CHECK,HDF_LEFT);

//第2列为普通列
m_Grid.InsertColumn(SECOND_ORINARY, "名称", 125, 2);
m_Grid.SetHeaderAlign(SECOND_ORINARY, HDF_CENTER);
m_Grid.SetColumnAlign(SECOND_ORINARY,HDF_LEFT);

//第3列为button
m_Grid.InsertColumn(THIRD_BUTTON, "按钮", 125, 2);
m_Grid.SetHeaderAlign(THIRD_BUTTON, HDF_CENTER);

//第4列为combbox
m_Grid.InsertColumn(FOURTH_COMBBOX, "选项", 125, 2);
m_Grid.SetHeaderAlign(FOURTH_COMBBOX, HDF_CENTER);

//第5列为进度条
m_Grid.InsertColumn(FIVETH_PROGRESS_BAR, "进度", 125, 2);
m_Grid.SetHeaderAlign(FIVETH_PROGRESS_BAR, HDF_CENTER);

添加行

添加一行数据

m_Grid.CreateRow(m_Grid.GetColumnCount());
m_Grid.AddRow(pBCGRow, FALSE);

为单元格赋值

CBCGPGridRow *pRow = …
nCol为列索引号
CBCGPGridItem *pItem = pRow->GetItem(nCol);
CString strValue(“测试值”);

// checkbox列赋值
bool bCheck = true;
CBCGPGridCheckItem* pCheckItem = dynamic_cast<CBCGPGridCheckItem*>(pItem);
if (!pCheckItem)
{
	pCheckItem = new CBCGPGridCheckItem (bCheck);
	pRow->ReplaceItem (nCol, pCheckItem);
}
else
{
	pCheckItem->SetState(bChecked);		
}

// 普通列赋值
pItem->AllowEdit(FALSE);
pItem->SetValue(strValue.GetString());

// 赋值button

//combbox赋值
pItem->AddOption ("apple");
pItem->AddOption ("banana");
pItem->AddOption ("pear");
pItem->SetValue (strValue.GetString());

//进度条列赋值为10%
pItem->SetDataBar(10);
pItem->SetData(10);
pItem->AllowEdit(FALSE);
//pItem->Redraw();
### 解决 CBCGPGridCtrl 控件中文本居中的问题 为了实现 `CBCGPGridCtrl` 中的文本居中,可以重载绘制函数并调整其内部逻辑来控制文本的位置。下面是一个具体的解决方案: #### 方法一:通过自定义绘制方式实现文本居中 可以通过继承 `CBCGPGridCtrl` 并覆盖 `OnDrawCell` 函数,在该函数内设置文本对齐属性。 ```cpp class CMyGridCtrl : public CBCGPGridCtrl { public: virtual void OnDrawCell(CDC* pDC, const CRect& rect, int nRow, int nCol, BCGPGRIDCELLTYPE type); }; void CMyGridCtrl::OnDrawCell(CDC* pDC, const CRect& rect, int nRow, int nCol, BCGPGRIDCELLTYPE type) { CString strText; GetItemText(nRow, nCol, strText); // 设置文本格式为中心对齐 CDC dcMem; dcMem.CreateCompatibleDC(pDC); CFont *pOldFont = (CFont*)dcMem.SelectObject(&m_Font); CSize sizeText = pDC->GetTextExtent(strText); // 计算中心位置 CPoint ptCenter(rect.left + ((rect.Width() - sizeText.cx) / 2), rect.top + ((rect.Height() - sizeText.cy) / 2)); // 绘制背景 CBrush brushBack(m_BackgroundColor); pDC->FillRect(&rect, &brushBack); // 绘制文本 pDC->SetTextAlign(TA_CENTER | TA_BASELINE); pDC->SetTextColor(m_TextColor); pDC->TextOut(ptCenter.x, ptCenter.y, strText); dcMem.SelectObject(pOldFont); } ``` 此代码片段展示了如何创建一个新的网格控件类 `CMyGridCtrl` 来替代默认的 `CBCGPGridCtrl` 类,并在其 `OnDrawCell` 成员函数里实现了文本居中的功能[^1]。 另外一种更简单的方法是在初始化时调用 `SetDefaultCellStyle` 或者针对特定使用 `SetColumnStyle` 来指定单元格样式为居中式样。 #### 方法二:利用内置风格选项 如果不想修改源码,则可以在初始化阶段配置好表格视图的相关参数: ```cpp // 假设已经有一个名为 m_Grid 的 CBCGPGridCtrl 对象实例化完成. m_Grid.SetExtendedStyles(GS_EX_GRIDLINESVERTICAL | GS_EX_GRIDLINESHORIZONTAL | GS_EX_ALWAYSSHOWSELECTION | GS_EX_AUTOSIZECOLUMNWIDTH); for (int i = 0; i < columnCount; ++i){ m_Grid.SetColumnAlignment(i, DT_CENTER); } // 如果需要全局应用到所有行也可以这样做: m_Grid.SetDefaultCellStyle(DT_VCENTER|DT_SINGLELINE|DT_CENTER); ``` 上述操作会使得整个表格内的数据都按照水平和垂直方向上的居中方式进行显示[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值