• 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);
    
  • 相关阅读:
    0455分发饼干 Marathon
    0078子集 Marathon
    python 实现JWT Marathon
    0376摆动序列 Marathon
    0216.组合总和 III Marathon
    028实现strStr() Marathon
    0738单调递增的数字 Marathon
    0051N皇后 Marathon
    0047全排列II Marathon
    0037解数独 Marathon
  • 原文地址:https://www.cnblogs.com/chunyou128/p/2322579.html
Copyright © 2020-2023  润新知