定制一个BitmapButton类

原创 2002年03月25日 08:48:00

    本文详叙了自制一个bitmapbutton类的一种制作方法。这个子定义的bitmapbutton类有类似于MFC种CBitmapButton类的功能。

    这个bitmapbutton有关联四个位图,分别一般状态,按下状态,焦点状态,和无效状态的位图。该bitmapbutton类的对象能接受消息,能向主窗口传递消息。模仿了CBitmapButton类的大部分功能。

下面是该类的申明和实现。

//  FileName:BitmapButton.h: interface for the BitmapButton class.
//  Envionment:Visual C++ 6.0,Windows 9x/2k
//
// Author:kaitty
// Email:kaitty@x263.net or nsi10102@nsi
// Date: 2002.2.10

//***********************************************************************************
//   说明:这是一个自定义的BitmapButton类,功能是使一个Button上关联四个
//        位图。
//   接口:HWND CreateBitmapButtonWindow(LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,
//        int x,int y,int nWidth,int nHeight,
//  HWND hwndParent,HMENU hmenu,HINSTANCE hInstance,
//  UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap);
//      创建一个BitmapButton; 
//      int SetBitmap(HWND hwnd,UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap);
//      改变关联Button的位图。
//      BOOL EnableBitmapButton(HWND hwnd,BOOL bEnable);
//      使Button有效或无效。
//      int GetWindowState(HWND hwnd);  
//      获取Button状态;返回值为0,1,2,3中的一个。
***********************************************************************************

#define WM_BITMAP  WM_USER+999  自己定义消息,用于把button变为无效状态


struct PrivateInfo{
 HBITMAP hbitmap0;  
 HBITMAP hbitmap1;  
 HBITMAP hbitmap2;  
 HBITMAP hbitmap3;  
 int state;
 };
class BitmapButton 
{
private:
 HWND m_hwnd;   //  对象的窗口句柄
public:
 virtual ~BitmapButton();
     BitmapButton(LPCTSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,
     int x,int y,int nWidth,int nHeight,
     HWND hwndParent,HMENU hmenu,HINSTANCE hInstance,
     UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap);//构造函数
     BOOL EnableBitmapButton(HWND hwnd,BOOL bEnable); // 使button无效或有效

     int GetWindowState(HWND hwnd);  //  获取 button得窗口句柄
     int SetBitmap(HWND hwnd,UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap);  // 重新设置关联位图

};
 LRESULT CALLBACK ButtonProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //窗口函数

***********************************************************************************
//  FileName:BitmapButton.cpp : implementation file
//  Envionment:Visual C++ 6.0,Windows 9x/2k
//
// Author:kaitty
// Email:kaitty@x263.net or nsi10102@nsi
// Date: 2002.2.10
***********************************************************************************


#include "stdafx.h"
#include "BitmapButton.h"
#include "resource.h"


///////////////////////////////////////////////////////////////////////

BitmapButton::~BitmapButton()
{

}

/////////////////////////////////////////////////////////////////

BitmapButton::BitmapButton(LPCTSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,
  int x,int y,int nWidth,int nHeight,
  HWND hwndParent,HMENU hmenu,HINSTANCE hInstance,
  UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap)
{
  
 WNDCLASS wnd;
 wnd.cbClsExtra        = 0;
 wnd.cbWndExtra    = 0;
 wnd.hbrBackground   = NULL;
 wnd.hCursor    = LoadCursor(NULL,IDC_ARROW);
 wnd.hIcon     = NULL;
 wnd.hInstance    = (HINSTANCE)GetWindowLong(hwndParent,GWL_HINSTANCE);
 wnd.lpfnWndProc   = (WNDPROC)ButtonProc;
 wnd.lpszClassName   = lpClassName;
 wnd.lpszMenuName   = NULL;
 wnd.style     = CS_HREDRAW | CS_VREDRAW;
 
 if(!RegisterClass(&wnd)) return ;
     HWND hwnd;
    hwnd=CreateWindow(lpClassName,lpWindowName,dwStyle,
  x,y,nWidth,nHeight,hwndParent,hmenu,hInstance,NULL);
 
 PrivateInfo *pPrivateInfo=new PrivateInfo;
     pPrivateInfo->state=0;
 pPrivateInfo->hbitmap0=LoadBitmap(hInstance,MAKEINTRESOURCE(upBitmap));
     pPrivateInfo->hbitmap1=LoadBitmap(hInstance,MAKEINTRESOURCE(downBitmap));
     pPrivateInfo->hbitmap2=LoadBitmap(hInstance,MAKEINTRESOURCE(focusBitmap));
 pPrivateInfo->hbitmap3=LoadBitmap(hInstance,MAKEINTRESOURCE(disableBitmap));

 SetWindowLong(hwnd,GWL_USERDATA,(long)pPrivateInfo);
   
 ShowWindow(hwnd,SW_SHOW);
 UpdateWindow(hwnd);
 m_hwnd = hwnd;
}

////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK ButtonProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int xPos,yPos;
    PrivateInfo *pPrivate;
    HRGN hrgn;
    HDC hdc,hdcmem;
    PAINTSTRUCT ps;
    RECT rect;

    GetWindowRect(hWnd,&rect);
    hrgn=CreateRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top);
    pPrivate=(PrivateInfo*)GetWindowLong(hWnd,GWL_USERDATA);
    xPos = LOWORD(lParam);
    yPos = HIWORD(lParam);
 
 switch (message)
 {
  case WM_CREATE:
   break;
        case WM_COMMAND:
      break;
  case WM_PAINT:
   RECT rt;
   hdc = BeginPaint(hWnd, &ps);
   // TODO: Add any drawing code here...
   GetClientRect(hWnd, &rt);
   BITMAP bm;
     hdcmem=CreateCompatibleDC(hdc);
   switch(pPrivate->state)
   {
   case 0:SelectObject(hdcmem,pPrivate->hbitmap0);
      GetObject(pPrivate->hbitmap0,sizeof(BITMAP),&bm);break;
   case 1:SelectObject(hdcmem,pPrivate->hbitmap1);
      GetObject(pPrivate->hbitmap1,sizeof(BITMAP),&bm);break;
   case 2:SelectObject(hdcmem,pPrivate->hbitmap2);
      GetObject(pPrivate->hbitmap2,sizeof(BITMAP),&bm);break;
   case 3:SelectObject(hdcmem,pPrivate->hbitmap3);
      GetObject(pPrivate->hbitmap3,sizeof(BITMAP),&bm);break;
   }
   StretchBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,hdcmem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
   DeleteDC(hdcmem);
   EndPaint(hWnd, &ps);
   break;
  case WM_DESTROY:
     DeleteObject(pPrivate->hbitmap0);
             DeleteObject(pPrivate->hbitmap1);
     DeleteObject(pPrivate->hbitmap2);
     DeleteObject(pPrivate->hbitmap3);
     DestroyWindow(hWnd);
   break;
  case WM_LBUTTONDOWN:
      if(pPrivate->state!=3)
   {
   pPrivate->state=2;
   if(!(GetCapture()==hWnd)) SetCapture(hWnd);
   InvalidateRect(hWnd,NULL,0);
   };
   break;
  case WM_LBUTTONUP:
    if(pPrivate->state!=3)
    {
    ReleaseCapture();
    pPrivate->state=0;
             if(PtInRegion(hrgn,xPos,yPos))
    SendMessage(GetParent(hWnd),WM_COMMAND,GetWindowLong(hWnd,GWL_ID),0);
    };
    break;
  case WM_MOUSEMOVE:
   HCURSOR hcur; 
    if(pPrivate->state!=3)
    {  
    if(!(GetCapture()==hWnd)) SetCapture(hWnd);
    hcur=LoadCursor((HINSTANCE)GetWindowLong(GetParent(hWnd),GWL_HINSTANCE),MAKEINTRESOURCE(IDC_HAND));
    SetCursor(hcur);
    if((GetCapture()==hWnd)&&(!PtInRegion(hrgn,xPos,yPos)))
    { pPrivate->state=0; ReleaseCapture();}
    else pPrivate->state=1;
          InvalidateRect(hWnd,NULL,0);
    };
    break;
  case WM_BITMAP:
   if(wParam==1) pPrivate->state=0;
   else pPrivate->state=3;
   InvalidateRect(hWnd,NULL,0);
   break;
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

//////////////////////////////////////////////////////////////////////

BOOL BitmapButton::EnableBitmapButton(HWND hwnd,BOOL bEnable)
{
 
 SendMessage(hwnd,WM_BITMAP,bEnable,0);
 
 return true;
}

///////////////////////////////////////////////////////////////////////

int BitmapButton::GetWindowState(HWND hwnd)
{
 PrivateInfo *pPrivate;
   
 pPrivate=(PrivateInfo*)GetWindowLong(hwnd,GWL_USERDATA);
 
 return pPrivate->state;
}

//////////////////////////////////////////////////////////////////////////

int BitmapButton::SetBitmap(HWND hwnd,UINT upBitmap,UINT downBitmap,UINT focusBitmap,UINT disableBitmap)
{
 PrivateInfo *pPrivateInfo=new PrivateInfo;
   
 pPrivateInfo=(PrivateInfo*)GetWindowLong(hwnd,GWL_USERDATA);
 
 DeleteObject(pPrivateInfo->hbitmap0);
 DeleteObject(pPrivateInfo->hbitmap1);
 DeleteObject(pPrivateInfo->hbitmap2);
 DeleteObject(pPrivateInfo->hbitmap3);
    
 pPrivateInfo->hbitmap0=LoadBitmap((HINSTANCE)GetWindowLong(GetParent(hwnd),GWL_HINSTANCE),MAKEINTRESOURCE(upBitmap));
     pPrivateInfo->hbitmap1=LoadBitmap((HINSTANCE)GetWindowLong(GetParent(hwnd),GWL_HINSTANCE),MAKEINTRESOURCE(downBitmap));
     pPrivateInfo->hbitmap2=LoadBitmap((HINSTANCE)GetWindowLong(GetParent(hwnd),GWL_HINSTANCE),MAKEINTRESOURCE(focusBitmap));
 pPrivateInfo->hbitmap3=LoadBitmap((HINSTANCE)GetWindowLong(GetParent(hwnd),GWL_HINSTANCE),MAKEINTRESOURCE(disableBitmap));
   
 return true;
}

 

为按钮控件添加图片的方法

第一种:Button属性页里Style的Bitmap点上CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);HBITMAP hBitmap=(HBITMAP)B...
  • cclovetwins
  • cclovetwins
  • 2007年07月24日 17:17
  • 588

mfc之button控件加icon或者bitmap

mfc Cbutton控件换图标 ICON或者Bitmap类型 环境:window 语言:C++ 本次文章要讲的内容是mfc的button控件加图片(icon或者bitmap)。 第一种情况:...
  • i_likechard
  • i_likechard
  • 2016年05月15日 13:43
  • 2039

通过反射机制调用某个类的方法

要通过反射机制调用某个类的方法,主要用到了下面这个方法: public Object invoke(Object obj,Object... args) 这个方法对带有指定参数的指定对象调用由此 ...
  • Handsome_fan
  • Handsome_fan
  • 2017年02月04日 14:27
  • 2833

深入理解Java:类加载机制及反射

说明:本文乃学习整理参考而来. 一、Java类加载机制 1.概述        Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信...
  • z69183787
  • z69183787
  • 2016年06月13日 14:52
  • 1425

multidex分包续:将指定的类打包到主dex中

参考资料:《Android开发艺术探索》 本博文中会有一些任玉刚大神的原话以及书中的源码。前言:在有书上的例子和各种博客的前提下,我还是搞了一整天才成功,各种错误,无语了。总结一下学习的结果,欢迎各...
  • gaozhan_csdn
  • gaozhan_csdn
  • 2016年07月25日 15:56
  • 4674

一个简单的时间类的定制

这是在看《python核心编程》的第十三章的一个习题,自己全部实现了它的功能要求,学会了__add__、__iadd__、__radd__的使用方法,iadd是自加,等同于i += j;而radd是右...
  • lulongfei172006
  • lulongfei172006
  • 2016年05月01日 12:18
  • 182

JavaHelp软件的一个定制实用程序类

JavaHelp软件的一个定制实用程序类 发布者:IBM  日期: 2000-07-01 00:00:00 浏览次数:0 (共有_条评论) ...
  • studyvcmfc
  • studyvcmfc
  • 2012年11月01日 23:49
  • 1067

定制并发类(五)在一个Executor对象中使用我们的ThreadFactory

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉 在一个Executor对象中...
  • luoww1
  • luoww1
  • 2016年06月01日 09:25
  • 327

用C#定制一个简单的浏览器源程序,IE内核

  • 2010年07月31日 11:41
  • 15KB
  • 下载

定制 SWT RCP 界面--如何编写一个漂亮的 SWT

  • 2011年03月12日 22:30
  • 2.22MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:定制一个BitmapButton类
举报原因:
原因补充:

(最多只允许输入30个字)