三、程序代码
//////////////////////////////////////////// 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; } |
四、小结
本实例主要是通过分析NMCUSTOMDRAW结构的成员变量的各个含义,判断当前滑动控件处于什么绘制阶段,绘制的是哪个项目,来决定执行何种操作,当滑动控件需要绘制轨道项目的时候,我们进行了相应的处理,实现了滑动控件的透明效果。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |