📄 hotlistctrl.cpp
字号:
Pen.Detach();
Pen.CreatePen(PS_SOLID, 1, rgbTopLeft);
pOldPen = pDC->SelectObject(&Pen);
pDC->MoveTo(rc->left, rc->bottom-1);
pDC->LineTo(rc->left, rc->top);
pDC->LineTo(rc->right, rc->top);
pDC->SelectObject(pOldPen);
}
// return FALSE if there is not enough room to draw the item
BOOL CHotListCtrl::DrawItem(CDC* pDC, int nItem, BOOL bHighlighted, BOOL bSelected)
{
// make sure the item is visible
//if (nItem < m_nFirstVisibleItem) return FALSE;
//if (nItem >= m_StringArray.GetSize()) return FALSE;
CRect rc;
if (!GetItemRect(&rc, nItem)) return FALSE;
COLORREF rgbOldTextColor;
pDC->SetBkMode(TRANSPARENT);
CDC dcTempDC;
CDC dcTempDC2;
HBITMAP hbmpOldTempBitmap = NULL;
dcTempDC.CreateCompatibleDC(pDC);
PaintBk(pDC,rc);
if(NULL != m_hBitmapUp){
dcTempDC2.CreateCompatibleDC(NULL);
hbmpOldTempBitmap = (HBITMAP)dcTempDC2.SelectObject(m_hBitmapMask);
pDC->BitBlt(rc.left,
rc.top,
rc.Width(),
rc.Height(),
&dcTempDC2,
0,
0,
SRCAND);
}
if (bSelected || bHighlighted){
hbmpOldTempBitmap = (HBITMAP)dcTempDC.SelectObject(m_hBitmapDown);
rgbOldTextColor = pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
}
else{
hbmpOldTempBitmap = (HBITMAP)dcTempDC.SelectObject(m_hBitmapUp);
rgbOldTextColor = pDC->SetTextColor(GetSysColor(COLOR_WINDOW));
}
DWORD rasterOp;
if(NULL != m_hBitmapUp)
rasterOp = SRCPAINT;
else
rasterOp = SRCCOPY;
// draw the bitmap
/*
pDC->StretchBlt(rc.left,
rc.top,
rc.Width(),
rc.Height(),
&dcTempDC,
0,
0,
m_bmWidth,
m_bmHeight,
rasterOp);
*/
pDC->BitBlt(rc.left,
rc.top,
rc.Width(),
rc.Height(),
&dcTempDC,
0,
0,
rasterOp);
dcTempDC.SelectObject(hbmpOldTempBitmap);
dcTempDC2.SelectObject(hbmpOldTempBitmap);
CFont* pOldFont = pDC->SelectObject(&m_Font);
CRect rectText = rc;
rectText.left += 10;
rectText.top += 10;
CString str;
if(nItem < m_StringArray.GetSize())
str = m_StringArray.GetAt(nItem);
pDC->DrawText(str,
&rectText,
DT_LEFT | DT_SINGLELINE);
pDC->SetTextColor(rgbOldTextColor);
pDC->SelectObject(pOldFont);
return TRUE;
}
int CHotListCtrl::HitTest(CPoint pt)
{
CRect rc;
GetWindowRect(&rc);
if (rc.PtInRect(pt) == FALSE) return -1;
rc.top = rc.bottom - m_nBottomScrollHeight;
if (rc.PtInRect(pt)) return -3; // bottom button is hot
int nBottom = rc.top;
GetWindowRect(&rc);
rc.bottom = rc.top + m_nTopScrollHeight;
if (rc.PtInRect(pt)) return -2; // top button is hot
int nItem = m_nFirstVisibleItem;
while (rc.bottom < nBottom)
{
rc.top = rc.bottom;
rc.bottom = rc.top + m_nRowHeight;
if (rc.PtInRect(pt)) return nItem;
++nItem;
}
return -1;
}
void CHotListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_nPressedItem = HitTest(point);
if (m_nPressedItem == -1) return;
CDC* pDC = GetDC();
if (m_nPressedItem == -2)
{
//DrawScrollBar(pDC, TRUE, FALSE, TRUE);
}
else if (m_nPressedItem == -3)
{
//DrawScrollBar(pDC, FALSE, FALSE, TRUE);
}
else if (m_nPressedItem < m_DataArray.GetSize())
{
DrawItem(pDC, m_nPressedItem, FALSE, TRUE);
GetParent()->SendMessage(WM_HOT_LIST_CHANGED, m_nPressedItem,
m_DataArray.GetAt(m_nPressedItem));
}
CWnd::OnLButtonDown(nFlags, point);
}
void CHotListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
int nItem = HitTest(point);
if (nItem == -1 || nItem != m_nPressedItem || nItem >= m_StringArray.GetSize())
{
m_nPressedItem = -1;
}
else if (nItem != m_nSelectedItem)
{
CDC* pDC = GetDC();
if (nItem == -2)
{
OnScrollUp();
}
else if (nItem == -3)
{
OnScrollDown();
}
else
{
DrawItem(pDC, m_nSelectedItem, FALSE, FALSE);
m_nSelectedItem = nItem;
DrawItem(pDC, m_nSelectedItem, TRUE, FALSE);
// notify parent window of change
}
}
CWnd::OnLButtonUp(nFlags, point);
}
void CHotListCtrl::OnScrollUp()
{
int size = m_StringArray.GetSize();
m_nFirstVisibleItem -= m_nRows;
if (m_nFirstVisibleItem < 0)
m_nFirstVisibleItem = 0;
InvalidateRect(NULL, TRUE);
}
void CHotListCtrl::OnScrollDown()
{
int size = m_StringArray.GetSize();
m_nFirstVisibleItem += m_nRows;
if(m_nFirstVisibleItem > size){
m_nFirstVisibleItem -= m_nRows;
}
InvalidateRect(NULL, TRUE);
}
BOOL CHotListCtrl::SetItemBkgnd(HBITMAP hBmUp,HBITMAP hBmDown,COLORREF ColorKey)
{
//HINSTANCE hInstResource = NULL;
BITMAP csBitmapSize;
// Find correct resource handle
//hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmapIn), RT_BITMAP);
m_hBitmapUp = hBmUp;
m_hBitmapDown = hBmDown;
/*
if(NULL == m_hBitmapUp)
return FALSE;
if(NULL == m_hBitmapDown)
return FALSE;
*/
int rc = ::GetObject(m_hBitmapDown,sizeof(csBitmapSize),&csBitmapSize);
if(rc == 0){
return FALSE;
}
m_bmWidth = (DWORD)csBitmapSize.bmWidth;
m_bmHeight = (DWORD)csBitmapSize.bmHeight;
m_hBitmapMask = CreateBitmapMask(m_hBitmapDown,m_bmWidth,m_bmHeight,ColorKey);
return TRUE;
}
void CHotListCtrl::PaintBk(CDC* pDC,CRect &rect)
{
CWnd *pWnd = GetParent();
CClientDC clDC(pWnd);
//CRect rect;
CRect rect1;
//GetClientRect(rect);
//GetWindowRect(rect1);
rect1 = rect;
ClientToScreen(rect1);
if (m_dcBk.m_hDC == NULL)
{
m_dcBk.CreateCompatibleDC(&clDC);
m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(rect.left,
rect.top,
rect.Width(),
rect.Height(),
&clDC,
rect1.left,
rect1.top,
SRCCOPY);
} // if
pDC->BitBlt(rect.left,
rect.top,
rect.Width(),
rect.Height(),
&m_dcBk,
rect.left,
rect.top,
SRCCOPY);
} // End of PaintBk
BOOL CHotListCtrl::SetBk(CDC* pDC)
{
if (pDC){
// Restore old bitmap (if any)
if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
{
m_dcBk.SelectObject(m_pbmpOldBk);
} // if
m_bmpBk.DeleteObject();
m_dcBk.DeleteDC();
CRect rect;
CRect rect1;
GetClientRect(rect);
GetWindowRect(rect1);
ClientToScreen(rect1);
m_dcBk.CreateCompatibleDC(pDC);
m_bmpBk.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, rect1.left, rect1.top, SRCCOPY);
return TRUE;
} // if
return FALSE;
} // End of SetBk
void CHotListCtrl::DrawTransparent(BOOL bRepaint)
{
//m_bDrawTransparent = TRUE;
// Restore old bitmap (if any)
if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
{
m_dcBk.SelectObject(m_pbmpOldBk);
} // if
m_bmpBk.DeleteObject();
m_dcBk.DeleteDC();
// Repaint the button
if (bRepaint) Invalidate();
} // End of DrawTransparent
HBITMAP CHotListCtrl::CreateBitmapMask(HBITMAP hSourceBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTransColor)
{
HBITMAP hMask = NULL;
HDC hdcSrc = NULL;
HDC hdcDest = NULL;
HBITMAP hbmSrcT = NULL;
HBITMAP hbmDestT = NULL;
COLORREF crSaveBk;
COLORREF crSaveDestText;
hMask = ::CreateBitmap(dwWidth, dwHeight, 1, 1, NULL);
if (hMask == NULL) return NULL;
hdcSrc = ::CreateCompatibleDC(NULL);
hdcDest = ::CreateCompatibleDC(NULL);
hbmSrcT = (HBITMAP)::SelectObject(hdcSrc, hSourceBitmap);
hbmDestT = (HBITMAP)::SelectObject(hdcDest, hMask);
crSaveBk = ::SetBkColor(hdcSrc, crTransColor);
::BitBlt(hdcDest, 0, 0, dwWidth, dwHeight, hdcSrc, 0, 0, SRCCOPY);
crSaveDestText = ::SetTextColor(hdcSrc, RGB(255, 255, 255));
::SetBkColor(hdcSrc,RGB(0, 0, 0));
::BitBlt(hdcSrc, 0, 0, dwWidth, dwHeight, hdcDest, 0, 0, SRCAND);
SetTextColor(hdcDest, crSaveDestText);
::SetBkColor(hdcSrc, crSaveBk);
::SelectObject(hdcSrc, hbmSrcT);
::SelectObject(hdcDest, hbmDestT);
::DeleteDC(hdcSrc);
::DeleteDC(hdcDest);
return hMask;
} // End of CreateBitmapMask
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -