• wtl重载 CListViewCtrl,及其用法。


    1.控件源码:ColorListCtrl.h

    ////////////////////////////////////////////////////////////////////////////////
    // 自己的ListBox
    // 
    // author  yuanyc
    // date    2012.01.12
    // Copyright (c) 2012. 中软万维
    //
    ////////////////////////////////////////////////////////////////////////////////
    #ifndef ColorListCtrl_H 
    #define ColorListCtrl_H 
    
    #include "../stdafx.h"
    #include <map>
    using namespace std;
    
    typedef  CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0> CColorListTraits;
    
    class CColorListCtrl 
    	: public CWindowImpl<CColorListCtrl, CListViewCtrl,CColorListTraits>
    	, public CCustomDraw<CColorListCtrl>
    {
    private:
    	typedef CWindowImpl<CColorListCtrl, CListViewCtrl, CColorListTraits> baseClass;
    public:
    	DWORD OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    	DWORD OnItemPrePaint ( int idCtrl, NMCUSTOMDRAW* pnmcd );
    	void SetItemColor(int nItem, COLORREF nColor)
    	{
    		m_mapItemColor[nItem] = nColor;
    		//RedrawItems(nItem, nItem);
    		//UpdateWindow();
    	}
    
    	void OnRButtonDown(UINT uMsg, CPoint ptx)
    	{
    		CMenu	menu;
    		menu.CreatePopupMenu();
    		menu.AppendMenu(MF_BYCOMMAND, MENU_CLEAR_LOG, _T("清除日志"));	
    
    		::GetCursorPos(&ptx);
    		int i = menu.TrackPopupMenu(TPM_RETURNCMD,ptx.x,ptx.y, m_hWnd);
    		if (i == MENU_CLEAR_LOG)
    		{
    			DeleteAllItems();
    			m_mapItemColor.clear();
    		}
    		SetMsgHandled(TRUE);
    	}
    
    
    	DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName())
    
    	BEGIN_MSG_MAP_EX(CColorListCtrl)
    		MSG_WM_RBUTTONDOWN(OnRButtonDown)
    		CHAIN_MSG_MAP_ALT(CCustomDraw<CColorListCtrl>, 1)
    		DEFAULT_REFLECTION_HANDLER()
    		END_MSG_MAP()
    
    public:
    	map<int,COLORREF> m_mapItemColor;
    };
    
    #endif /*ColorListCtrl_H*/
    

     ColorListCtrl.cpp

    #include "stdafx.h"
    #include "ColorListCtrl.h"
    #include <bkres/bkres.h>
    
    
    DWORD CColorListCtrl::OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
    {
    	return CDRF_NOTIFYITEMDRAW;
    }
    
    DWORD CColorListCtrl::OnItemPrePaint ( int idCtrl, NMCUSTOMDRAW* pnmcd )
    {
    	NMLVCUSTOMDRAW* pnmlv = (NMLVCUSTOMDRAW*) pnmcd;
    
    	map<int,COLORREF>::iterator pos;
    	pos = m_mapItemColor.find(pnmlv->nmcd.dwItemSpec);
    	if (pos != m_mapItemColor.end())
    	{
    		pnmlv->clrText = pos->second;
    	}
    	else
    	{
    		AtlMessageBox(NULL,_T("ERROR"));
    
    	}
    
    	return CDRF_DODEFAULT;
    }
    

     2.思想:1.用map来存储 键值对(行号和颜色)

                  2.重载OnPrePaint和OnPrePaint

    3.用法。

       在适当时机,如此调用,多线程,所以加了锁。

    		::EnterCriticalSection(&m_log_lock);
    		int n = m_listLog.GetItemCount();
    		m_listLog.SetItemColor(n, RGB(0,255,0));
    		m_listLog.InsertItem(n,CA2T(strprogress.c_str()));
    		::LeaveCriticalSection(&m_log_lock);
    
  • 相关阅读:
    【SICP练习】150 练习4.6
    windows已安装solr
    ps快速删除圆角图片旁白的白色区域方法
    junit学习笔记(二):hamcrest和TestSuit
    取球游戏
    【Linux操作系统分析】设备驱动处理流程
    POJ Secret Milking Machine 【网络流+二分】
    oracle 10 g 需要启动的2个服务
    jQuery也能舞出绚丽的界面(完结篇)
    HDU 2665(Kth number-区间第k大[内存限制+重数])
  • 原文地址:https://www.cnblogs.com/chunyou128/p/2322579.html
Copyright © 2020-2023  润新知