////////////////////////////////////////////
MySliderControl.h : header file
#if
!defined(AFX_MYSLIDERCONTROL_H__C76FA857_51CC_4EB6_A8E2_8323BBEF10BD__INCLUDED_)
#define
AFX_MYSLIDERCONTROL_H__C76FA857_51CC_4EB6_A8E2_8323BBEF10BD__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMySliderControl : public CSliderCtrl
{
CDC m_dcBk;
CBitmap m_bmpBk;
CBitmap *m_bmpBkOld;
//CBitmap* m_pbmpOldBk;
CPen m_penThumb;
CPen m_penThumbLight;
CPen m_penThumbLighter;
CPen m_penThumbDark;
CPen m_penThumbDarker;
COLORREF m_crThumb;
COLORREF m_crThumbLight;
COLORREF m_crThumbLighter;
COLORREF m_crThumbDark;
COLORREF m_crThumbDarker;
// Construction
public:
CMySliderControl();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMySliderControl)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMySliderControl();
// Generated message map functions
protected:
//{{AFX_MSG(CMySliderControl)
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT*
pResult);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif
//////////// MySliderControl.cpp : implementation file
#include "stdafx.h"
#include "MySliderControl.h"
#include "windows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
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()
//}}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;
}
|