重载listctrl列头列头皮肤.docx

上传人:b****6 文档编号:5949455 上传时间:2023-01-02 格式:DOCX 页数:15 大小:17.98KB
下载 相关 举报
重载listctrl列头列头皮肤.docx_第1页
第1页 / 共15页
重载listctrl列头列头皮肤.docx_第2页
第2页 / 共15页
重载listctrl列头列头皮肤.docx_第3页
第3页 / 共15页
重载listctrl列头列头皮肤.docx_第4页
第4页 / 共15页
重载listctrl列头列头皮肤.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

重载listctrl列头列头皮肤.docx

《重载listctrl列头列头皮肤.docx》由会员分享,可在线阅读,更多相关《重载listctrl列头列头皮肤.docx(15页珍藏版)》请在冰豆网上搜索。

重载listctrl列头列头皮肤.docx

重载listctrl列头列头皮肤

重载listctrl头,可惜换列头皮肤

#pragmaonce

#include"RSHeaderCtrl.h"

//CRSListCtrl

classCRSListCtrl:

publicCListCtrl

{

DECLARE_DYNAMIC(CRSListCtrl)

public:

CRSListCtrl();

virtual~CRSListCtrl();

protected:

CFontm_fontText;

CRSHeaderCtrlm_wndHeaderCtrl;

protected:

DECLARE_MESSAGE_MAP()

voidInitHeader();

voidRSRectangle(HDChDC,intleft,inttop,intright,intbottom);

virtualBOOLPreCreateWindow(CREATESTRUCT&cs);

public:

afx_msgvoidOnPaint();

afx_msgBOOLOnEraseBkgnd(CDC*pDC);

afx_msgvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);

afx_msgvoidMeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct);afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

afx_msgvoidOnDestroy();

afx_msgLRESULTOnInsertColumn(WPARAMwParam,LPARAMlParam);};

//RSListCtrl.cpp:

实现文件

//

#include"stdafx.h"

#include"Rising.h"

#include"RSListCtrl.h"

#include".\rslistctrl.h"

//CRSListCtrl

IMPLEMENT_DYNAMIC(CRSListCtrl,CListCtrl)

CRSListCtrl:

:

CRSListCtrl()

{

}

CRSListCtrl:

:

~CRSListCtrl()

{

}

BEGIN_MESSAGE_MAP(CRSListCtrl,CListCtrl)

ON_WM_PAINT()

ON_WM_ERASEBKGND()

ON_WM_DRAWITEM_REFLECT()

ON_WM_MEASUREITEM_REFLECT()

ON_WM_CREATE()

ON_WM_DESTROY()

ON_MESSAGE(LVM_INSERTCOLUMN,OnInsertColumn)END_MESSAGE_MAP()

//CRSListCtrl消息处理程序

BOOLCRSListCtrl:

:

PreCreateWindow(CREATESTRUCT&cs){

cs.style|=LVS_OWNERDRAWFIXED;

returnCListCtrl:

:

PreCreateWindow(cs);

}

voidCRSListCtrl:

:

RSRectangle(HDChDC,intleft,inttop,intright,intbottom){

POINTptOrg,ptTmp;

right=max(0,right-1);

bottom=max(0,bottom-1);

:

:

MoveToEx(hDC,left,top,&ptOrg);

:

:

LineTo(hDC,left,bottom);

:

:

MoveToEx(hDC,left,bottom,&ptTmp);

:

:

LineTo(hDC,right,bottom);

:

:

MoveToEx(hDC,right,bottom,&ptTmp);

:

:

LineTo(hDC,right,top);

:

:

MoveToEx(hDC,right,top,&ptTmp);

:

:

LineTo(hDC,left,top);

:

:

MoveToEx(hDC,ptOrg.x,ptOrg.y,&ptTmp);

}

voidCRSListCtrl:

:

OnPaint()

{

PAINTSTRUCTps;

HDChDC=NULL;

HDChDCMem=NULL;

HBITMAPhBMP=NULL;

HBITMAPhOldBitmap=NULL;

HPENhPen=NULL;

HPENhOldPen=NULL;

CRectrectClient;

HRGNhRgn=NULL;

GetClientRect(&rectClient);

InitHeader();

//donothing,onlyvalidatetheclipregion.

hDC=:

:

BeginPaint(m_hWnd,&ps);

:

:

EndPaint(m_hWnd,&ps);

//realdraw

hDC=:

:

GetDC(m_hWnd);

hDCMem=:

:

CreateCompatibleDC(hDC);

hBMP=(HBITMAP):

:

CreateCompatibleBitmap(hDC,rectClient.Width(),rectClient.Height());

hOldBitmap=(HBITMAP):

:

SelectObject(hDCMem,hBMP);

hPen=:

:

CreatePen(PS_SOLID,1,RGB(150,198,226));

hOldPen=(HPEN):

:

SelectObject(hDCMem,hPen);

//clipheaderctrl

CHeaderCtrl*pHeadCtrl=GetHeaderCtrl();

CRectrectHead;

pHeadCtrl->GetClientRect(&rectHead);

hRgn=:

:

CreateRectRgn(rectClient.left,rectClient.top+rectHead.Height(),rectClient.right,rectClient.bottom);

:

:

SelectClipRgn(hDC,hRgn);

//DrawBackGround

:

:

SetBkColor(hDCMem,RGB(242,250,255));

:

:

ExtTextOut(hDCMem,0,0,ETO_OPAQUE,&rectClient,NULL,0,NULL);

//DrawItems

intnItemCount=GetItemCount();

intfirstvisible=GetTopIndex();

intlastvisible=firstvisible+GetCountPerPage();

if(lastvisible>nItemCount)

lastvisible=nItemCount;

intindex=firstvisible;

while(index

{

DRAWITEMSTRUCTdis;

dis.CtlID=:

:

GetWindowLong(m_hWnd,GWL_ID);

dis.CtlType=ODT_LISTVIEW;

dis.hDC=hDCMem;

dis.hwndItem=m_hWnd;

dis.itemAction=ODA_DRAWENTIRE;

dis.itemData=0;

dis.itemID=index;

dis.itemState=GetItemState(index,LVIS_SELECTED)==LVIS_SELECTED?

ODS_SELECTED:

0;

GetItemRect(index,&dis.rcItem,LVIR_BOUNDS);

DrawItem(&dis);

index++;

}

RSRectangle(hDCMem,rectClient.left,rectClient.top,rectClient.right,rectClient.bottom);

:

:

BitBlt(hDC,0,0,rectClient.Width(),rectClient.Height(),hDCMem,0,0,SRCCOPY);

if(hOldBitmap)

:

:

SelectObject(hDCMem,hOldBitmap);

if(hOldPen)

:

:

SelectObject(hDCMem,hOldPen);

:

:

DeleteObject(hRgn);

:

:

DeleteObject(hBMP);

:

:

DeleteObject(hPen);

:

:

DeleteDC(hDCMem);

:

:

ReleaseDC(m_hWnd,hDC);

}

BOOLCRSListCtrl:

:

OnEraseBkgnd(CDC*pDC)

{

returnTRUE;

}

voidCRSListCtrl:

:

MeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct){

if(lpMeasureItemStruct->CtlType==ODT_LISTVIEW)

lpMeasureItemStruct->itemHeight=18;

}

voidCRSListCtrl:

:

DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct)

{

if(lpDrawItemStruct->CtlType!

=ODT_LISTVIEW)

return;

CDCdc;

dc.Attach(lpDrawItemStruct->hDC);

CHeaderCtrl*pHeadCtrl=GetHeaderCtrl();

if(lpDrawItemStruct->itemAction==ODA_DRAWENTIRE)

{

if(lpDrawItemStruct->itemState&ODS_SELECTED)

dc.FillSolidRect(&lpDrawItemStruct->rcItem,RGB(182,218,243));

else

dc.FillSolidRect(&lpDrawItemStruct->rcItem,RGB(242,250,255));

CFont*pOldFont=dc.SelectObject(&m_fontText);

dc.SetBkMode(TRANSPARENT);

dc.SetTextColor(RGB(35,99,133));

//DrawItem

TCHARszItemText[256];

LVITEMlvi;

lvi.mask=LVIF_IMAGE|LVIF_STATE|LVIF_TEXT;

lvi.iImage=0;

lvi.iItem=lpDrawItemStruct->itemID;

lvi.iSubItem=0;

lvi.cchTextMax=256;

lvi.pszText=szItemText;

GetItem(&lvi);

CRectheaderItemRect;

pHeadCtrl->GetItemRect(0,&headerItemRect);

CRectrectItem;

rectItem=lpDrawItemStruct->rcItem;

rectItem.right=rectItem.left+headerItemRect.Width();

CImageList*pImageList=GetImageList(LVSIL_NORMAL);

if(pImageList)

{

CPointpt;

pt.x=rectItem.left+4;

pt.y=rectItem.top+2;

pImageList->Draw(&dc,lvi.iImage,pt,ILD_TRANSPARENT);

}

rectItem.left+=24;

dc.DrawText(szItemText,(int)_tcslen(szItemText),&rectItem,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_WORDBREAK|DT_END_ELLIPSIS);

//DrawSubItem

intnCol=pHeadCtrl->GetItemCount();

for(inti=1;i

{

CRectrectSubItem;

GetSubItemRect(lpDrawItemStruct->itemID,i,LVIR_BOUNDS,rectSubItem);

CStringstrText=GetItemText(lpDrawItemStruct->itemID,i);

dc.DrawText(strText,&rectSubItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_WORDBREAK);}

if(pOldFont)

dc.SelectObject(pOldFont);

}

dc.Detach();

}

intCRSListCtrl:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

{

if(CListCtrl:

:

OnCreate(lpCreateStruct)==-1)

return-1;

m_fontText.CreateFont(-12,0,0,0,FW_NORMAL,

DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,

ANTIALIASED_QUALITY,FF_DONTCARE,_T("Arial"));

return0;

}

voidCRSListCtrl:

:

OnDestroy()

{

CListCtrl:

:

OnDestroy();

m_fontText.DeleteObject();

}

voidCRSListCtrl:

:

InitHeader()

{

if(m_wndHeaderCtrl.GetSafeHwnd()==NULL)

{

m_wndHeaderCtrl.SubclassDlgItem(0,this);

m_wndHeaderCtrl.Init();

}

}

FALSE,FALSE,FALSE,CLIP_DEFAULT_PRECIS,

LRESULTCRSListCtrl:

:

OnInsertColumn(WPARAMwParam,LPARAMlParam)

{

LRESULTlResult=CListCtrl:

:

DefWindowProc(LVM_INSERTCOLUMN,wParam,lParam);

InitHeader();

returnlResult;

}

#pragmaonce

//CRSHeaderCtrl

classCRSHeaderCtrl:

publicCHeaderCtrl

{

DECLARE_DYNAMIC(CRSHeaderCtrl)

public:

CRSHeaderCtrl();

virtual~CRSHeaderCtrl();

public:

voidInit();

protected:

DECLARE_MESSAGE_MAP()

protected:

HBITMAPm_hBitmap;

CFontm_font;

voidHorzStretchBlt(HDChDC,LPRECTlpDst,HBITMAPhBMP,LPRECTlpSrc,UINTnLeftPart,UINTnRightPart);

public:

afx_msgLRESULTOnLayout(WPARAMwParam,LPARAMlParam);

afx_msgvoidOnNMCustomdraw(NMHDR*pNMHDR,LRESULT*pResult);

afx_msgvoidOnPaint();

afx_msgBOOLOnEraseBkgnd(CDC*pDC);

afx_msgvoidOnDestroy();

};

//RSHeaderCtrl.cpp:

实现文件

//

#include"stdafx.h"

#include"Rising.h"

#include"RSHeaderCtrl.h"

//CRSHeaderCtrl

IMPLEMENT_DYNAMIC(CRSHeaderCtrl,CHeaderCtrl)

CRSHeaderCtrl:

:

CRSHeaderCtrl()

{

m_hBitmap=NULL;

}

CRSHeaderCtrl:

:

~CRSHeaderCtrl()

{

}

BEGIN_MESSAGE_MAP(CRSHeaderCtrl,CHeaderCtrl)

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,OnNMCustomdraw)

ON_WM_PAINT()

ON_WM_ERASEBKGND()

ON_WM_DESTROY()

ON_MESSAGE(HDM_LAYOUT,OnLayout)

END_MESSAGE_MAP()

voidCRSHeaderCtrl:

:

Init()

{

if(m_hBitmap==NULL)

{

CStringstrSkinPath=theApp.m_pWinManager->duGetSkinPath();

CStringstrImagePath=strSkinPath+"headerctrl.bmp";

m_hBitmap=(HBITMAP):

:

LoadImage(NULL,strImagePath.GetBuffer(strImagePath.GetLength()),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);

m_font.CreateFont(-12,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE,_T("Arial"));

}

}

voidCRSHeaderCtrl:

:

HorzStretchBlt(HDChDC,LPRECTlpDst,HBITMAPhBMP,LPRECTlpSrc,UINTnLeftPart,UINTnRightPart)

{

if(hDC==NULL||lpDst==NULL||hBMP==NULL)

return;

BITMAPbm;

GetObject(hBMP,sizeof(BITMAP),&bm);

if(nLeftPart>(UINT)bm.bmWidth||nRightPart>(UINT)bm.bmWidth)

return;

RECTrSrc;

if(lpSrc==NULL)

{

rSrc.left=0;

rSrc.top=0;

rSrc.right=bm.bmWidth;

rSrc.bottom=bm.bmHeight;

}

else

{

CopyRect(&rSrc,lpSrc);

}

HDChMemDC=CreateCompatibleDC(hDC);

HBITMAPhOldBitmap=(HBITMAP)SelectObject(hMemDC,hBMP);

BitBlt(hDC,lpDst->left,lpDst->top,nLeftPart,lpDst->bottom-lpDst->top,hMemDC,rSrc.left,rSrc.top,SRCCOPY);

StretchBlt(hDC,

lpDst->left+nLeftPart,

lpDst->top,

max(0,lpDst->right-lpDst->left-nLeftPart-nRightPart),

lpDst->bottom-lpDst->top,

hMemDC,

rSrc.left+nLeftPart,

rSrc.top,

max(0,rSrc.right-rSrc.left-nLeftPart-nRightPart),

rSrc.bottom-rSrc.top,

SRCCOPY);

BitBlt(hDC,lpDst->right-nRightPart,lpDst->top,nRightPart,lpDst->bottom-lpDst->top,hMemDC,rSrc.right-nRightPart,rSrc.top,SRCCOPY);

SelectObject(hMemDC,hOldBitmap);

DeleteDC(hMemDC);

}

//CRSHeaderCtrl消息处理程序

LRESULTCRSHeaderCtrl:

:

OnLayout(WPARAMwParam,LPARAMlParam)

{

LRESULTlResult=CHeaderCtrl:

:

DefWindowProc(HDM_LAYOUT,0,lParam);HD_LAYOUT&hdl=*(HD_LAYOUT*)lParam;

RECT*prc=hdl.prc;

WINDOWPOS*pwpos=hdl.pwpos;

intnHeight=18;

pwpos->cy=nHeight;

prc->top=nHeight;

returnlResult;

}

voidCRSHeaderCtrl:

:

OnNMCustomdraw(NMHDR*lpNMHDR,LRESULT*pResult){

LPNMCUSTOMDRAWlpNMCD

reinterpret_cast(lpNMHDR);

switch(lpNMCD->dwDrawStage)

{

caseCDDS_PREPAINT:

*pResult=CDRF_NOTIFYITEMDRAW|C

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1