自己写一个ListCtrl控件(实现栅格属性表的编辑)

栅格数据有属性表和颜表,属性表描述了像素值和该值代表的内容,同时对应颜表,表示某一个值对应的颜(如下图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,他可能是情况是:

本文发布于:2024-09-22 19:28:27,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/162047.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:控件   列表   颜色   属性   使用   显示   对应
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议