定製一個BitmapButton類 (轉)
本文詳敘了自制一個bitmapbutton類的一種製作方法。這個子定義的bitmapbutton類有類似於MFC種CBitmapButton類的功能。
這個bitmapbutton有關聯四個點陣圖,分別一般狀態,按下狀態,焦點狀態,和無效狀態的點陣圖。該bitmapbutton類的能接受訊息,能向主視窗傳遞訊息。模仿了CBitmapButton類的大部分功能。
下面是該類的申明和實現。
// FileName:BitmapButton.h: interface for the BitmapButton class.
// Envionment:Visual C++ 6.0, 9x/2k
//
// Author:kaitty
// to::kaitty@x263">Email:kaitty@x263.net or nsi10102@nsi
// Date: 2002.2.10
//***********************************************************************************
// 說明:這是一個自定義的BitmapButton類,功能是使一個Button上關聯四個
// 點陣圖。
// 介面:HWND CreateBitmapButtonWindow(LPCSTR lpClassName,LPCSTR lpWindowName,D dwStyle,
// int x,int y,int nWidth,int nHeight,
// HWND hwndParent,HMENU hmenu,HINSTANCE hInstance,
// UINT upBitmap,UINT downBitmap,UINT focitmap,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
// or nsi10102@nsi
// Date: 2002.2.10
#include "stdafx.h"
#include "BitmapButton.h"
#include "re.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=Loaitmap(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);
xP= 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:(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;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992409/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++模板的定製二:定製C++類 (轉)C++
- C++模板的定製三:部分定製C++類 (轉)C++
- 個性定製Linux(轉)Linux
- C++模板的定製一:定製函式模板 (轉)C++函式
- C++模板的定製四:定製成員函式和預設類參 (轉)C++函式
- 如何唯一確定一個 Java 類?Java
- python 學習--定製類Python
- 洗牌的一個C++類! (轉)C++
- 如何繪製一個類甘特圖 (附原始碼)原始碼
- canvas 繪製旋轉一定角度的矩形Canvas
- 使用 Dockerfile 定製映象【轉】Docker
- 用UIPickerView簡單定製一個UIDatePickerUIView
- Java類方法(定義一個工具類,儲存一些常用的方法)Java
- canvas繪製旋轉一定角度的矩形效果Canvas
- 可以任意定製導航欄背景的一個思路
- 建模的時候如何確定一個名詞是類還是別一個類的屬性?
- 轉載:一個python並查集類Python並查集
- ASP中一個字串處理類(VBScript) (轉)字串
- 一個克隆物件的C#基類 (轉)物件C#
- C++中類及類的定義 (轉)C++
- 製作一個自己的軟體包CD(轉)
- 實現一個可定製化的FlowLayout -- 原理篇
- 非視窗類中使用定時器的方法(一) (轉)定時器
- 定製轉場動畫ControllerTransitionAnimation動畫ControllerNaN
- 一個類資料型別的STL例子 (轉)資料型別
- 【廖雪峰python進階筆記】定製類Python筆記
- 用VB編寫一個彈出選單類 (轉)
- Java應用定製工廠--jar轉exe製作工具JavaJAR
- 定製精彩的命令提示行(轉)
- C++模板的定製五:對定製成員函式的補充 (轉)C++函式
- 4、製作一個html轉pdf的spring boot starterHTMLSpring Boot
- 一個安卓螢幕錄製轉 GIF 的批處理安卓
- 定製一個 Vue 3 模板 - 整合 Vite, Pinia, Vue Router 與 Tailwind CSSVueViteAICSS
- 走過路過不要錯過,app定製-商城-軟體-各類小程式均可定製開發APP
- 如何判斷一個類是從另一個類繼承繼承
- InstallShield Express for delphi製作安裝程式定製BDE引擎 (轉)Express
- List<實體類>轉換成map 一個鍵對應多個值
- java的一個類!Java