栅格数据有属性表和颜表,属性表描述了像素值和该值代表的内容,同时对应颜表,表示某一个值对应的颜(如下图1)。ArcGIS中提供了对属性表和对应颜编辑的功能(如下图2)。 我们软件用MFC开发的,发现ListCtrl控件实在不好用,网上有很多重写的demo,没有到合适的,于是按照功能自己重新写了一个。 之前没自己写过控件,觉得很复杂。。。
电动车贴花主要是实现某一列单元格可编辑,网上看了一下,思路是双击那一列的时候,出现一个EditCtrl控件,输入值,按了enter键后,把EditCtrl控件的值保存到listctrl那一列中。
下面就是双击后,生成edit控件,然后再双击的地方出现,感觉就好像单元格可编辑一样。
[cpp]view plainc opyprint?
1.void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
2.{
3. LVHITTESTINFO hi;
4. hi.pt = point;
5.int n = SubItemHitTest(&hi);
6.if(n != -1)
7. {
8.// 不编辑1/2/3列
9.if(hi.iSubItem == 1 || hi.iSubItem == 2 || hi.iSubItem == 0)
10. {
钥匙胚
11. CListCtrl::OnLButtonDblClk(nFlags, point);
13. }
14. m_nRow = hi.iItem; //行
15. m_nCol = hi.iSubItem; //列
16.if(m_EditItem.m_hWnd == NULL)
17. {
18. RECT rect; //edit控件大小
电子导盲仪19. CRect cRect; //单元格的区域
20. rect.left = p = 0;
21. rect.bottom = 20;
22. rect.right = 100;
手机背光源23. m_EditItem.Create(WS_CHILD | ES_LEFT| ES_AUTOHSCROLL | ES_WANTRE
TURN | ES_MULTILINE, rect, this, 0x01);
24. m_EditItem.SetFont(this->GetFont(), FALSE);
25. GetSubItemRect(hi.iItem, hi.iSubItem, LVIR_BOUNDS, cRect);
26. m_EditItem.SetWindowText(this->GetItemText(hi.iItem, hi.iSubItem
));
27. m_EditItem.MoveWindow(&cRect, TRUE);
28. m_EditItem.SetFocus();
29. m_EditItem.ShowWindow(SW_SHOW);
30. }
31. }
32.}
相响应一下enter事件,重写PreTranslateMessage(MSG* pMsg)函数,然后保存edit 框中的数据,
[cpp]view plainc opyprint?
1.void CEditListCtrl::SetColumnText()
2.{
3. m_EditItem.ShowWindow(SW_HIDE);
4.if(m_nRow != -1)
5. {
6. CString ItemText;
7. m_EditItem.GetWindowText(ItemText);
8.this->SetItemText(m_nRow, m_nCol, ItemText);
9. }
10. m_nCol = m_nRow = -1;
11.
12.}
上面就实现了可编辑的操作;
下面是属性对应颜,把颜显示在单元格中,本来想修改颜的,觉得太复杂了,改颜就用了原来的按钮功能。
单元格的颜还是重写了OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)函数
[cpp]view plainc opyprint?
1.else if((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
圈套器
2. {
3.int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec );
4.long col = this->GetItemData(nItem);
5.switch(pLVCD->iSubItem)
6. {
7.case 0:
8. pLVCD->clrTextBk = col;
9.break;
10.default:
11. pLVCD->clrTextBk = RGB(255,255,255);
12.break;
13. }
14.//继续
15. *pResult = CDRF_DODEFAULT;
16. }
因为颜值是保存在相应行的数据中,通过setItemData和GetItemData保存和获取。所以上述就可以对每一行第一列的单元格赋值了。
最后效果图如下:
MFC控件——ListCtrl控件[翻译]
声明:
1、本文为翻译文章,水平有限,错误之处,烦请指正(***********************)。
2、使用VS2005,所以在某些细节上和原作者不太一样 3、工程中使用图片和作者略有不同
4、文章如有争议,以原作者文章为准
5、转载请标明出处
原文链接:www.functionx/visualc/controls/listcontrol.htm
一、ListControl概述
概述:
ListCtrl控件由四种列表的显示方式构成,它最典型的用法是使用icon来显示。ListCtrl 通常显示下面四种项目(item): Icons:控件显示项的列表,使用32*32(像素)大小的icons,推荐使用这么大小的icon,如果你想用图标来概述你的观点。
Small Icons:和剩下的两项相似的想法,它使用16*16(像素)大小的图标来显示一个单一的列表项。再次,没有提供关于这个列表的详细说明。这种列表是用来组织和其他主题在不同的列,如果列表有序,序列编排为按字母顺序从左到右。
List:这种列表,使用small icons,也是组织列;这种情况下,在第二列填充之前必须填充第一列。如果列表有序,序列编排为自顶向下的顺序。
Report:安排项的目的是提供列表开发者的信息。
二、实践学习:List Control介绍
1.用Visual C++或者Visual Studio 创建一个名为DeptStore2的MFC应用程序2.基于Dialog创建它
3.删除“TODO: 在此放置对话框控件。”行和确定按钮。
4.将“取消”按钮的标题改为“关闭”
(1)创建List Control
ListCtrl控件在MFC类库用CListCtrl类来实现。在设计的时候,创建一个ListCtrl,在toolbox中点击按钮后单击对话框中想要放置的区域。通常来说,需要拉伸默认ListCtrl的默认大小,因为它通常需要一个更大的区域。
为了编程创建一个ListCtrl,声明CListCtrl变量或者CListCtrl指针。初始化控件调用它的Create方法,示例如下:edm石墨
BOOL CDeptStore2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// ...
// TODO: 在此添加额外的初始化代码
CListCtrl *lstCtrl = new CListCtrl;
lstCtrl->Create(WS_CHILD | WS_VISIBLE,
CRect(10, 10, 320, 280), this, 0x285);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
译者提示:这是内存泄露的做法,也许作者意图只是为了说明应在OnInitDialog添加代码,正确的做法在CDeptStore2Dlg中添加变量m_lstCtrl,之后在OnInitDialog中new,最后在析构函数中delete。
在之前提到,ListCtrl可以显示四种情况之一,在设计的时候应该在窗口属性中指定想要的风格,在属性中选择combo box,默认值是Icon,他可能是情况是: