AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

Visual C++中轻松实现透明滑动控件

51自学网 2015-08-30 http://www.wanshiok.com

 

  三、程序代码

//////////////////////////////////////////// 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不保证资料的完整性。

上一篇:深入浅出Win32多线程设计之MFC的多线程  下一篇:用VC实现PC并行端口数字信息的输入/输出