www.pudn.com > MediaPlayer.rar > mySliderControl.cpp


#include "stdafx.h" 
#include "MySliderControl.h" 
#include "windows.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#include "resource.h" 
CMySliderControl::CMySliderControl() 
{ 
	m_dcBk.m_hDC = NULL; 
} 
 
CMySliderControl::~CMySliderControl() 
{  
	DeleteObject(m_dcBk.SelectObject(&m_bmpBkOld)); 
	DeleteDC(m_dcBk);  
} 
 
BEGIN_MESSAGE_MAP(CMySliderControl, CSliderCtrl) 
//{{AFX_MSG_MAP(CMySliderControl) 
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 
	ON_WM_ERASEBKGND() 
//	ON_WM_PAINT() 
 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
void CMySliderControl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)pNMHDR; 
	CDC *pDC = CDC::FromHandle(lpcd->hdc); 
	switch(lpcd->dwDrawStage) 
	{ 
		case CDDS_PREPAINT: 
		*pResult = CDRF_NOTIFYITEMDRAW ; 
		break; 
		//return;  
		case CDDS_ITEMPREPAINT: 
	if (lpcd->dwItemSpec == TBCD_THUMB) 
	{ 
		*pResult = CDRF_DODEFAULT; 
		break; 
	} 
	if (lpcd->dwItemSpec == TBCD_CHANNEL) 
	{ 
		CClientDC clientDC(GetParent()); 
		CRect crect; 
		CRect wrect; 
		GetClientRect(crect); 
		GetWindowRect(wrect); 
		GetParent()->ScreenToClient(wrect); 
		if (m_dcBk.m_hDC == NULL) 
		{ 
			m_dcBk.CreateCompatibleDC(&clientDC); 
			 
 
			m_bmpBk.CreateCompatibleBitmap(&clientDC, crect.Width(), crect.Height()); 
 
			m_bmpBkOld = m_dcBk.SelectObject(&m_bmpBk); 
			m_dcBk.BitBlt(0, 0, crect.Width(), crect.Height(), &clientDC, wrect.left, wrect.top, SRCCOPY); 
		} 
//This bit does the tics marks transparently. 
			CDC SaveCDC; 
			CBitmap SaveCBmp, maskBitmap; 
//set the colours for the monochrome mask bitmap 
			COLORREF crOldBack = pDC->SetBkColor(RGB(0,0,0)); 
			COLORREF crOldText = pDC->SetTextColor(RGB(255,255,255)); 
			CDC maskDC; 
			int iWidth = crect.Width(); 
			int iHeight = crect.Height(); 
			SaveCDC.CreateCompatibleDC(pDC); 
		 
			SaveCBmp.CreateCompatibleBitmap(&SaveCDC, iWidth, iHeight); 
			CBitmap* SaveCBmpOld = (CBitmap *)SaveCDC.SelectObject(SaveCBmp);//////////////////////// 
			 
	//fill in the memory dc for the mask 
			maskDC.CreateCompatibleDC(&SaveCDC); 
	//create a monochrome bitmap 
			maskBitmap.CreateBitmap(iWidth, iHeight, 1, 1, NULL); 
//select the mask bitmap into the dc 
			CBitmap* OldmaskBitmap = maskDC.SelectObject(&maskBitmap);////////////////////////////////// 
 
			 
	//copy the oldbitmap data into the bitmap, this includes the tics. 
			SaveCDC.BitBlt(0, 0, iWidth, iHeight, pDC, crect.left, crect.top, SRCCOPY); 
//now copy the background into the slider 
			BitBlt(lpcd->hdc, 0, 0, iWidth, iHeight, m_dcBk.m_hDC, 0, 0, SRCCOPY); 
// Blit the mask based on background colour 
			maskDC.BitBlt(0, 0, iWidth, iHeight, &SaveCDC, 0, 0, SRCCOPY); 
// Blit the image using the mask 
			pDC->BitBlt(0, 0, iWidth, iHeight, &SaveCDC, 0, 0, SRCINVERT); 
			pDC->BitBlt(0, 0, iWidth, iHeight, &maskDC, 0, 0, SRCAND); 
			pDC->BitBlt(0, 0, iWidth, iHeight, &SaveCDC, 0, 0, SRCINVERT); 
//restore and clean up 
			pDC->SetBkColor(crOldBack); 
			pDC->SetTextColor(crOldText); 
			DeleteObject(SelectObject(SaveCDC, SaveCBmpOld)); 
			DeleteDC(SaveCDC); 
			DeleteObject(maskDC.SelectObject(OldmaskBitmap)); 
			DeleteDC(maskDC); 
			*pResult = 0; 
		break; 
		} 
	} 
} 
 
BOOL CMySliderControl::OnEraseBkgnd(CDC* pDC) 
{ 
	return FALSE; 
} 
 
/*void CMySliderControl::OnPaint() 
{ 
/*	CPaintDC dc(this); // device context for painting 
	// TODO: Add your message handler code here and/or call default 
	CBitmap bitmap; 
	bitmap.LoadBitmap(IDB_BITMAP2); //从这里就可以用superl所提到的方法   //从界面里截图,从而达到所谓的"透明" 
	CDC tempDC; 
	tempDC.CreateCompatibleDC(&dc); 
	CBitmap * pOldMap = tempDC.SelectObject(&bitmap); 
	CRect rect; 
	GetClientRect(&rect); 
	dc.BitBlt(0,0,rect.Width(),rect.Height(),&tempDC,0,0,SRCCOPY); 
	tempDC.SelectObject(pOldMap); 
	this->GetChannelRect(&rect); 
	//为了方便,这里没有用系统颜色,自己随便写了几个颜色 
	dc.Draw3dRect(&rect,RGB(255,0,0),RGB(0,255,255)); 
		this->GetThumbRect(&rect); 
	dc.Draw3dRect(&rect,RGB(255,0,0),RGB(0,255,255)); 
	// TODO: Add your message handler code here 
	// Do not call CSliderCtrl::OnPaint() for painting messages 
 
} 
*/