📄 jwlistctrl.cpp
字号:
// JWListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "JWListCtrl.h"
#include "MemDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CJWListCtrl
CJWListCtrl::CJWListCtrl()
{
m_nHighlight=0;
bMouseLbutton = FALSE ;
}
CJWListCtrl::~CJWListCtrl()
{
}
BEGIN_MESSAGE_MAP(CJWListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CJWListCtrl)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_WM_KEYUP()
ON_WM_ERASEBKGND()
ON_WM_PALETTECHANGED()
ON_WM_QUERYNEWPALETTE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CJWListCtrl message handlers
BOOL CJWListCtrl::SetBkImage(UINT nIDResource)
{
return SetBkImage((LPCTSTR)nIDResource);
}
BOOL CJWListCtrl::SetBkImage(LPCTSTR lpszResourceName)
{
// If this is not the first call then Delete GDI objects
SetRedraw(FALSE);
if( m_bitmap.m_hObject != NULL ) m_bitmap.DeleteObject();
if( m_pal.m_hObject != NULL ) m_pal.DeleteObject();
HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), lpszResourceName, IMAGE_BITMAP, 0,0, 0);//LR_CREATEDIBSECTION );
if( hBmp == NULL ) return FALSE;
m_bitmap.Attach( hBmp );
BITMAP bm;
m_bitmap.GetBitmap( &bm );
m_cxBitmap = bm.bmWidth;
m_cyBitmap = bm.bmHeight;
// Create a logical palette for the bitmap
DIBSECTION ds;
BITMAPINFOHEADER &bmInfo = ds.dsBmih;
m_bitmap.GetObject( sizeof(ds), &ds );
int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
// Create a halftone palette if colors > 256.
CClientDC dc(NULL); // Desktop DC
if( nColors > 256 )
{
//m_pal.CreateHalftonePalette( &dc );
}
else
{
// Create the palette
RGBQUAD *pRGB = new RGBQUAD[nColors];
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject( &m_bitmap );
::GetDIBColorTable( memDC, 0, nColors, pRGB );
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for( int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
m_pal.CreatePalette( pLP );
delete[] pLP;
delete[] pRGB;
}
SetRedraw(TRUE);
//InvalidateRect(NULL);
return TRUE;
}
void CJWListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
/*SetRedraw(FALSE);
if( m_bitmap.m_hObject != NULL ) Invalidate(TRUE);
SetRedraw(TRUE); */
CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CJWListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SetRedraw(FALSE);
CRect rcClinent;
GetClientRect( &rcClinent );
if( m_bitmap.m_hObject != NULL )
InvalidateRect( &rcClinent, FALSE );
SetRedraw(TRUE);
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}
BOOL CJWListCtrl::OnEraseBkgnd(CDC* pDC)
{
//SetRedraw( FALSE );
BITMAP bm;
m_bitmap.GetBitmap(&bm);
m_pbmCurrent = &m_bitmap;
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
pDC->SetBkMode(TRANSPARENT );
dcMem.SelectObject(pOldBitmap);
//m_SkinVerticleScrollbar.UpdateThumbPosition();
//SetRedraw(TRUE);
//UpdateWindow();
//RedrawWindow( NULL, NULL );
//dcMem.DeleteDC();
m_SkinVerticleScrollbar.UpdateThumbPosition();
if( m_bitmap.m_hObject != NULL )
return TRUE;
return CListCtrl::OnEraseBkgnd(pDC);
}
void CJWListCtrl::OnPaletteChanged(CWnd* pFocusWnd)
{
CListCtrl::OnPaletteChanged(pFocusWnd);
// TODO: Add your message handler code here
if( pFocusWnd == this ) return;
//SendMessage( WM_PALETTECHANGED, (WPARAM)pFocusWnd->m_hWnd );
OnQueryNewPalette();
}
BOOL CJWListCtrl::OnQueryNewPalette()
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
{
dc.SelectPalette( &m_pal, FALSE );
BOOL result = dc.RealizePalette();
if( result ) Invalidate(FALSE);
return result;
}
return CListCtrl::OnQueryNewPalette();
}
void CJWListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
SetRedraw(FALSE);
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcItem(lpDrawItemStruct->rcItem);
int nItem = lpDrawItemStruct->itemID;
CImageList* pImageList;
// Save dc state
int nSavedDC = pDC->SaveDC();
// Get item image and state info
LV_ITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_STATE;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.stateMask = 0xFFFF; // get all state flags
GetItem(&lvi);
// Should the item be highlighted
BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED)&&((GetFocus() == this)||
(GetStyle() & LVS_SHOWSELALWAYS))));
// Get rectangles for drawing
CRect rcBounds, rcLabel, rcIcon;
GetItemRect(nItem, rcBounds, LVIR_BOUNDS);
GetItemRect(nItem, rcLabel, LVIR_LABEL);
GetItemRect(nItem, rcIcon, LVIR_ICON);
CRect rcCol( rcBounds );
CString sLabel = GetItemText(nItem, 0 );
// Labels are offset by a certain amount
// This offset is related to the width of a space character
int offset = pDC->GetTextExtent(_T(" "), 1 ).cx*2;
CRect rcHighlight;
CRect rcClient;
int nExt;
switch(m_nHighlight)
{
case 0:
nExt=pDC->GetOutputTextExtent(sLabel).cx + offset;
rcHighlight = rcLabel;
// if( rcLabel.left + nExt
if( m_bitmap.m_hObject != NULL )
{
CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
tempDC.SelectObject( &m_bitmap );
GetClientRect(&rcClient);
CRgn rgnBitmap;
CRect rcTmpBmp( rcItem );
rcTmpBmp.right = rcClient.right;
// We also need to check whether it is the last item
// The update region has to be extended to the bottom if it is
if( nItem == GetItemCount() - 1 )
rcTmpBmp.bottom = rcClient.bottom;
rgnBitmap.CreateRectRgnIndirect(&rcTmpBmp);
pDC->SelectClipRgn(&rgnBitmap);
rgnBitmap.DeleteObject();
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
{
pDC->SelectPalette( &m_pal, FALSE );
pDC->RealizePalette();
}
CRect rcFirstItem;
GetItemRect(0, rcFirstItem, LVIR_BOUNDS);
for (int i = rcFirstItem.left; i < rcTmpBmp.right; i += m_cxBitmap)
for (int j = rcFirstItem.top; j < rcTmpBmp.bottom; j += m_cyBitmap)
pDC->BitBlt(i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY);
}
}
// Draw the background color
if( bHighlight )
{
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
pDC->FillRect(rcHighlight, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
}
else if( m_bitmap.m_hObject == NULL )
pDC->FillRect(rcHighlight, &CBrush(::GetSysColor(COLOR_WINDOW)));
// Set clip region
rcCol.right = rcCol.left + GetColumnWidth(0);
CRgn rgn;
rgn.CreateRectRgnIndirect(&rcCol);
pDC->SelectClipRgn(&rgn);
rgn.DeleteObject();
// Draw state icon
if (lvi.state & LVIS_STATEIMAGEMASK)
{
int nImage = ((lvi.state & LVIS_STATEIMAGEMASK)>>12) - 1;
pImageList = GetImageList(LVSIL_STATE);
if (pImageList)
{
pImageList->Draw(pDC, nImage,
CPoint(rcCol.left, rcCol.top), ILD_TRANSPARENT);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -