// ---------------------------------------------
) 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
} |