下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 8830|回复: 3
打印 上一主题 下一主题

又是垃圾,CListCtrlEx Base CListCtrl

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-23 21:29:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// ---------------------------------------------. q3 e. p: [  R8 ]) K& k
// ListCtrlEx.h
! r- {6 \/ J+ c% ^" j8 O// ---------------------------------------------
3 h6 ]6 w  ~( T: t8 J2 }#pragma once
; N$ \) i! S) U5 O* x0 g9 z
. z* w5 a' h) ?! t$ i) z, H9 y// CListCtrlEx
; F% G* l* T, {0 H" D! K+ f( [class CListCtrlEx : public CListCtrl
6 z& R& F* Z6 T2 Z% ~+ o0 O{' o- I; k# @8 s
    DECLARE_DYNAMIC(CListCtrlEx)
# ]9 q# X3 Q3 M& epublic:
# x3 M) ?+ H: ]' F    CListCtrlEx();
& @4 G( {8 [# h- I7 ~1 \    virtual ~CListCtrlEx();
# C* Q, I: z+ E0 Xprotected:
- |" n4 O' F* T- j0 h" |    DECLARE_MESSAGE_MAP()! ^* h: R5 z' g  h' j% u8 _  z# y8 T
    CListCtrl* pThis;4 Z. f" `- s! F6 \- L& S
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);6 F2 O! [8 ~. d( x9 X' I1 ^
private:
) w) O  F$ E1 c    struct ItemDataEx {& o6 E5 v1 M% D  Y* Q
        LPARAM SrclParam;
4 R( b' A0 b1 k$ \; `        COLORREF clrItemTextColor;
3 h. T4 o( v! W        COLORREF clrItemBackColor;) X! @2 T6 w- q$ `. L  O
    };
3 x# o+ ^0 B! o/ m    COLORREF m_clrHighLight;
) s$ Y# [, r5 C+ E* i    COLORREF m_clrHighLightEdge;
$ ?( B$ M5 z: spublic:
, l- `; o. s; ^; D3 w* C6 A    // 新增方法
9 U0 W* c4 ^' k  _, R    COLORREF SetItemTextColor(int nItem,COLORREF clrText);
7 O( a6 _/ u7 j    COLORREF GetItemTextColor(int nItem) const;3 w$ [/ K% C2 w" e4 ]+ t
    COLORREF SetItemBackColor(int nItem, COLORREF clrBack);; G% U+ T; X" a" A0 g0 \
    COLORREF GetItemBackColor(int nItem) const;' G; q  z0 L$ M' v/ g' M$ W5 h
    COLORREF SetHighLightColor(COLORREF clrHighLight);
- P1 i1 K! x- E    COLORREF SetHighLightEdgeColor(COLORREF clrHighLightEdge);
: V" J3 e; P& ?    COLORREF GetHighLightColor(void) const;+ l7 F9 o0 b( i& q
    COLORREF GetHighLightEdgeColor(void) const;
) Q, D, M# G! @, |* J4 |    int GetItemImage(int nItem);: V* ~" ]4 P" U/ q
    BOOL SwitchItem(int nItem1, int nItem2);+ ^% ]1 n' c: M
    BOOL MoveItemUp(int nItem);$ S# ?7 Y- X& b% @9 `
    BOOL MoveItemDown(int nItem);3 @: r" p3 r- w) Z2 S
    // 重写原来的方法' }& X& {3 u7 ?/ d5 ]
    DWORD_PTR GetItemData (int nItem) const;
4 H3 q! `7 e0 i  X    BOOL SetItemData (int nItem, DWORD_PTR dwData);9 K1 w% u% ]4 q( E
    int InsertItem (const LVITEM* pItem);+ e9 V1 Y2 ~4 S) O
    int InsertItem (int nItem, LPCTSTR lpszItem);  u: T" y% Z# D2 W7 _# D7 [7 \6 t/ I
    int InsertItem (int nItem, LPCTSTR lpszItem, int nImage);
5 J# c2 t$ r9 r  \6 G; S& N    int InsertItem (UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam);
, p6 w4 v9 r3 `6 n' P$ y0 |    BOOL DeleteItem (int nItem);
- x0 v# g, a  L1 D  u+ F& n& K    BOOL DeleteAllItems ();
5 a8 V! d: n" t2 c4 G) p0 B2 N, z  u    BOOL GetItem(LVITEM* pItem);
5 g% X" b) r, R    afx_msg void OnDestroy();! U% v) B4 z6 h% \
    afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);8 o4 }" s' t. U; w
};
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
 楼主| 发表于 2005-2-23 21:30:00 | 只看该作者

// --------------------------------------------- ) h0 }6 J+ l/ ~( f& Z! H+ P5 k// ListCtrlEx.cpp8 `+ D" Q5 \. Y3 |# c( ^ } // --------------------------------------------- , e$ _/ k3 W& n; a- _" h/ @' b// ListCtrlEx.cpp : 实现文件/ C6 {, T. K1 w) Z" ?3 T //

#include "stdafx.h" " U8 v' J! g9 V* X; e. y a#include "CreateNewClass.h" * R8 i0 `5 ?; y#include "ListCtrlEx.h" " e% U4 l0 l A/ t0 o( @#include ".\listctrlex.h"

6 ~) l& e4 K' {. U// CListCtrlEx

IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl) + i0 D+ k$ d. S1 j2 q/ cCListCtrlEx::CListCtrlEx() : k( ^$ c) c. U$ x4 N9 t& \ E{ % ?4 w% D4 j4 |0 g# b1 j1 d; x // 用于调用基本的方法 ' }) z6 ]' h9 n& `; }& ? pThis = (CListCtrl*)this;, \" j% v! r" q8 r1 t // 默认的选中框颜色 / G7 W- U# N6 H4 a6 k m_clrHighLight = 0xF1DACC; 7 F7 o, Q1 j9 N* e m_clrHighLightEdge = 0xC56A31; 0 E; i9 b2 l4 f% F& c3 h0 h. Z}

CListCtrlEx::~CListCtrlEx()8 }) B' x: z4 l. y5 ^1 S2 v/ F5 [ {

}

: y G; P7 k* T8 k& v0 F0 ] BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)5 _$ m7 B3 E o4 G! M( J, x& d, a4 O ON_WM_DESTROY() % V! @ } J) J3 ? ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) 9 R/ v6 g! Y ~# dEND_MESSAGE_MAP()

// CListCtrlEx 消息处理程序

# } c8 v/ n+ m x3 T" f8 B, g) w COLORREF CListCtrlEx::SetItemTextColor(int nItem,COLORREF clrText) 5 C# R, X8 M- s' @5 _5 t) r+ k: q X{( ]2 F" |( [/ \% M7 H& ^7 z( p COLORREF clr = GetItemTextColor(nItem);% J# E, m' T# d: G ItemDataEx *pData = (ItemDataEx*)pThis->GetItemData(nItem); 3 R% `* g% }+ K7 { pData->clrItemTextColor = clrText; | t% @& A7 X* M% V return clr; 6 j% M3 a1 Q. T5 b/ H' y}

COLORREF CListCtrlEx::GetItemTextColor(int nItem) const & d1 ?4 H8 a0 n{! H' J( j! j: r4 i/ G ItemDataEx *pData = (ItemDataEx*)pThis->GetItemData(nItem); + N( `9 b) ^* c: V1 X" O return pData->clrItemTextColor; ! }+ S r" E+ e- m}

COLORREF CListCtrlEx::SetItemBackColor(int nItem, COLORREF clrBack)) [. z3 R* C' |+ a, a4 a# D) H% i! e {" P# [3 K+ {3 N ? COLORREF clr = GetItemBackColor(nItem); 5 }& z& c; v. ^4 k. H& | ItemDataEx *pData = (ItemDataEx*)pThis->GetItemData(nItem); 0 F( R" S$ U3 ~0 _6 L pData->clrItemBackColor = clrBack; 4 h- S& O3 p% T return clr; . B. E" n; O0 i1 Y2 V}

COLORREF CListCtrlEx::GetItemBackColor(int nItem) const * S/ F: V9 b* ?' Q4 w{: i7 j+ ?2 Y: M/ @ ItemDataEx *pData = (ItemDataEx*)pThis->GetItemData(nItem); ! T }1 {. ^ ?2 Q7 ?& t& z$ U9 l return pData->clrItemBackColor; 9 O7 V) @7 O ~1 z/ B}( H. J6 z& J$ _, C1 E' _5 s DWORD_PTR CListCtrlEx::GetItemData (int nItem) const. E7 T7 F2 q; S { A* i- F! t3 ^ if (nItem >= GetItemCount())7 L$ B& b5 x% t# x1 [0 {$ Y* J { : U$ j+ M. X0 B return 0; h( L, J7 O5 k; N; O- H& { }* e( i" m) @* D CListCtrl* pThis = (CListCtrl*)this;. g( k d7 b: ?) n% M" X DWORD_PTR Data = pThis->GetItemData(nItem); # k* F- p4 p# n3 J$ b return ((ItemDataEx*)Data)->SrclParam;$ ]( o' G2 D( P7 k8 N9 Z. B }4 g9 F: ?1 l, S BOOL CListCtrlEx::SetItemData (int nItem, DWORD_PTR dwData) : n. n+ q" n! ]{ 1 u: D Z, t' c9 l" m4 t if (nItem >= GetItemCount())8 D! t, y" x6 ?. }; e { $ K+ ?- g2 C: E return 0; + L& J a4 M( h, |( W0 f }$ S6 ]2 Q8 E {7 f. [8 A CListCtrl* pThis = (CListCtrl*)this; . i& Q0 }" o% X+ ` DWORD_PTR Data = pThis->GetItemData(nItem);* B( q6 ~7 H: Y2 l ASSERT(Data); * v! ?& U3 C, k" J1 k ((ItemDataEx*)Data)->SrclParam = dwData;) U' a; {& d; |. q' s, s return 1;) F3 u" c) h5 a" H- E/ S& I( h" t }/ J' Z, l5 K/ m- h' p8 H1 S# y int CListCtrlEx::InsertItem (const LVITEM* pItem)% G3 v& K$ | |+ s' y# U; u { / |5 E, @7 y2 v% R8 r int nReturn = pThis->InsertItem(pItem); & d/ o- K5 v, ^7 _. k ItemDataEx *pData = new ItemDataEx;( T3 Q- l$ N+ g5 [+ u' y6 G // 设置默认颜色: Z' g4 D4 t6 |: v# n8 M) p2 i pData->clrItemBackColor = 0xFFFFFF;//pThis->GetTextBkColor();' E9 k* t# Z- N. B pData->clrItemTextColor = 0x000000;//pThis->GetTextColor();& g! v- a) k& Y7 ~ pData->SrclParam = pItem->lParam; . c9 X* H5 R6 n# T# y0 Y( N pThis->SetItemData(pItem->iItem,(DWORD_PTR)pData); 1 x, b/ q7 F. v- w" W; V return nReturn;2 l4 s- c& g m+ c } - l7 v N5 M) f3 I$ Pint CListCtrlEx::InsertItem (int nItem, LPCTSTR lpszItem)5 c H. p K5 X6 d2 y {7 t) l+ m4 S3 V) Z o LVITEM Item; * d0 c/ p! P. n- S/ g memset(&Item,0,sizeof(LVITEM));# d! d. Z6 Z8 s \) p8 i) J Item.pszText = new TCHAR[strlen(lpszItem)+1]; ) T; W k+ C {8 @/ }( h strcpy(Item.pszText,lpszItem); % j% \1 Q' \$ O7 Q- k% y- i Item.iItem = nItem; 1 G# D. C7 V1 c1 z& p. W3 q# m, [# q Item.lParam = 0; ; R$ l. m( }& r; a9 a* A5 F Item.mask = LVIF_TEXT |LVIF_PARAM;; r; Y7 Y& l- |) V# L3 H8 x BOOL bReturn = InsertItem(&Item);5 V) ]' Y4 R( v/ H7 I4 n, L delete Item.pszText; : o6 k9 y- H# m" h$ d return bReturn; {8 R7 F; i/ x7 m& A3 O. s }7 z5 E8 a M+ |& `6 Y int CListCtrlEx::InsertItem (int nItem, LPCTSTR lpszItem, int nImage)( r1 ~0 W0 A7 n! O { 5 J8 H4 q- v3 _( @" Q LVITEM Item; $ @1 e; l: J: J memset(&Item,0,sizeof(LVITEM)); 1 J2 m* ~9 {8 L9 B3 |& X) T/ j Item.pszText = new TCHAR[strlen(lpszItem)+1];2 O- j" D3 ?2 e8 ]4 ?( D, _ strcpy(Item.pszText,lpszItem);' l& g* ]0 t* i Item.iItem = nItem;# j0 d& ?# w" G9 j/ ~ R f Item.lParam = 0;+ m$ D9 P u2 [ Item.iImage = nImage;2 V% \3 [/ N$ q% N, O" T Item.mask = LVIF_TEXT |LVIF_PARAM|LVIF_IMAGE; # Z6 z5 o$ h8 i R BOOL bReturn = InsertItem(&Item);% E7 C' c8 U* r4 U; y delete Item.pszText; 9 {4 A7 g. q' {: V/ H return bReturn; 0 ^1 A8 A5 U2 ]) a} 7 F; {% r$ w1 A) e7 Pint CListCtrlEx::InsertItem (UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam) ( H0 c; l( c8 [" a. }6 L' U{ * L" ?3 |! v, `3 B$ O4 Z3 t LVITEM Item;; x: J" ^ [) D7 D& @6 c memset(&Item,0,sizeof(LVITEM));: `2 o) S5 \; G. n; Y! l Item.pszText = new TCHAR[strlen(lpszItem)+1];6 a9 O9 [9 ]% y strcpy(Item.pszText,lpszItem);7 M/ D- j! z, K# | Item.state = nState;% Q9 u( x) E# g, N Item.stateMask = nStateMask;( @! B8 e% @2 W B1 T) q Item.iItem = nItem;5 Y" f1 R/ M% W0 n* R: X6 O- J Item.lParam = lParam; 7 K1 ?0 r. ~7 U6 ` Item.iImage = nImage;' a3 x; q/ |8 T Item.mask = nMask;3 d! ~9 P& ~: a1 y& k) d$ u6 p! ~8 x BOOL bReturn = InsertItem(&Item);8 q) _4 x: A. {5 L5 g5 y) r delete Item.pszText; : ?8 G Z8 R) q' W. \* M' g return bReturn;/ |4 [0 k4 E$ S: x0 f" a } 1 m7 m [( q& X) F& C( z) KBOOL CListCtrlEx:eleteItem (int nItem) ; b" G5 j7 U& V{6 D; m: j' i* O6 @ void* pDataEx = (void*)pThis->GetItemData(nItem); 8 s. `0 ^4 V- n- y' E- X+ D if(pDataEx != NULL) 3 u9 O v) y h9 @; R { % B1 j( M9 h. P1 I8 K delete pDataEx;& A, E" H! c2 n: j } , r& h, @- C; B3 D$ w. V' W" H9 q& u return pThis->DeleteItem(nItem); 6 y( l" |1 J' C} $ w+ o9 m0 U6 f. x% M' C4 @' eBOOL CListCtrlEx:eleteAllItems () ; O& C* H3 i5 ?3 a7 ?! b5 }7 y( d2 J{3 a$ A) }3 p3 U( S& B2 q. B" o* H int nCount = GetItemCount();4 @/ W0 L: m4 }2 h$ O5 j4 Z n for (int i = 0;i<nCount;i++): L& [) T2 P, Y; }' ~7 A }0 Y {7 U: z$ Z. L e( [ if(!DeleteItem(0)) ) v, F: P7 I0 G9 R' x7 n& E o {" F) u" u* g4 X; ^ return 0; # ^% s. S( G | _# @/ ^" c; V } 1 J B1 U3 s7 T } ( e2 F6 {+ `; H6 a return 1; $ ~8 H F* p! Q A- H) H} 9 S5 K6 B# m% | R% F0 p. rBOOL CListCtrlEx::GetItem(LVITEM* pItem) 4 i8 G& N8 c3 F* d. W" e& \{ ; O/ t; e1 b9 L; h/ R BOOL bReturn = pThis->GetItem(pItem); 3 [5 D4 _& O- w3 e/ t if (pItem->lParam) 4 M* w: V/ f9 u5 T5 r {& U- n+ m2 k$ V; h/ n4 _' s) ` pItem->lParam = ((ItemDataEx*)pItem->lParam)->SrclParam;, c! E7 M9 c t" v$ T }

return bReturn;+ H! ~4 x; U2 o- V+ w# f! k* X' k } 4 e# I. x, K2 hvoid CListCtrlEx::OnDestroy() ! [$ G3 j. F! ?1 _) C; w; [{ # K0 k% W' {9 m; W. } // 关键是清除申请的内存空间7 x7 _3 o8 Q3 V DeleteAllItems();( v4 L3 U3 b+ @5 K' N! c CListCtrl::OnDestroy(); q; G1 c- C8 {+ v8 A}

BOOL CListCtrlEx::SwitchItem(int nItem1, int nItem2)3 F- b7 _" O h4 a1 ?- y { ! t k) \3 _1 f# R, X5 S if (nItem1 == nItem2 || nItem1 >= GetItemCount() || nItem2 >= GetItemCount() || nItem1 < 0 || nItem2 < 0) ' K4 g7 E1 K) m% P: j0 B2 J+ j/ T {) P5 c, P$ A3 y6 t; i2 p return 0;! o# j6 F$ j" k) @1 A }; A- ~2 i( `6 h' W8 c LVITEM ItemData1,ItemData2; @0 b: }( d: C6 g2 d) Z5 k int ItemLength1 = pThis->GetItemText(nItem1,0).GetLength();6 Y! B! ~, r4 G5 o7 S, w8 f int ItemLength2 = pThis->GetItemText(nItem2,0).GetLength(); * i, ^+ m% C5 m ItemData1.pszText = new TCHAR[ItemLength1+1]; 6 A% r* @) e1 q. | ItemData2.pszText = new TCHAR[ItemLength2+1]; - a2 K/ W5 i- @+ A! B( L ItemData1.cchTextMax = ItemLength1+1; ' H* j6 A1 N; S0 _$ q ItemData2.cchTextMax = ItemLength2+1; - X7 J$ n4 O. P ItemData1.iItem = nItem1;) G! K6 c+ u1 m. ^; h- z- `% U, k ItemData2.iItem = nItem2; % T1 b# Q# }) c% m+ [" \ ItemData1.iSubItem = ItemData2.iSubItem = 0;, N- M* f9 v' ^( y( f ItemData1.mask = ItemData2.mask = LVIF_TEXT |LVIF_PARAM|LVIF_IMAGE|LVIF_STATE;

pThis->GetItem(&ItemData1);. w1 E8 S# @. {) q9 B7 Y* Q pThis->GetItem(&ItemData2); 3 h1 B& Z. n0 M2 X5 Z( a // 交换数据 6 u0 @+ J$ u% m9 K7 J3 t- P) G ItemData1.iItem = nItem2;4 }2 g0 o B+ b4 t* f# l5 S ItemData2.iItem = nItem1; 2 q0 @& ?. `3 w) r2 A. t- D pThis->SetItem(&ItemData1); , u' I- K) O6 w9 q% { pThis->SetItem(&ItemData2);

delete ItemData1.pszText; ! s2 w9 S* ?: z; Q- K3 { delete ItemData2.pszText; ! a& g/ v- r- {! g# Z1 Z ~/ i. p$ \ // 得到报表模式的列数7 M" @. b9 r" j) a int nColCount = pThis->GetHeaderCtrl()->GetItemCount();: e7 H2 ]. q- z CString strBuffer; 3 M. z) h9 R! D' c for (int iSubItem = 1;iSubItem < nColCount;iSubItem++) & v8 R1 l- K) `* r2 D& C. I { 8 F. y' z2 o) Q# S& ~& t strBuffer = pThis->GetItemText(nItem1,iSubItem);* ~# j3 ?5 T1 M pThis->SetItemText(nItem1,iSubItem,pThis->GetItemText(nItem2,iSubItem)); 9 ^4 F5 y+ ]+ ~ pThis->SetItemText(nItem2,iSubItem,strBuffer);" i3 N0 J3 n$ T/ E( K' @$ d } & u7 I$ r1 z- J3 V // 把原来的选中状态也转移过去) ?; s/ c0 N& V% w5 F // 不知道为什么这个属性没有体现在LVITEM结构中…… * P* S; B6 z3 ~5 [; v bool bItemSelected1 = GetItemState(nItem1,LVIS_SELECTED) == LVIS_SELECTED;/ x( I3 x5 M5 K$ ^) R I+ V( s- | bool bItemSelected2 = GetItemState(nItem2,LVIS_SELECTED) == LVIS_SELECTED;

SetItemState(nItem1,bItemSelected2?LVIS_SELECTED:0,LVIS_SELECTED); ! {2 S* M: @1 b+ h% B SetItemState(nItem2,bItemSelected1?LVIS_SELECTED:0,LVIS_SELECTED);# ~+ |0 L: s2 X$ y! K return 1;% i2 s: s- C$ O! V$ }9 [7 M }

BOOL CListCtrlEx:reCreateWindow(CREATESTRUCT& cs)# i' \1 b$ g, w8 ]/ z {2 m4 A. \" S6 e: V% T* r: R // 本类报表模式专用' q8 t& S( C5 ^/ Z8 g2 b" p, m; U cs.style |= LVS_REPORT ; 4 A7 d5 O" Z* `8 |% m" l // cs.dwExStyle |= LVS_EX_FULLROWSELECT; ) P* z; c9 \2 q* p return CListCtrl:reCreateWindow(cs); S* l2 p6 V7 t) B% i( I# B }

3 q. P% }1 Z6 e5 u' N COLORREF CListCtrlEx::SetHighLightColor(COLORREF clrHighLight) 0 p. p. H1 e0 W3 m% m- L" p5 Y{ 6 h8 Z( N) ^# Q% d- [$ v COLORREF clr = GetHighLightColor();1 N% c, c8 s, Q m_clrHighLight = clrHighLight; 7 L2 B8 n3 D8 P% D return clr;4 ~: J; E- r5 U8 h. P+ X }

COLORREF CListCtrlEx::SetHighLightEdgeColor(COLORREF clrHighLightEdge) 7 ^; _4 s, g- x. w{ / X. ]- T9 V* B- p5 W: I; c6 S COLORREF clr = GetHighLightEdgeColor(); ; u6 q& \, L: q, _ m_clrHighLightEdge = clrHighLightEdge; # K( p5 M/ x4 U" o6 j( I5 s7 t return clr;3 \0 c! E4 H" @) p6 \( W. |2 T }

该用户从未签到

3
 楼主| 发表于 2005-2-23 21:30:00 | 只看该作者

COLORREF CListCtrlEx::GetHighLightColor(void) const8 u4 ], @1 U" ~2 K. ?1 ` { ) o+ e2 k' I: k1 g return m_clrHighLight;' k! k# l% o3 W; p9 V5 H0 _! \) I }

COLORREF CListCtrlEx::GetHighLightEdgeColor(void) const 3 a) h6 X/ {) r. |{ ; p3 Z# {, O' b9 t7 {* r return m_clrHighLightEdge; , u, b. T; w _* y}

int CListCtrlEx::GetItemImage(int nItem)* X6 G( `8 F) i. |9 t { - F8 G8 v7 F4 I5 s+ s8 D& R LVITEM ItemData; 5 p9 n3 Z8 o; |9 Q6 d ItemData.iItem = nItem;/ S6 \# d8 B& z" c! i( T# P, r& x ItemData.iSubItem = 0;, J) P9 \2 R* m+ z" x2 _ ItemData.mask = LVIF_IMAGE;! ^8 T8 z( ^4 C6 c. X pThis->GetItem(&ItemData); - _/ A- r0 b2 m/ }2 @$ j! W return ItemData.iImage;' @" i; v- G; c5 }3 @ }

BOOL CListCtrlEx::MoveItemUp(int nItem) % |1 k$ V" x' p1 s6 z7 I{% f+ m% P( f/ |* a. \ if (nItem < 1 || nItem >= GetItemCount()) " Y/ B6 j4 X. a4 b3 P { 1 e8 H) v" o( ?& S$ s H return 0; . k Z2 ^/ a5 _: h- Z0 _1 l }" U1 Z9 ~/ Q5 c0 N* G) y4 n T- F ~ return SwitchItem(nItem,nItem - 1);* q% u; k/ g3 ]1 V, D }

BOOL CListCtrlEx::MoveItemDown(int nItem)* w: I+ U' A0 W4 X {1 ^ X; S' c# {1 V' _: P if (nItem < 0 || nItem >= GetItemCount() - 1) ]' @. O/ |; D$ n2 [- w3 Y5 c8 K {% Z6 `# X% U' t return 0;- o, A* y7 `: v! l }% K i5 e# {: ^. Y2 w4 d6 q return SwitchItem(nItem,nItem + 1); $ \2 L9 S% M+ P}

void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) 6 E9 z" B& W1 z6 g, A4 {{ # @: ^' B( b' k( P! N9 c3 H NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

*pResult = CDRF_DODEFAULT;

if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT) ( P0 z- L) ~% {- H4 D" T( A {# g) M& Y7 Y& X *pResult = CDRF_NOTIFYITEMDRAW; 1 e* H) X! e: C. t7 ?8 S" w1 Y. B+ w } 0 D+ x6 e* `! f) O+ ?! k" h else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) d" i/ I: L5 ^0 y- ~$ j3 o { g2 W0 x4 P1 H, I( E* B' } *pResult = CDRF_NOTIFYSUBITEMDRAW; 0 ~4 d) t! p( f. y1 `( t$ `, L% { } 6 p6 V) W9 X; L" t1 B: ]" l else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) : M: n' d a* b: l; w {

int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);5 s: L3 x3 L2 y. Z Z3 J/ | int nSubItem = pLVCD->iSubItem;) P, i" h- n- E- e if (nSubItem != 0) 2 `" ^9 G8 K7 J+ h. x$ K { ( z1 F7 V$ H. I! ~/ s0 S( f$ [8 ? // 全部绘制过程在nSubItem == 0 时完成0 `" A9 G2 t2 j+ q6 C // 分布完成会有小问题,我无法解决 & A% o5 w) P! l5 e3 m; s; n *pResult = CDRF_SKIPDEFAULT; : q/ Q# Y$ ]' X, Y+ u# g$ I return; " q2 C$ O5 B: u0 |( ~$ b9 h }5 J+ D: x' n6 h* A& Z+ j9 H; a: x CDC *pDC = CDC::FromHandle(pLVCD->nmcd.hdc); 7 A. C7 }1 y5 H& j; I int nColCount = pThis->GetHeaderCtrl()->GetItemCount(); , U: c: J- D) b5 I, [% k CRect rectSubItem; " g% d# T: E3 i# z4 {& n CString strItemText;( e: z, X" P4 V4 B% N pDC->SetTextColor(((ItemDataEx*)pThis->GetItemData(nItem))->clrItemTextColor);/ |4 _3 ?1 q: s E }8 C pDC->SetBkMode(TRANSPARENT); / d5 ~5 g6 ]$ o& I R8 D // 相当于橡皮 - C) Q3 O6 }3 m6 V- |2 M CBrush brEraser(GetItemBackColor(nItem));

// int nFirstWidth = GetColumnWidth(0);

! n& T, E2 k* h0 C6 _ for (int i = 0;i < nColCount;i++) & P, {( Q! U0 K# G6 u0 Z5 |0 s { % m5 E* ?7 E, F4 T9 x/ A& ~ strItemText = GetItemText(nItem,i);

if (i == 0) 6 |' f* B9 ]0 e, X& {/ q! B {$ c- l6 \1 `/ x1 i# v pThis->GetSubItemRect(nItem,i,LVIR_BOUNDS,rectSubItem); ) v8 G- S& q5 }. l // 擦掉原来的图形- J E/ P1 {! U0 K9 @ pDC->FillRect(rectSubItem,&brEraser);9 h, l) Q# u6 Q: p: Z$ W if (GetExtendedStyle() & LVS_EX_CHECKBOXES) - E0 a3 y; ~+ O% u8 B { ) p( i; o r+ x9 V/ ?* h CRect rectCheckBox; 8 n- ~( G3 C* w" C6 x8 ] GetSubItemRect(nItem,0,LVIR_ICON,rectCheckBox);6 F+ t( D( E3 t2 J+ L& r/ o, f CRect::SwapLeftRight(rectCheckBox); 2 t- z$ T2 Z5 K4 S3 ` rectCheckBox.left = rectCheckBox.right - rectCheckBox.Height();

rectCheckBox -= CRect(2,2,2,2); 3 S& |2 l5 U* X ~ pDC->Draw3dRect(rectCheckBox,0x81521D,0x81521D); & c4 `0 S4 l" `# q4 K) H8 u7 T- d! B //rectCheckBox += CRect(3,3,3,3);# g9 J" C" ~* I( n, k, }2 R) ^ if (GetCheck(nItem)) - g4 ?- p; X3 M% H3 ] {0 H0 P$ j- E2 u* ^% w // 绘制一个CHECKBOX4 ^8 _& S; }- v CPen penCheck(PS_SOLID, 1, 0x0021A221); W" O1 x; z. |% f6 i- A CPen *pOldpen = pDC->SelectObject(&penCheck);9 v4 n0 [+ D& ?1 g Q } for (int j = 3; j < 10; j++)- Z8 A$ d ]3 ?' S0 H {+ L6 k' I+ y- o# o) s/ ? pDC->MoveTo(rectCheckBox.left + j, rectCheckBox.top + rectCheckBox.Height() /2 - 3 + ((j < 6) ? j - 1 : (9 - j)));" y/ k& o- C, c, ?4 T pDC->LineTo(rectCheckBox.left + j, rectCheckBox.top + rectCheckBox.Height() /2 - 3 + ((j < 6) ? j + 2 : (12 - j))); 9 a0 \7 {/ M6 J. H4 G. u X }9 f: E" O2 ?! n1 V2 ~ / a4 B* s8 P) k V4 { pDC->SelectObject(pOldpen);0 B) a2 O: C' F9 e1 m/ @, @ }/ j+ Z# _7 y) q5 A7 o } - ~% R. a1 W1 v7 Q! x9 L // 根据需要画选中框 3 _- {( C1 ~5 W* Z# R; ^ if ( (GetFocus() == this || GetStyle() & LVS_SHOWSELALWAYS)&&(GetItemState(nItem,LVIS_SELECTED) == LVIS_SELECTED))( I3 p) o2 S3 ` {! U1 d! ^, w4 }! X; O if (GetExtendedStyle() & LVS_EX_CHECKBOXES) + q/ M5 p! y: E3 P. e* P& ? {// 存在检查框风格的时候需要对左坐标进行修正: H. x: P! ~! K+ Z) Z6 o CRect rectLeft;9 i: K2 _3 W9 u, j- {2 x GetItemRect(nItem,rectLeft,LVIR_ICON);# y5 g2 C; S: k {4 M rectSubItem.left = rectLeft.left; 2 y; K" m! }' W0 w8 S }8 o" H: y- {; V- L! X5 y if (!(GetExtendedStyle() & LVS_EX_FULLROWSELECT))5 i; |, J. n/ y9 [$ q- k2 ]& q Z {// 非全行选择时右坐标需要修正# Z$ q& n- i' ~ CRect rectRight; ( q( o& X* K# K( d; ]. x4 F8 C GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rectRight);0 K- E6 X7 j: Y$ }2 y2 R& d rectSubItem.right = rectRight.right;5 g( s6 |$ L; Y A( H } 8 m) S2 d6 h& ]$ _ CBrush brHighLight;& z8 s, f, B1 G+ O CPen penHighLightEdge; / X I( A: S8 L6 _& z4 l if (GetFocus() == this) ( K! ~/ l# z+ i$ w) [+ O' v/ N { K3 _7 Y# X, H$ x7 L* B5 C( i! x1 Z brHighLight.CreateSolidBrush(m_clrHighLight); * C+ S( w; Y6 h1 o( C4 x7 f penHighLightEdge.CreatePen(PS_SOLID,1,m_clrHighLightEdge); # P" Z6 L( J* ]) f } 3 ~' P! P5 Z! f l" o4 o else- u5 |% O' k3 U. v {7 k- W% F( ^' O3 q // 不是焦点时,颜色70%不透明度 7 \" A2 z7 f5 a& P% y, D COLORREF clrBack = GetItemBackColor(nItem); . E" t" j2 b, J3 e+ w WORD red = GetRValue(m_clrHighLight)*0.7 + GetRValue(clrBack)*0.3;( [9 A$ x& u' c5 a C2 _, r* o N WORD green = GetGValue(m_clrHighLight)*0.7 + GetGValue(clrBack)*0.3; 8 D. m: T& u1 ?: q, x2 z, e! w5 v WORD blue = GetBValue(m_clrHighLight)*0.7 + GetBValue(clrBack)*0.3; 4 o1 d' ?7 G$ W brHighLight.CreateSolidBrush(RGB(red,green,blue));0 {8 r- m9 r! m: F7 i' Q5 f7 O5 E red = GetRValue(m_clrHighLightEdge)*0.7 + GetRValue(clrBack)*0.3; , Z# J* \5 l3 u! n) I green = GetGValue(m_clrHighLightEdge)*0.7 + GetGValue(clrBack)*0.3;& U6 @7 q$ Q- o3 U: m( ^+ l blue = GetBValue(m_clrHighLightEdge)*0.7 + GetBValue(clrBack)*0.3; - K# u/ _% k) f2 ]; h4 T1 e penHighLightEdge.CreatePen(PS_SOLID,1,RGB(red,green,blue)); + n/ i4 ~* Q2 Z/ [1 E } ) l+ `) y' c& @" h* c7 @ CBrush *pbrOld = pDC->SelectObject(&brHighLight);2 W ^8 L0 K7 o0 T CPen *ppenHighLightEdge = pDC->SelectObject(&penHighLightEdge); 9 r! \" L: |0 b# d8 W pDC->Rectangle(rectSubItem); ; g+ {* B& B+ F pDC->SelectObject(ppenHighLightEdge);/ q: g- O' E8 V/ J" o* {9 Q, k" Y pDC->SelectObject(pbrOld); 1 f0 O0 E4 l( W$ f" S }) _+ c# \8 F' }- P- T" M( i; Q/ A } * y* S. O7 }; g' K7 Q pThis->GetSubItemRect(nItem,i,LVIR_LABEL,rectSubItem);, J" M( G7 b2 X* c UINT uFormat = DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS;% y- n' S2 }* O( W HDITEM hdi; - [! F+ w9 L% [3 V. D$ V hdi.mask = HDI_FORMAT; 5 @, T# Q5 w' d1 J pThis->GetHeaderCtrl()->GetItem(i,&hdi); 2 W* p5 B8 B- A; [& a if (hdi.fmt & LVCFMT_RIGHT) 5 H( f: y, Z% a# Y) V! f7 c {2 P3 v& @& S# |! M/ h. Y% B5 D uFormat |= DT_RIGHT;% i2 t! v2 t. w& r5 } K9 \& o/ K }) n/ i1 U. P( ~0 S7 ? else if (hdi.fmt & LVCFMT_CENTER)% f6 ]7 e2 B$ B$ M { ' m) e0 ?+ T6 ]( u6 B6 t uFormat |= DT_CENTER;9 x" r, O$ n: E! \- l8 a } ( I: h8 h1 p5 b. r; ]8 U pDC->DrawText(strItemText,rectSubItem,uFormat);

CImageList *pImageList = pThis->GetImageList(LVSIL_SMALL);) h7 I' r' o- \9 `, o) t if (pImageList) : e' Z3 E; T/ U9 ~3 z { U' b& u& _0 [5 S6 H( z4 o' O CRect rectIcon; / H/ Z/ m$ I' ~, c GetItemRect(nItem,rectIcon,LVIR_ICON); & u9 N8 q0 C; l7 E; G# z pDC->DrawIcon(rectIcon.left,rectIcon.top,pImageList->ExtractIcon(GetItemImage(nItem))); 6 r. X4 C+ O2 E x } % {! t& a; U( m9 i3 i } a$ v3 ^- O- w4 ^ *pResult = CDRF_SKIPDEFAULT;9 j4 b( A* x' r, x0 ^5 g4 o( {$ | }

}

该用户从未签到

4
发表于 2005-2-24 08:41:00 | 只看该作者
太长了,不看。代码不是这么看的。用VC环境来看代码比较方便。

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表