⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotlistctrl.cpp

📁 A transparent list control on winCE
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -