图像按钮的实现 CImageButton

本文介绍如何在C++中使用GDI+库创建一个图像按钮类CImageButton,包括加载图像、平铺显示、鼠标交互效果等功能。通过示例代码详细展示了按钮的绘制过程,包括不同状态(按下、悬浮)的图像处理。
摘要由CSDN通过智能技术生成

 

环境设置:需要有GDIPlus,并设置好相应的路径

程序代码如下:

//stdafx.h

    #ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #endif

    #include <GdiPlus.h>
    #pragma comment(lib,"GdiPlus.lib")

    using namespace Gdiplus;

//你的APP文件(.h)

   class C**App : public CWinApp
   增加变量 :  ULONG_PTR m_gdiplusToken;

   增加方法  :   virtual int ExitInstance();

//你的APP文件(.cpp)

  BOOL C**App::InitInstance()
  {
       Gdiplus::GdiplusStartupInput gdiplusStartupInput;
       Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

       ****以下默认****
  }

  int C**App::ExitInstance()
  {
       Gdiplus::GdiplusShutdown(m_gdiplusToken);
       return CWinApp::ExitInstance();
   }

 

   下面转入正题:

    //ImageButton.h

    
   //                  Origin Author : Darren Sessions                       //
  //                  Origin Class  : GdipButton                            //
//                  http://www.codeproject.com/KB/buttons/GdipButton.aspx //
//                  Modify: wxy3064one##163.com                           //
//                          (1)支持Flat和正常显示                         //
//                          (2)删除了Alter相关的处理                      //
//                          (3)图片居中显示                               //
//                                                                        //
//                  Date:   2010-5-20                                     //

#pragma once
class CMemDC : public CDC 
{
public:
 CMemDC(CDC* pDC, const CRect& rect) : CDC(), m_pOldBitmap(NULL), m_pDC(pDC)
 {
  ASSERT(m_pDC != NULL);
  
#ifndef WCE_NO_PRINTING
        m_bValid = !pDC->IsPrinting();
#else
        m_bValid = FALSE;
#endif
  
  if (m_bValid){

   if (CreateCompatibleDC(m_pDC))
   {
    SetMapMode(m_pDC->GetMapMode());
    if ( rect == CRect(0,0,0,0) )
     pDC->GetClipBox(&m_rc);
    else
     m_rc = rect;    
    m_bitmap.CreateCompatibleBitmap(m_pDC, m_rc.Width(), m_rc.Height());
    
    m_pOldBitmap = SelectObject(&m_bitmap);
    
   #ifndef _WIN32_WCE
    SetWindowOrg(m_rc.left, m_rc.top);
   #endif 
   }
   else
   {
    m_bValid = FALSE;
    m_pOldBitmap = NULL;
   }
  } else {
#ifndef WCE_NO_PRINTING
            m_bPrinting = pDC->m_bPrinting;
#endif
   m_hDC = pDC->m_hDC;
   m_hAttribDC = pDC->m_hAttribDC;
  }
 }
    virtual ~CMemDC()
 {
  if (m_bValid)
  {
   m_pDC->BitBlt(m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(),this, 0, 0, SRCCOPY);
  }
    
  if (m_pOldBitmap != NULL)
   SelectObject(m_pOldBitmap);

  DeleteDC();
 }

 CRect    GetRect()   { return m_rc; }
    CBitmap& GetBitmap() { return m_bitmap; }

 CMemDC*  operator->(){ return this; }
 operator CMemDC*()   { return this; }

 void Discard()
 {
  m_bValid = FALSE;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值