1、重载listctrl列头列头皮肤重载listctrl头,可惜换列头皮肤#pragma once#include RSHeaderCtrl.h/ CRSListCtrlclass CRSListCtrl : public CListCtrlDECLARE_DYNAMIC(CRSListCtrl)public:CRSListCtrl();virtual CRSListCtrl();protected:CFont m_fontText;CRSHeaderCtrl m_wndHeaderCtrl;protected:DECLARE_MESSAGE_MAP()void InitHeader();void
2、 RSRectangle(HDC hDC, int left, int top, int right, int bottom);virtual BOOL PreCreateWindow(CREATESTRUCT& cs);public:afx_msg void OnPaint();afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
3、 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnDestroy();afx_msg LRESULT OnInsertColumn(WPARAM wParam, LPARAM lParam); ;/ RSListCtrl.cpp : 实现文件/#include stdafx.h#include Rising.h#include RSListCtrl.h#include .rslistctrl.h/ CRSListCtrlIMPLEMENT_DYNAMIC(CRSListCtrl, CListCtrl)CRSL
4、istCtrl: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 消息处理程序BOOL CRSListCtrl:Pre
5、CreateWindow(CREATESTRUCT& cs) cs.style |= LVS_OWNERDRAWFIXED;return CListCtrl:PreCreateWindow(cs);void CRSListCtrl:RSRectangle(HDC hDC, int left, int top, int right, int bottom) POINT ptOrg, ptTmp;right = max(0, right-1);bottom = max(0, bottom-1);:MoveToEx(hDC, left, top, &ptOrg);:LineTo(hDC, left,
6、 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);void CRSListCtrl:OnPaint()PAINTSTRUCT ps;HDC hDC = NULL;HDC hDC
7、Mem = NULL;HBITMAP hBMP = NULL;HBITMAP hOldBitmap = NULL;HPEN hPen = NULL;HPEN hOldPen = NULL;CRect rectClient;HRGN hRgn = NULL;GetClientRect(&rectClient);InitHeader();/ do nothing, only validate the clip region.hDC = :BeginPaint(m_hWnd, &ps);:EndPaint(m_hWnd, &ps);/ real drawhDC = :GetDC(m_hWnd);hD
8、CMem = :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);/ clip header ctrlCHeaderCtrl *pHeadCtr
9、l = GetHeaderCtrl();CRect rectHead;pHeadCtrl-GetClientRect(&rectHead);hRgn = :CreateRectRgn(rectClient.left, rectClient.top+rectHead.Height(), rectClient.right, rectClient.bottom);:SelectClipRgn(hDC, hRgn);/ Draw BackGround:SetBkColor(hDCMem, RGB(242, 250, 255);:ExtTextOut(hDCMem, 0, 0, ETO_OPAQUE,
10、&rectClient, NULL, 0, NULL);/ Draw Itemsint nItemCount = GetItemCount();int firstvisible = GetTopIndex();int lastvisible = firstvisible + GetCountPerPage();if (lastvisible nItemCount)lastvisible = nItemCount;int index = firstvisible;while (index CtlType = ODT_LISTVIEW)lpMeasureItemStruct-itemHeight
11、= 18;void CRSListCtrl:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)if (lpDrawItemStruct-CtlType != ODT_LISTVIEW)return;CDC dc;dc.Attach(lpDrawItemStruct-hDC);CHeaderCtrl *pHeadCtrl = GetHeaderCtrl();if (lpDrawItemStruct-itemAction = ODA_DRAWENTIRE)if (lpDrawItemStruct-itemState & ODS_SELECTED)dc.FillS
12、olidRect(&lpDrawItemStruct-rcItem, RGB(182,218,243);elsedc.FillSolidRect(&lpDrawItemStruct-rcItem, RGB(242, 250, 255);CFont *pOldFont = dc.SelectObject(&m_fontText);dc.SetBkMode(TRANSPARENT);dc.SetTextColor(RGB(35,99,133);/ Draw ItemTCHAR szItemText256;LVITEM lvi;lvi.mask = LVIF_IMAGE|LVIF_STATE|LVI
13、F_TEXT;lvi.iImage = 0;lvi.iItem = lpDrawItemStruct-itemID;lvi.iSubItem = 0;lvi.cchTextMax = 256;lvi.pszText = szItemText;GetItem(&lvi);CRect headerItemRect;pHeadCtrl-GetItemRect(0, &headerItemRect);CRect rectItem;rectItem = lpDrawItemStruct-rcItem;rectItem.right = rectItem.left + headerItemRect.Widt
14、h();CImageList *pImageList = GetImageList(LVSIL_NORMAL);if (pImageList)CPoint pt;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
15、_WORDBREAK|DT_END_ELLIPSIS);/ Draw SubItemint nCol = pHeadCtrl-GetItemCount();for (int i = 1; i itemID, i, LVIR_BOUNDS, rectSubItem);CString strText = GetItemText(lpDrawItemStruct-itemID, i);dc.DrawText(strText, &rectSubItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_WORDBREAK); if (pOld
16、Font)dc.SelectObject(pOldFont);dc.Detach();int CRSListCtrl:OnCreate(LPCREATESTRUCT lpCreateStruct)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);return 0;void CRSListC
17、trl:OnDestroy()CListCtrl:OnDestroy();m_fontText.DeleteObject();void CRSListCtrl:InitHeader()if (m_wndHeaderCtrl.GetSafeHwnd() = NULL)m_wndHeaderCtrl.SubclassDlgItem(0, this);m_wndHeaderCtrl.Init();FALSE, FALSE, FALSE, CLIP_DEFAULT_PRECIS,LRESULT CRSListCtrl:OnInsertColumn(WPARAM wParam, LPARAM lPara
18、m)LRESULT lResult = CListCtrl:DefWindowProc(LVM_INSERTCOLUMN, wParam, lParam);InitHeader();return lResult;#pragma once/ CRSHeaderCtrlclass CRSHeaderCtrl : public CHeaderCtrlDECLARE_DYNAMIC(CRSHeaderCtrl)public:CRSHeaderCtrl();virtual CRSHeaderCtrl();public:void Init();protected:DECLARE_MESSAGE_MAP()
19、protected:HBITMAP m_hBitmap;CFont m_font;void HorzStretchBlt(HDC hDC, LPRECT lpDst, HBITMAP hBMP, LPRECT lpSrc, UINT nLeftPart, UINT nRightPart);public:afx_msg LRESULT OnLayout(WPARAM wParam, LPARAM lParam);afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnPaint();afx_msg B
20、OOL OnEraseBkgnd(CDC* pDC);afx_msg void OnDestroy();/ RSHeaderCtrl.cpp : 实现文件/#include stdafx.h#include Rising.h#include RSHeaderCtrl.h/ CRSHeaderCtrlIMPLEMENT_DYNAMIC(CRSHeaderCtrl, CHeaderCtrl)CRSHeaderCtrl:CRSHeaderCtrl()m_hBitmap = NULL;CRSHeaderCtrl:CRSHeaderCtrl()BEGIN_MESSAGE_MAP(CRSHeaderCtr
21、l, CHeaderCtrl)ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)ON_WM_PAINT()ON_WM_ERASEBKGND()ON_WM_DESTROY()ON_MESSAGE(HDM_LAYOUT, OnLayout)END_MESSAGE_MAP()void CRSHeaderCtrl:Init()if (m_hBitmap = NULL)CString strSkinPath = theApp.m_pWinManager-duGetSkinPath();CString strImagePath = strSkinPath +
22、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_
23、DONTCARE, _T(Arial);void CRSHeaderCtrl:HorzStretchBlt(HDC hDC, LPRECT lpDst, HBITMAP hBMP, LPRECT lpSrc, UINT nLeftPart, UINT nRightPart)if (hDC = NULL | lpDst = NULL | hBMP = NULL)return;BITMAP bm;GetObject(hBMP, sizeof(BITMAP), &bm);if (nLeftPart (UINT)bm.bmWidth | nRightPart (UINT)bm.bmWidth)retu
24、rn;RECT rSrc;if (lpSrc = NULL)rSrc.left = 0;rSrc.top = 0;rSrc.right = bm.bmWidth;rSrc.bottom = bm.bmHeight;elseCopyRect(&rSrc, lpSrc);HDC hMemDC = CreateCompatibleDC(hDC);HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBMP);BitBlt(hDC, lpDst-left, lpDst-top, nLeftPart, lpDst-bottom-lpDst-top, hM
25、emDC, 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
26、-nRightPart, lpDst-top, nRightPart, lpDst-bottom-lpDst-top, hMemDC, rSrc.right-nRightPart, rSrc.top, SRCCOPY);SelectObject(hMemDC, hOldBitmap);DeleteDC(hMemDC);/ CRSHeaderCtrl 消息处理程序LRESULT CRSHeaderCtrl:OnLayout(WPARAM wParam, LPARAM lParam)LRESULT lResult = CHeaderCtrl:DefWindowProc(HDM_LAYOUT, 0,
27、 lParam); HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;RECT *prc = hdl.prc;WINDOWPOS *pwpos = hdl.pwpos;int nHeight = 18;pwpos-cy = nHeight;prc-top = nHeight;return lResult;void CRSHeaderCtrl:OnNMCustomdraw(NMHDR *lpNMHDR, LRESULT *pResult) LPNMCUSTOMDRAW lpNMCDreinterpret_cast(lpNMHDR);switch(lpNMCD-dwDrawStage)case CDDS_PREPAINT:*pResult = CDRF_NOTIFYITEMDRAW|C
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1