📄 xlistbox.cpp
字号:
#include "stdafx.h"
#include "XListBox.h"
int CXListBox::AddItem(LPCTSTR lpszItem, COLORREF rgb)
{
int nItem = AddString(lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
}
int CXListBox::InsertItem(int nIndex, LPCTSTR lpszItem, COLORREF rgb)
{
int nItem = ((CListBox*)this)->InsertString(nIndex,lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
}
LRESULT CXListBox::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CClientDC dc(m_hWnd); //DON'T USE CPAINTDC
int nIndex = GetCurSel();
if(nIndex == LB_ERR)
return (DWORD)-1;
CRect rcItem,rcWnd;
GetItemRect(nIndex,&rcItem);
GetClientRect(&rcWnd);
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(dc,rcWnd.Width(),rcWnd.Height());
dcMem.SelectBitmap(bmpMem);
//Draw border when getting focus
DWORD dwStyle = GetStyle();
if(!(dwStyle & WS_BORDER))
rcWnd.right ++;
dcMem.SetBkMode(TRANSPARENT);
int dcSave = dcMem.SaveDC();
if(m_hWnd == ::GetFocus())
dcMem.SelectStockPen(BLACK_PEN);
else
dcMem.SelectStockPen(NULL_PEN);
dcMem.Rectangle(rcWnd);
dcMem.RestoreDC(dcSave);
//get text
CString szText;
GetText(nIndex,szText);
//Draw focus background
COLORREF cfItem = (COLORREF)GetItemData(nIndex);
CBrush br;
br.CreateSolidBrush(cfItem);
CRect rect(rcItem);
CSize size;
dc.GetTextExtent(szText,szText.GetLength(),&size);
// rect.right = rect.right * 9 / 10;
rect.DeflateRect(2,2,2,2);
dcMem.FillRect(rect,br);
//draw focus rect of control
if(m_bEnableBorder)
{
dcMem.DrawFocusRect(&rect);
rect.InflateRect(1,1,1,1);
CPen Pen;
Pen.CreatePen(PS_SOLID,1,RGB(0,128,128));
HPEN hpen = dcMem.SelectPen(Pen.m_hPen);
HBRUSH hBrush = dcMem.SelectStockBrush(NULL_BRUSH);
dcMem.Rectangle(&rect);
dcMem.SelectBrush(hBrush);
Pen.DeleteObject();
dcMem.SelectPen(hpen);
rect.left += 2;
}
//Set text color ,text font and Draw text
COLORREF crText = dcMem.SetTextColor(cfItem^RGB(255,255,255));
if ((cfItem == RGB(128,128,128)) || (cfItem == RGB(128,128,0)))
dcMem.SetTextColor(RGB(255,255,255));
dcMem.DrawText(szText, -1, &rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);
dcMem.SetTextColor(crText);
dc.BitBlt(rcWnd.left,rcWnd.top,rcWnd.Width(),rcWnd.Height(),dcMem,0,0,SRCCOPY);
dcMem.DeleteDC();
bmpMem.DeleteObject();
return 0;
}
void CXListBox::EnableRGBBorder(BOOL nEnabled)
{
m_bEnableBorder = nEnabled;
// Invalidate();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -