在写这篇文章之前,xxx已经写过了几篇关于改颜色控件主题的文章,想要了解的朋友可以去翻一下之前的文章
栅格数据有属性表和颜色表,属性表述描了素像值和该值代表的容内,同时对应颜色表,表示某一个值对应的颜色(如下图1)。ArcGIS中供提了对属性表和对应颜色辑编的能功(如下图2)。
我们软件用MFC发开的,现发ListCtrl控件其实不好用,网上有很多重写的demo,没有找到适合的,于是按照能功自己从新写了一个。
之前没自己写过控件,得觉很庞杂。。。
主要是现实某一列单元格可辑编,网上看了一下,路思是双击那一列的时候,涌现一个EditCtrl控件,输入值,按了enter键后,把EditCtrl控件的值存保到listctrl那一列中。
面下就是双击后,生成edit控件,然后再双击的地方涌现,觉感就好像单元格可辑编一样。
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { LVHITTESTINFO hi; hi.pt = point; int n = SubItemHitTest(&hi); if(n != -1) { // 不辑编1/2/3列 if(hi.iSubItem == 1 || hi.iSubItem == 2 || hi.iSubItem == 0) { CListCtrl::OnLButtonDblClk(nFlags, point); return; } m_nRow = hi.iItem; //行 m_nCol = hi.iSubItem; //列 if(m_EditItem.m_hWnd == NULL) { RECT rect; //edit控件巨细 CRect cRect; //单元格的区域 rect.left = rect.top = 0; rect.bottom = 20; rect.right = 100; m_EditItem.Create(WS_CHILD | ES_LEFT| ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, 0x01); m_EditItem.SetFont(this->GetFont(), FALSE); GetSubItemRect(hi.iItem, hi.iSubItem, LVIR_BOUNDS, cRect); m_EditItem.SetWindowText(this->GetItemText(hi.iItem, hi.iSubItem)); m_EditItem.MoveWindow(&cRect, TRUE); m_EditItem.SetFocus(); m_EditItem.ShowWindow(SW_SHOW); } } }
相响应一下enter事件,重写PreTranslateMessage(MSG* pMsg)函数,然后存保edit框中的数据,
void CEditListCtrl::SetColumnText() { m_EditItem.ShowWindow(SW_HIDE); if(m_nRow != -1) { CString ItemText; m_EditItem.GetWindowText(ItemText); this->SetItemText(m_nRow, m_nCol, ItemText); } m_nCol = m_nRow = -1; }
下面就现实了可辑编的作操;
面下是属性对应颜色,把颜色表现在单元格中,本来想改修颜色的,得觉太庞杂了,改颜色就用了来原的按钮能功。
单元格的颜色还是重写了OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)函数
else if((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage ) { int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec ); long col = this->GetItemData(nItem); switch(pLVCD->iSubItem) { case 0: pLVCD->clrTextBk = col; break; default: pLVCD->clrTextBk = RGB(255,255,255); break; } //续继 *pResult = CDRF_DODEFAULT; }
因为颜色值是存保在响应行的数据中,通过setItemData和GetItemData存保和获得。所以上述便可以对每一行第一列的单元格赋值了。
最后效果图如下:
文章结束给大家分享下程序员的一些笑话语录:
一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")