2024年2月19日发(作者:)

皮肤包括如何CListCtrl的滚动条和列标题

这篇文章将告诉你如何让皮肤一个CListCtrl包括CHeaderCtrl和滚动条。您将可以完全定制的外观和感觉,几乎所有的CListCtrl的一个方面。

简介

我一直在约五年MFC编程,它一直是一个问题让我找到了先进的用户界面领域提供帮助。我正在开发版本的一个非常复杂的DJ音频应用3.0,我需要有一个漂亮的外观界面。剥皮的应用程序本身没什么大不了的,但我需要有一个列出了该做的一切都是我的申请CListCtrl可以做,但还需要在自定义的外观和感觉。

现在,我有几个选择。

我可以购买第三方的清单控制了所有的一个功能的CListCtrl ,并让我的皮肤,但我什至无法找到任何一个地方的价格。

我可以用SkinMagic,ActiveSkin或DirectSkin,但这些产品是速度慢,价格昂贵,不要皮CListCtrl错误控制无闪烁或其他恼人。

我可以从头开始开发我自己的清单管理,并尝试加入拖动和列标题,虚拟列表的支持,多列突出,拖放,删除,列,排序等调整大小,但这样做既可以永远。

.我只能尽量皮肤现有CListCtrl 。

很明显,我选择了后者,因为时间就是生命。

如果我有这样的源代码之前,我自己承担这个任务,它会救了我,即使不那么干净的代码的工作多少个小时。所以,我希望这有助于几个你在那里。

这是很难解释如何做到这一点,因为有这么多不同的元素一起工作,所以你可能只是检查出更好的示范项目。不过这篇文章应该给了我如何做这个好主意。

本文中的代码是在Windows 2000 SP3的开发利用具有共同控制Microsoft的Visual C + + 6.0的DLL文件版本和产品版本5.50.4916.400 5.81.4916.400。此代码还测试在Windows 98第二版。

按时间顺序排列的努力

首先,我必须找到一种方法来定制现有列标题或自己做,而不是为典型的灰色的解决。所以,

我的派生类从CHeaderCtrl ,也一本覆盖OnPaint丑陋的灰头功能和使用位图的地方,子类的CHeaderCtrl我CSkinListCtrl类。 This worked while retaining all the functionality of a

CHeaderCtrl !这个工作,同时保留所有的一个功能的CHeaderCtrl !

接下来,我必须找到一种方法来定制现有的滚动条,否则自己做。所以,我试图子类CScrollbar类;每当我试图利用GetScollbarCtrl()函数从CListCtrl ,它返回null 。显然,滚动条是不是真的。.不幸的是,这意味着我不得不隐藏现有的滚动条和创建自己的(很多不仅仅是剥皮现有的工作)。

我开始试图隐藏滚动条的CListCtrl ,然后不知怎么创建我自己的。我发现一个解决方案中的滚动条用于隐藏CListCtrl就从菲尔贝特福克斯CodeGuru留言板。这个工作很大,所以我的下一个任务是创建自己的滚动条。

我选择从类派生一个CStatic使用位图并创建滚动条从零开始。过了一段时间的调整和很多,但我得到了创建自定义滚动条和工作包括滚轮鼠标,箭头键和PageUp / PageDown键。

现在,我不能告诉你我是多么高兴,当我得到这个工作有些我希望加入到这个源代码,这将是很容易增加,将增加凉爽的过渡图像上/下箭头,拇指控制,和列标题控制。

如何使用在自己的项目的源代码

若要使用此源代码,你自己CListCtrl秒,你所要做的就是复制文件(CSkinListCtrl.h,,CSkinHeaderCtrl.h,,CSkinHorizontalScrollbar.h,,CSkinVerticleScrollbar.h,和项目),并添加到您的文件到你的项目(项目,添加到项目,文件...). Now go into each of the CPP files

you just copied and change the #include " SkinList.h" to #include " .h" .现在,每个进入柬埔寨人民党的文件,您刚才复制,改变#include " SkinList.h"到#include " .h" 。

接下来,您必须有一些图形,你想用你的滚动条和headerctrl(文件夹中查找该水库在我的图形来见我如何削减它们,使它们正常工作)。导入到你的资源标签的BMP图形,给他们的所有有意义的名称。然后你将不得不通过在源代码CSkinVerticleScrollbar ,

CSkinHorizontalScrollbar和CSkinHeaderCtrl类及更改密码,使其与您的位图有硬编码用于定位这些类数位图正确。例如,我的左箭头是26像素宽,所以我的拇指控制的位置从左边25个像素。你会看到之间的数字和图形的大小无关,当你在源代码。这将需要一个玩弄位得到它与您的图形工作,特别是如果你的设计是一个很大的不同,但它应该是一个有很多比从头开始写所有这些代码更容易。

现在,一旦你完成了这一切,你所要做的就是创建CListCtrl控件在Visual Studio中的对话框编辑器内的资源。当您为您的成员变量CListCtrl只是一定要选择CSkinListCtrl作为控制类,而不是CListCtrl 。

注:如果您没有看到CSkinListCtrl作为一个阶级的选择,当您为您的控件类向导创建的成员变量,那么你必须删除你的类。clw文件夹中的项目,然后在下一次打开向导(Ctrl +宽),将重建。CLW文件使用的类,你说,你会看到CSkinListCtrl作为一个阶级的选择控制。

现在,为了让一切工作,必须添加行m_(); 。 This is very important because this Init

function is what creates the scrollbars and positions them to the CListCtrl .这是非常重要的,因为这个Init函数是什么构成了滚动条和位置他们到CListCtrl 。 You must call this in your

OnInitDialog function before you try to use the list of course.你必须打电话给你这个OnInitDialog函数,然后再尝试使用过程名单。

BOOL CSkinListDlg::OnInitDialog()

{

...

//Important! You must call this first重要!首先,你必须调用这个

m_();

m_olor(RGB(76,85,118));

m_tColor(RGB(222,222,222));

LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT));

ht = 12;

strcpy(Name, "Verdana");

FontIndirect(&lf);

m_t(&font, TRUE);

m_Column(0, "BLANK", LVCFMT_LEFT, 0);

m_Column(1, "SONG", LVCFMT_LEFT, 100);

m_Column(2, "ARTIST", LVCFMT_LEFT, 100);

m_Column(3, "GENRE", LVCFMT_LEFT, 100);

m_raw(FALSE);

CString cszItem;

for(int i=0; i<1000; i++)

{

("%d - %s", i,

"Matthew Good - Near Fantastica");

m_Item(i, cszItem);

m_mText(i, 1, cszItem);

m_mText(i, 2, "Matthew Good");

m_mText(i, 3, "Rock");

m_raw(TRUE);

ListView_SetExtendedListViewStyle(m_SkinList.m_hWnd,

LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);

...

}

我如何定制了CHeaderCtrl

Here we will set up the CSkinHeaderCtrl class that we made.在这里,我们将成立CSkinHeaderCtrl类,我们做。 We have to skin the header control using our own graphics.我们必须控制皮肤的头用自己的图形。

//Add this line of code in the CSkinHeaderCtrl.h添加这CSkinHeaderCtrl.h中的代码行

public:

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

现在,重写OnPaint事件中CSkinHeaderCtrl类,并用我们自己的代码,皮肤列标题与图形。

If you use your own graphics and they are different sizes, you will have to modify the code in the

OnPaint handler to draw your bitmaps correctly.如果您使用自己的图形和它们是不同的大小,您将不得不修改代码OnPaint处理程序提请位图正确。

//add an include for the CMemDC class添加一个包含类的CMemDC

#include "memdc.h"

...

//I added the following function. (This function does not do anything, 我增加了以下功能。

//but we need it so that we can get the properties of each column

//header in the OnPaint function.) If we don't have this function,

//our code in the OnPaint handler will crash.

void CSkinHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

}

...

//First I did an overrode the OnPaint function

void CSkinHeaderCtrl::OnPaint()

{

CPaintDC dc(this); // device context for painting

CRect rect, rectItem, clientRect;

GetClientRect(&rect);

GetClientRect(&clientRect);

CMemDC memDC(&dc, rect);

CDC bitmapDC;

CompatibleDC(&dc);

lidRect(&rect, RGB(76,85,118));

CBitmap bitmapSpan;

tmap(IDB_COLUMNHEADER_SPAN);

CBitmap* pOldBitmapSpan = Object(&bitmapSpan);

hBlt(+2, 0, nWidth, 1,

&bitmapDC, 0,0, 1, 12, SRCCOPY);

Object(pOldBitmapSpan);

Object();

int nItems = GetItemCount();

CBitmap bitmap;

CBitmap bitmap2;

CBitmap bitmap3;

tmap(IDB_COLUMNHEADER_START);

tmap(IDB_COLUMNHEADER_SPAN);

tmap(IDB_COLUMNHEADER_END);

for(int i = 0; i

{

TCHAR buf1[256];

HD_ITEM hditem1;

= HDI_TEXT | HDI_FORMAT | HDI_ORDER;

t = buf1;

tMax = 255;

GetItem( i, &hditem1 );

GetItemRect(i, &rect);

CBitmap* pOldBitmap = NULL;

//make sure we draw the start piece

//on the first item so it has a left border

//For the following items we will just use the

//right border of the previous items as the left

//border

if(==0)

{

pOldBitmap = Object(&bitmap);

(,,2,12,

&bitmapDC,0,0,SRCCOPY);

}

else

{

(-1,,2,12,

&bitmapDC,0,0,SRCCOPY);

pOldBitmap = Object(&bitmap2);

(+1,,1,12,

&bitmapDC,0,0,SRCCOPY);

}

Object(pOldBitmap);

//span the bitmap for the width of the column header item

int nWidth = () - 4;

CBitmap* pOldBitmap2 = Object(&bitmap2);

hBlt(+2, 0, nWidth, 1,

&bitmapDC, 0,0, 1, 12, SRCCOPY);

Object(pOldBitmap2);

//draw the end piece of the column header

CBitmap* pOldBitmap3 = Object(&bitmap3);

((-2), 0, 2, 12,

&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap3);

//Get all the info for the current

//item so we can draw the text to it

//in the desired font and style

DRAWITEMSTRUCT DrawItemStruct;

GetItemRect(i, &rectItem);

e = 100;

= eHdc();

tion = ODA_DRAWENTIRE;

em = GetSafeHwnd();

= rectItem;

= i;

DrawItem(&DrawItemStruct);

UINT uFormat = DT_SINGLELINE | DT_NOPREFIX

| DT_TOP |DT_CENTER | DT_END_ELLIPSIS ;

CFont font;

LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT));

ht = 8;

strcpy(Name, "Sevenet 7");

FontIndirect(&lf);

CFont* def_font = Object(&font);

ode(TRANSPARENT);

eRect(2,2,2,2);

TCHAR buf[256];

HD_ITEM hditem;

= HDI_TEXT | HDI_FORMAT | HDI_ORDER;

t = buf;

tMax = 255;

GetItem( , &hditem );

xt(buf, &rectItem, uFormat);

Object(def_font);

Object();

}

}

那个漂亮的钱它为CSkinHeaderCtrl 。它是相对容易的自定义绘制的CHeaderCtrl 。这让我感到惊讶是多么容易,因为我看到的留言板是询问如何做到这一点,都没有任何回复这么多的职位。包括您自己的图形,你会明显地修改这个代码,以便让它为您的设计工作正常,但是这是相当简单的,现在你有框架代码就在这里。

我如何创建CSkinVerticleScrollbar和CSkinHorizontalScrollbar控制

建立垂直和水平滚动条控制,使他们的工作与配合CListCtrl显然是最艰巨的任务。基本上是我创建的位图使用的是一出滚动条控制CStatic和基类我添加了代码,允许使用的大拇指,并拖放代码来处理的箭头按钮,点击控制运动海峡一带。我还添加了代码来更新拇指位置的基础上ScrollPos的名单。.这样做可以使所有的原始功能CListCtrl中键滚轮鼠标的条款,上一页/ PgDown键,箭头,家庭,和结束。水平和垂直滚动条控件基本上是相同的,所以我只是要告诉你的代码CSkinVerticleScrollbar简单控制。

我不会在这里所有的代码后,因为有太多,但我会尝试解释我做了什么,以使工作与滚动条CListCtrl ,向您展示件代码的最重要的。

首先,我推翻了OnPaint处理程序,这样我可以画滚动使用图形我想用。

//CSkinVerticleScrollbar.h file//CSkinVerticleScrollbar.h文件

...

public:

CListCtrl* pList;

void LimitThumbPosition();

void Draw();

void UpdateThumbPosition();

bool bMouseDownArrowUp, bMouseDownArrowDown;

bool bDragging;

bool bMouseDown;

int nThumbTop;

double dbThumbInterval;

void ScrollDown();

void ScrollUp();

void PageUp();

void PageDown();

...

// file

...

void CSkinVerticleScrollbar::OnPaint()

{

CPaintDC dc(this);

Draw();

}

void CSkinVerticleScrollbar::Draw()

{

CClientDC dc(this);

CRect clientRect;

GetClientRect(&clientRect);

CMemDC memDC(&dc, &clientRect);

lidRect(&clientRect, RGB(74,82,107));

CDC bitmapDC;

CompatibleDC(&dc);

CBitmap bitmap;

tmap(IDB_VERTICLE_SCROLLBAR_TOP);

CBitmap* pOldBitmap = Object(&bitmap);

(,,12,11,

&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

tmap(IDB_VERTICLE_SCROLLBAR_UPARROW);

pOldBitmap = Object(&bitmap);

(,+11,12,26,

&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

//draw the background (span)

tmap(IDB_VERTICLE_SCROLLBAR_SPAN);

pOldBitmap = Object(&bitmap);

int nHeight = () - 37;

hBlt(, +37,

12,nHeight,&bitmapDC, 0,0, 12, 1, SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

//draw the down arrow of the scrollbar

tmap(IDB_VERTICLE_SCROLLBAR_DOWNARROW);

pOldBitmap = Object(&bitmap);

(,nHeight,12,26,&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

//draw the down arrow of the scrollbar

tmap(IDB_VERTICLE_SCROLLBAR_BOTTOM);

pOldBitmap = Object(&bitmap);

(+1,nHeight+26,11,11,

&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

//draw the thumb control

tmap(IDB_VERTICLE_SCROLLBAR_THUMB);

pOldBitmap = Object(&bitmap);

(,+nThumbTop,12,26,

&bitmapDC,0,0,SRCCOPY);

Object(pOldBitmap);

Object();

pOldBitmap = NULL;

}

接下来,我写了一个函数,将拇指滚动更新图形的位置的基础上ScrollPos的CListCtrl 。

void CSkinVerticleScrollbar::UpdateThumbPosition()

{

CRect clientRect;

GetClientRect(&clientRect);

double nPos = pList->GetScrollPos(SB_VERT);

double nMax = pList->GetScrollLimit(SB_VERT);

double nHeight = (()-98);

double nVar = nMax;

dbThumbInterval = nHeight/nVar;

double nNewdbValue = (dbThumbInterval * nPos);

int nNewValue = (int)nNewdbValue;

nThumbTop = 36+nNewValue;

LimitThumbPosition();

Draw();

}

void CSkinVerticleScrollbar::LimitThumbPosition()

{

CRect clientRect;

GetClientRect(&clientRect);

if(nThumbTop+26 > (()-37))

{

nThumbTop = ()-62;

}

if(nThumbTop < (+36))

{

nThumbTop = +36;

}

}

然后,我写的代码来处理,因为当用户拖动并丢弃拇指控制键来滚动列表以及当他们点击鼠标事件(或单击并按住)在滚动箭头。

void CSkinVerticleScrollbar::PageDown()

{

pList->SendMessage(WM_VSCROLL, MAKELONG(SB_PAGEDOWN,0),NULL);

UpdateThumbPosition();

}

void CSkinVerticleScrollbar::PageUp()

{

pList->SendMessage(WM_VSCROLL, MAKELONG(SB_PAGEUP,0),NULL);

UpdateThumbPosition();

}

void CSkinVerticleScrollbar::ScrollUp()

{

pList->SendMessage(WM_VSCROLL, MAKELONG(SB_LINEUP,0),NULL);

UpdateThumbPosition();

}

void CSkinVerticleScrollbar::ScrollDown()

{

pList->SendMessage(WM_VSCROLL, MAKELONG(SB_LINEDOWN,0),NULL);

UpdateThumbPosition();

}

void CSkinVerticleScrollbar::OnLButtonDown(UINT nFlags, CPoint point)

{

SetCapture();

CRect clientRect;

GetClientRect(&clientRect);

int nHeight = () - 37;

CRect rectUpArrow(0,11,12,37);

CRect rectDownArrow(0,nHeight,12,nHeight+26);

CRect rectThumb(0,nThumbTop,12,nThumbTop+26);

if(ct(point))

{

bMouseDown = true;

}

if(ct(point))

{

bMouseDownArrowDown = true;

SetTimer(2,250,NULL);

}

if(ct(point))

{

bMouseDownArrowUp = true;

SetTimer(2,250,NULL);

}

CStatic::OnLButtonDown(nFlags, point);

}

void CSkinVerticleScrollbar::OnLButtonUp(UINT nFlags, CPoint point)

{

UpdateThumbPosition();

KillTimer(1);

ReleaseCapture();

bool bInChannel = true;

CRect clientRect;

GetClientRect(&clientRect);

int nHeight = () - 37;

CRect rectUpArrow(0,11,12,37);

CRect rectDownArrow(0,nHeight,12,nHeight+26);

CRect rectThumb(0,nThumbTop,12,nThumbTop+26);

if(ct(point) && bMouseDownArrowUp)

{

ScrollUp();

bInChannel = false;

}

if(ct(point) && bMouseDownArrowDown)

{

ScrollDown();

bInChannel = false;

}

if(ct(point))

{

bInChannel = false;

}

if(bInChannel == true && !bMouseDown)

{

if(point.y > nThumbTop)

{

PageDown();

}

else

{

PageUp();

}

}

bMouseDown = false;

bDragging = false;

bMouseDownArrowUp = false;

bMouseDownArrowDown = false;

CStatic::OnLButtonUp(nFlags, point);

}

void CSkinVerticleScrollbar::OnMouseMove(UINT nFlags, CPoint point)

{

CRect clientRect;

GetClientRect(&clientRect);

if(bMouseDown)

{

int nPreviousThumbTop = nThumbTop;

nThumbTop = point.y-13; //-13 so mouse is in middle of thumb

double nMax = pList->GetScrollLimit(SB_VERT);

int nPos = pList->GetScrollPos(SB_VERT);

double nHeight = ()-98;

double nVar = nMax;

dbThumbInterval = nHeight/nVar;

//figure out how many times to scroll total from top

//then minus the current position from it

int nScrollTimes = (int)((nThumbTop-36)/dbThumbInterval)-nPos;

//grab the row height dynamically

//so if the font size or type changes

//our scroll will still work properly

CRect itemrect;

pList->GetItemRect(0,&itemrect, LVIR_BOUNDS);

CSize size;

= 0;

= nScrollTimes*();

pList->Scroll(size);

LimitThumbPosition();

Draw();

}

CStatic::OnMouseMove(nFlags, point);

}

void CSkinVerticleScrollbar::OnTimer(UINT nIDEvent)

{

if(nIDEvent == 1)

{

if(bMouseDownArrowDown)

{

ScrollDown();

}

if(bMouseDownArrowUp)

{

ScrollUp();

}

}

else if(nIDEvent == 2)

{

if(bMouseDownArrowDown)

{

KillTimer(2);

SetTimer(1, 50, NULL);

}

if(bMouseDownArrowUp)

{

KillTimer(2);

SetTimer(1, 50, NULL);

}

}

CStatic::OnTimer(nIDEvent);

}

我如何定制的CListCtrl

要自定义CListCtrl ,我需要子类CHeaderCtrl使用CSkinHeaderCtrl类,我提出,以及隐藏原始滚动条,然后插入那些我在他们的地方。

因此,首先我子类的CHeaderCtrl通过重载PreSubclassWindow并添加以下代码。

void CSkinListCtrl::PreSubclassWindow()

{

//use our custom CHeaderCtrl

m_ssWindow(GetHeaderCtrl()->m_hWnd);

CListCtrl::PreSubclassWindow();

}

接下来,我写的Init函数,在运行时创建滚动条,并确保原滚动条隐藏。我已经将代码添加到考虑的标题栏大小,以便放置CStatic滚动条的位置在正确PositionScrollBars()函数。 If the

window's appearance changes, I needed to ensure the scrollbars stayed in the correct place.如果窗口的外观变化,我需要滚动条,以确保在正确的地方住。

//CSkinListCtrl.h file

#include "SkinHeaderCtrl.h"

#include "SkinHorizontalScrollbar.h"

#include "SkinVerticleScrollbar.h"

...

public:

CSkinHeaderCtrl m_SkinHeaderCtrl;

CSkinVerticleScrollbar m_SkinVerticleScrollbar;

CSkinHorizontalScrollbar m_SkinHorizontalScrollbar;

// file

void CSkinListCtrl::Init()

{

//another way to hide scrollbars

InitializeFlatSB(m_hWnd);

FlatSB_EnableScrollBar(m_hWnd, SB_BOTH, ESB_DISABLE_BOTH);

CWnd* pParent = GetParent();

//Create scrollbars at runtime

m_(NULL,

WS_CHILD|SS_LEFT|SS_NOTIFY|WS_VISIBLE|WS_GROUP,

CRect(0,0,0,0), pParent);

m_(NULL,

WS_CHILD|SS_LEFT|SS_NOTIFY|WS_VISIBLE|WS_GROUP,

CRect(0,0,0,0), pParent);

m_ = this;

m_ = this;

//call this to position the scrollbars properly

PositionScrollBars();

}

void CSkinListCtrl::PositionScrollBars()

{

CWnd* pParent = GetParent();

CRect windowRect;

GetWindowRect(&windowRect);

int nTitleBarHeight = 0;

if(pParent->GetStyle() & WS_CAPTION)

nTitleBarHeight = GetSystemMetrics(SM_CYSIZE);

int nDialogFrameHeight = 0;

int nDialogFrameWidth = 0;

if((pParent->GetStyle() & WS_BORDER))

{

nDialogFrameHeight = GetSystemMetrics(SM_CYDLGFRAME);

nDialogFrameWidth = GetSystemMetrics(SM_CYDLGFRAME);

}

if(pParent->GetStyle() & WS_THICKFRAME)

{

nDialogFrameHeight+=1;

nDialogFrameWidth+=1;

}

pParent->ScreenToClient(&windowRect);

+=nTitleBarHeight+nDialogFrameHeight;

+=nTitleBarHeight+nDialogFrameHeight;

+=nDialogFrameWidth;

+=nDialogFrameWidth;

CRect vBar(-nDialogFrameWidth,

-nTitleBarHeight-nDialogFrameHeight,

+12-nDialogFrameWidth,

+12-nTitleBarHeight-nDialogFrameHeight);

CRect hBar(-nDialogFrameWidth,

-nTitleBarHeight-nDialogFrameHeight,

+1-nDialogFrameWidth,

+12-nTitleBarHeight-nDialogFrameHeight);

m_dowPos(NULL,

,,(),(),

SWP_NOZORDER);

m_dowPos(NULL,

,,(),(),

SWP_NOZORDER);

m_ThumbPosition();

m_ThumbPosition();

}

接下来,我添加了代码,以确保正确后,以任何方式列表春联(键盘命令,鼠标滚轮等)滚动条滑块的位置定位自己

BOOL CSkinListCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

m_ThumbPosition();

m_ThumbPosition();

return CListCtrl::OnMouseWheel(nFlags, zDelta, pt);

}

void CSkinListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

m_ThumbPosition();

m_ThumbPosition();

CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);

}

void CSkinListCtrl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)

{

m_ThumbPosition();

m_ThumbPosition();

CListCtrl::OnKeyUp(nChar, nRepCnt, nFlags);

}

最后,我添加的代码,以确保列表不闪烁滚动时所覆盖OnEraseBkgnd和OnPaint处理程序。我也有代码CSkinListCtrl类,以确保该行的突出显示颜色的停留,而不是一种特定的颜色

颜色以在系统上,但我不会让这一点。 You can just look at the source code.你只需看看源代码。

BOOL CSkinListCtrl::OnEraseBkgnd(CDC* pDC)

{

m_ThumbPosition();

m_ThumbPosition();

return FALSE;

//return CListCtrl::OnEraseBkgnd(pDC);

}

void CSkinListCtrl::OnPaint()

{

CPaintDC dc(this);

CRect rect;

GetClientRect(&rect);

CMemDC memDC(&dc, rect);

CRect headerRect;

GetDlgItem(0)->GetWindowRect(&headerRect);

ScreenToClient(&headerRect);

eClipRect(&headerRect);

CRect clip;

pBox(&clip);

lidRect(clip, RGB(76,85,118));

SetTextBkColor(RGB(76,85,118));

m_ThumbPosition();

m_ThumbPosition();

DefWindowProc(WM_PAINT, (WPARAM)memDC->m_hDC, (LPARAM)0);

}

兴趣点

在这篇文章中隐藏滚动条的方法仍然允许滚动。

显示不影响外观,应以任何方式列表。

这是很容易的皮肤CHeaderCtrl使用OnPaint方法,再加上压倒一切DrawItem处理程序。

此外,应认识到, CSkinHeaderCtrl和CSkinScrollbar类硬编码为同类型的大小和使用位图的我。在这些类的代码都必须更新,以与您要使用的位图。

我看到一个消息遍布定制留言板询问如何CHeaderCtrl以及如何添加自定义的滚动条到CListCtrl和职位的人没有回答。 This discouraged me, but I learned not to let that get to me.这

劝阻我,但我知道不会让它找到我。只是因为它没有被前或完成的源代码尚未发布并不意味着你不能成为第一! Never give up!永不放弃!

要改进添加代码以允许垂直滚动到正常工作的ICON和SMALL ICON列表类型(目前仅此代码可与列出了查看REPORT或LIST )。拖放滚动使用垂直滚动条滚动拇指控制不正常的顺利时,listctrl滚动显示的项目很多。需要修改的垂直滚动条类的MouseMove处理程序代码,以使滚动顺畅。

使CSkinScrollbar和CSkinHeaderCtrl这些类的类的工作与任何大小不改变代码的位图需要。

ourselves.不知怎的,有CSkinList::Init函数本身运行,使我们不必调用m_();自己。

添加滚动条滚动箭头上的图像,拇指控制,和列标题的支持。