wtl重载 CListViewCtrl,及其用法。
生活随笔
收集整理的這篇文章主要介紹了
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);?
轉載于:https://www.cnblogs.com/chunyou128/archive/2012/01/14/2322579.html
總結
以上是生活随笔為你收集整理的wtl重载 CListViewCtrl,及其用法。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java嵌套类的使用
- 下一篇: 转PHP5+APACHE2.2配置