您的位置:首页 > 编程语言 > C语言/C++

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

2008-05-07 15:40 176 查看
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,
0, 0, 0, 0,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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: