分享
 
 
 

定制一个BitmapButton类

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

本文详叙了自制一个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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有