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
}
*/