?? 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
CMyListCtrl::CMyListCtrl()
{
m_nHighlight=0;
bMouseLbutton = FALSE ;
m_bHeaderIsSubclassed = FALSE;
}
CMyListCtrl::~CMyListCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
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()
ON_WM_CREATE()
ON_MESSAGE(WM_SETFONT, OnSetFont)
ON_WM_MEASUREITEM_REFLECT()
ON_WM_MEASUREITEM()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CJWListCtrl message handlers
BOOL CMyListCtrl::SetBkImage(UINT nIDResource)
{
return SetBkImage((LPCTSTR)nIDResource);
}
BOOL CMyListCtrl::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 );
m_IconBmp.LoadBitmap(IDB_FILES_ICON); //加載文件圖標
m_BKBmp.LoadBitmap(IDB_BMP_LCTRL_BK);
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 )
{
}
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);
return TRUE;
}
void CMyListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMyListCtrl::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 CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
CRect rcClient;
GetClientRect( &rcClient );
pDC->FillRect(rcClient, &CBrush(RGB(222,222,222)));
m_SkinVerticleScrollbar.UpdateThumbPosition();
return TRUE;
}
void CMyListCtrl::OnPaletteChanged(CWnd* pFocusWnd)
{
CListCtrl::OnPaletteChanged(pFocusWnd);
if( pFocusWnd == this ) return;
SendMessage( WM_PALETTECHANGED, (WPARAM)pFocusWnd->m_hWnd );
OnQueryNewPalette();
}
BOOL CMyListCtrl::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();
}
/************************************************************************/
/*
函數名稱:DrawItem;
函數功能:設置列表各項的特效
*/
/************************************************************************/
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
TCHAR lpBuffer[256];
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_PARAM ;
lvi.iItem = lpDrawItemStruct->itemID ;
lvi.iSubItem = 0;
lvi.pszText = lpBuffer ;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));
LV_COLUMN lvc, lvcprev ;
::ZeroMemory(&lvc, sizeof(lvc));
::ZeroMemory(&lvcprev, sizeof(lvcprev));
lvc.mask = LVCF_WIDTH | LVCF_FMT;
lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
{
if ( nCol > 0 )
{
// Get Previous Column Width in order to move the next display item
GetColumn(nCol-1, &lvcprev) ;
lpDrawItemStruct->rcItem.left += lvcprev.cx ;
lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left ;
}
// Get the text
::ZeroMemory(&lvi, sizeof(lvi));
lvi.iItem = lpDrawItemStruct->itemID;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iSubItem = nCol;
lvi.pszText = lpBuffer;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));
CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
if (nCol==0)
{
POINT point;
point.x=10;
point.y=0;
SetItemPosition(0,point);
}
if ( lpDrawItemStruct->itemState & ODS_SELECTED )
{
BITMAP bm;
m_bitmap.GetBitmap(&bm);
m_pbmCurrent = &m_bitmap;
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent);
pDC->StretchBlt(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top,
(lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left),
(lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top),&dcMem,0,0,m_cxBitmap,m_cyBitmap,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
dcMem.SelectObject(&m_IconBmp);
PaintIconByFilePath(pDC,&lpDrawItemStruct->rcItem,&dcMem,lvi.pszText);
pDC->SetBkMode(TRANSPARENT );
pDC->SelectObject(&m_NewListFont);
pDC->SetTextColor(RGB(255,122,255)/*GetSysColor(COLOR_HIGHLIGHTTEXT)*/) ;
lpDrawItemStruct->rcItem.left+=26;
UINT uFormat = DT_VCENTER|DT_LEFT;
CString str=lvi.pszText;
str=GetFileNameFromPath(str);
if (str==_T(""))
{
m_CurPath=lvi.pszText;
lvi.pszText=_T("...");
}
else
lvi.pszText=(LPTSTR)(LPCTSTR)str;
pDC->DrawText(lvi.pszText,&lpDrawItemStruct->rcItem,uFormat);
}
else
{
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(222,222,222)) ;
CPen pen;
pen.CreatePen(PS_SOLID,3,RGB(122,189,229));
pDC->SelectObject(&pen);
pDC->MoveTo(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.bottom);
pDC->LineTo(lpDrawItemStruct->rcItem.right,lpDrawItemStruct->rcItem.bottom);
//畫文件圖標
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_IconBmp);
PaintIconByFilePath(pDC,&lpDrawItemStruct->rcItem,&dcMem,lvi.pszText);
lpDrawItemStruct->rcItem.left+=26;
pDC->SetTextColor(RGB(0,122,255)) ;
pDC->SelectObject(&m_NewFont);
UINT uFormat = DT_VCENTER|DT_LEFT ;
lpDrawItemStruct->rcItem.top+=4;
CString str=lvi.pszText;
str=GetFileNameFromPath(str); //根據
if (str==_T("")) //LPTSTR與CSTRING的不能正確的比較,但是LPCTSTR可以與CString可以
{
lvi.pszText=_T("...");
}
else
lvi.pszText=(LPTSTR)(LPCTSTR)str;
pDC->DrawText(lvi.pszText,&lpDrawItemStruct->rcItem,uFormat);
}
pDC->SelectStockObject(SYSTEM_FONT) ;
}
// SetRedraw(TRUE);
}
BOOL CMyListCtrl::InsertImgTextItems( UINT ItemID , int ImgNumth , LPTSTR strItemText)
{
// Insert First Column items for every row
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_STATE ;
lvi.iItem = ItemID; //行行選項
lvi.iSubItem = 0; //列選項
if (ItemID==0) //設置第一項為高亮顯示
{
lvi.state = LVIS_SELECTED | LVIS_FOCUSED ;
}
else
lvi.state = LVIS_FOCUSED ;
lvi.stateMask = LVIS_SELECTED | LVIS_FOCUSED ;
lvi.pszText=strItemText ; //設置項文字
InsertItem(&lvi); //插入文字
return TRUE;
}
BOOL CMyListCtrl::SetBkColor(COLORREF cr)
{
ASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr);
return (BOOL) ::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -