颜色控件【MFC】自己写一个ListCtrl控件(实现栅格属性表的编辑)-java教程

在写这篇文章之前,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说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")

posted @ 2013-04-24 13:39  xinyuyuanm  阅读(529)  评论(0编辑  收藏  举报