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

  • 相关阅读:
    理解.NET中的异常(二)
    路径,文件,目录,I/O常见操作汇总(一)
    使用PInvoke.NET插件为托管代码添加Win32 API签名
    使用JavaScript检测浏览器的相关特性
    javascript中的变量
    曾经的你
    WinampMy Favorite Media Player
    新的开始,认真地写博客
    log4net的各种Appender配置示例
    使用GhostDoc为代码生成注释文档
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3040085.html
Copyright © 2020-2023  润新知