C++编码SDK实现的位图按钮类

来源:互联网 发布:淘宝标题采集器 编辑:程序博客网 时间:2024/06/17 17:31

PS:谁能帮我整一个把彩图(句柄)转换为灰度图(句柄)的函数?

/*=====================================================================
 * 文件名称:BitmapButton.h       作用:位图按钮
 * Copyright (c) 2008,by:小鼬(awpawpawp2@163.com)
//=====================================================================
//user note:
//
//---------------------------------------------------------------------
//成员函数介绍:
//
//may in WM_CREATE:
//
BBT myBT(hwnd,hIst,id);//主窗口句柄,实例句柄,按钮ID
//两个图,一彩一灰(谁能帮我整一个把彩图(句柄)转换为灰度图(句柄)的函数?)
myBT.GetBmp( (BOOL)是否从磁盘里加载,
             TEXT("BMP磁盘路径或BMP资源名"),TEXT("BMP磁盘路径或BMP资源名"),
             (int)(目标宽,若略则为原宽),(int)(目标高,若略则为原高)   );
myBT.GetBmp( (BOOL)是否从磁盘里加载,
             (int)(BMP资源ID),(int)(BMP资源ID),
             (int)(目标宽,若略则为原宽),(int)(目标高,若略则为原高)   );
myBT.SetBTMProc( (WNDPROC*)按钮的消息处理函数 );//如果不设,用默认的NewBTMProc

//may in WM_SIZE:
//
myBT.SetSize( (int)x,(int)y,(int)width,(int)height );

//may in WM_COMMAND:
//
myBT.EnableBBT( (int)iCheck );//BBT_ENABLED显示、BBT_DISABLED隐藏、BBT_GRAYED变灰

//---------------------------------------------------------------------
//帮助函数:
//
BBT* GetPBBT(HWND hwnd);//根据按钮句柄得到它的BBT对象指针
void EnableBBT(HWND hwnd,int iCheck);//同BBT::EnableBBT()            
=====================================================================
*/


//=====================================================================
   #ifndef _BitmapButton_h_
   
#define _BitmapButton_h_
//=====================================================================
#include <windows.h>

#define WM_GRAYED WM_USER+37
#define BBT_ENABLED 1
#define BBT_DISABLED 0
#define BBT_GRAYED -1
         
//=====================================================================
//types:
//
class BBT{
    HWND hwndMain,hwndBT;
    HINSTANCE hInst;
    
int ID;
    WNDPROC OldBTMProc;
    HBITMAP hBitmap1,hBitmap2;
    BOOL bMouseOnBT,bGRAYED;
public:
    BBT(HWND 
&,HINSTANCE &,int);//create
    ~BBT();
    
void SetSize(int x,int y,int width,int height);    
    
void GetBmp(BOOL, int,int,  int,int);
    
void GetBmp(BOOL,TCHAR*,TCHAR*,int,int);
    
void SetBTMProc(WNDPROC);
    
void EnableBBT(int);
friend LRESULT CALLBACK BBT::NewBTMProc (HWND,UINT,WPARAM,LPARAM);
};

//=====================================================================
//user help functions:
//
BBT* GetPBBT(HWND hwnd);
void EnableBBT(HWND hwnd,int iCheck);

//=====================================================================
   #endif // #ifndef _BitmapButton_h_
//=====================================================================

//=====================================================================
//
//文件名称:BitmapButton.cpp    依赖自头文件BitmapButton.h

//=====================================================================
//headers:
#include "BitmapButton.h"
#include 
<commctrl.h>
#pragma comment(lib, "comctl32.lib")

//=====================================================================
//functions:
//---------------------------------------------------------------------
//user help:
//
//通过按钮句柄得到BBT对象指针:
BBT* GetPBBT(HWND hwnd){ return (BBT*) GetWindowLong (hwnd,GWL_USERDATA) ;}
//同BBT::EnableBBT()一样功能:
void EnableBBT(HWND hwnd,int iCheck){
    
switch(iCheck){
    
case BBT_ENABLED:ShowWindow (hwnd,SW_RESTORE); EnableWindow(hwnd,TRUE);break;
    
case BBT_DISABLED:ShowWindow(hwnd,SW_HIDE); EnableWindow(hwnd,FALSE);break;
    
case BBT_GRAYED:SendMessage(hwnd,WM_GRAYED,0,0);break;
    }
}

//---------------------------------------------------------------------
//类成员:
//
BBT::BBT(HWND& hw,HINSTANCE& hI,int id):hwndMain(hw),hInst(hI),ID(id),bMouseOnBT(FALSE),bGRAYED(FALSE){
    hwndBT 
=CreateWindow(TEXT ("button"), TEXT (""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                             
0000,hwndMain, (HMENU)ID, hInst, NULL) ;
    OldBTMProc 
= (WNDPROC) SetWindowLong (hwndBT, GWL_WNDPROC,(LONG) NewBTMProc) ;
    SetWindowLong (hwndBT,GWL_USERDATA, (LONG) 
this  ) ;
    
//SetClassLong(hwndBT, GCL_HBRBACKGROUND ,GetClassLong (hwndMain, GCL_HBRBACKGROUND) ); 
}

void BBT::SetSize(int x,int y,int width,int height){
    MoveWindow (hwndBT,x,y,width,height,TRUE) ;
}

void BBT::GetBmp(BOOL bFromFile,int id1,int id2,int cxDesired=0,int cyDesired=0){
    hBitmap1 
= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(id1),IMAGE_BITMAP,cxDesired,cyDesired,LR_CREATEDIBSECTION);
    hBitmap2 
= (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(id2),IMAGE_BITMAP,cxDesired,cyDesired,LR_CREATEDIBSECTION);
}

void BBT::GetBmp(BOOL bFromFile,TCHAR* str1,TCHAR* str2,int cxDesired=0,int cyDesired=0){
    hBitmap1 
= (HBITMAP)LoadImage(hInst,str1,IMAGE_BITMAP,cxDesired,cyDesired,
                  bFromFile
?(LR_LOADFROMFILE|LR_CREATEDIBSECTION):(LR_CREATEDIBSECTION) );
    hBitmap2 
= (HBITMAP)LoadImage(hInst,str2,IMAGE_BITMAP,cxDesired,cyDesired,
                  bFromFile
?(LR_LOADFROMFILE|LR_CREATEDIBSECTION):(LR_CREATEDIBSECTION) );
}

void BBT::SetBTMProc(WNDPROC fn){ SetWindowLong (hwndBT, GWL_WNDPROC,(LONG)fn) ;}

void BBT::EnableBBT(int iCheck){
    
switch(iCheck){
    
case BBT_ENABLED:ShowWindow (this->hwndBT,SW_RESTORE); EnableWindow(this->hwndBT,TRUE);break;
    
case BBT_DISABLED:ShowWindow(this->hwndBT,SW_HIDE); EnableWindow(this->hwndBT,FALSE);break;
    
case BBT_GRAYED:SendMessage(this->hwndBT,WM_GRAYED,0,0);break;
    }
}

BBT::
~BBT(){ DeleteObject(hBitmap1);DeleteObject(hBitmap2);}

//---------------------------------------------------------------------
//重要友元函数——消息处理:
//
LRESULT CALLBACK NewBTMProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam){
    
static HPEN hPenBlack=CreatePen(PS_SOLID,1,RGB(128,128,128));
    
static HPEN hPenWhite=CreatePen(PS_SOLID,1,RGB(255,255,255)); 
    HDC hdc,hCompadc;
    HGDIOBJ  htemp;
    PAINTSTRUCT ps;
    RECT rect;

    TRACKMOUSEEVENT    tme;
    BBT
* pBBT=GetPBBT(hwnd);

    
switch (message){
    
case WM_MOUSEMOVE:
        
if(pBBT->bMouseOnBT==FALSE){
            pBBT
->bMouseOnBT=TRUE;   
            
//跟踪鼠标:
            tme.cbSize =sizeof(TRACKMOUSEEVENT);
            tme.dwFlags 
=TME_LEAVE;//当鼠标离开时收到WM_MOUSELEAVE
            
//要跟踪鼠标的窗口/控件句柄
            tme.hwndTrack =hwnd;
            _TrackMouseEvent(
&tme);
            InvalidateRect(hwnd,NULL,TRUE);
        } 
return 0
    
case WM_MOUSELEAVE:
        pBBT
->bMouseOnBT=FALSE;InvalidateRect(hwnd,NULL,TRUE);return 0;
    
case WM_LBUTTONDOWN:
        GetClientRect (hwnd, 
&rect);
        hdc   
=  GetDC(hwnd);   
            MoveToEx(hdc, rect.right
-1, rect.top+1, NULL);
            SelectObject (hdc, hPenWhite );
            LineTo (hdc, rect.right
-1, rect.bottom-1) ;
            LineTo (hdc, rect.left
+1, rect.bottom-1) ;
            SelectObject (hdc, hPenBlack);
            LineTo (hdc, rect.left
+1, rect.top+1);
            LineTo (hdc, rect.right
-1, rect.top+1) ;
            SelectObject (hdc, GetStockObject (BLACK_PEN) );
//恢复
        ReleaseDC(hwnd,hdc);
        
break;
    
case WM_LBUTTONUP:
        InvalidateRect(hwnd,NULL,FALSE);
        
break;
    
case WM_PAINT:
        GetClientRect (hwnd, 
&rect);
        hdc 
= BeginPaint (hwnd, &ps); 

        hCompadc
=CreateCompatibleDC(hdc);
        
if(!pBBT->bGRAYED){//彩图
            htemp = SelectObject(  hCompadc,pBBT->hBitmap1 );
            BitBlt(hdc,
10,10,30,30,hCompadc,0,0,SRCAND);
        }
        
else {//灰图
            htemp = SelectObject(  hCompadc,pBBT->hBitmap2 );
            BitBlt(hdc,
10,10,30,30,hCompadc,0,0,SRCAND);
        }
        SelectObject(hCompadc,htemp);
//good~
        
//DeleteObject( SelectObject(hCompadc,htemp) ) ;
        DeleteDC(  hCompadc );

        
if( pBBT->bMouseOnBT ){//good~
            MoveToEx(hdc, rect.right-1, rect.top+1, NULL);
            SelectObject (hdc, hPenBlack);
            LineTo (hdc, rect.right
-1, rect.bottom-1) ;
            LineTo (hdc, rect.left
+1, rect.bottom-1) ;
            SelectObject (hdc, hPenWhite );
            LineTo (hdc, rect.left
+1, rect.top+1);
            LineTo (hdc, rect.right
-1, rect.top+1) ;
            SelectObject (hdc, GetStockObject (BLACK_PEN) );
//恢复
        }

        EndPaint (hwnd, 
&ps);        
        
return 0;
    
case WM_GRAYED:
        EnableWindow(pBBT
->hwndBT,FALSE); 
        pBBT
->bGRAYED=TRUE;
        InvalidateRect(hwnd,NULL,TRUE);
        
//
        return 0;
    }
//_switch_   
    return  (pBBT->OldBTMProc) (hwnd, message, wParam, lParam);
}