用WIN32 API編寫自定義BUTTON

2021-04-22 15:05:25 字數 3073 閱讀 7524

用win32 api編寫自定義button下面分析一下自繪按鈕的原理,用過mfc自繪按鈕的人都知道,是通過過載了父視窗wm_drawitem的響應訊息實現的。同時也要子類化按鈕來得到按鈕的其他有用的訊息,比如wm_mousemove、wm_keydown等訊息。因為mfc的訊息迴圈都是封裝好的,所以只要派生一下基本控制項類就可以了。當是用win32api做的話就需要自己來子類化按鈕視窗的訊息迴圈了,相信經常程式設計的朋友都知道,子類化控制項要用到setwindowlong來改變視窗的**過程,然後在**視窗內添上自己需要處理的訊息即可。因為我們要實現自繪按鈕所以最好把子類化的過程做成乙個類,然後傳給它要自繪的按鈕控制代碼就行了。因為要在類裡面實現訊息**函式,但是類裡面的訊息**函式只能是靜態的,所以不能對應每個例項的訊息**。在我實現的按鈕子類化類裡,我用到setprop函式來實現的。要改變button的特性,必須改變其**過程,可以通過setwindowlong、getwindowlong來實現。

大家都知道在靜態函式中是不能得到其所在類的物件指標,此時可以通過setprop來記錄下物件指標,

setprop(m_hwnd,

"cwinbutton"

,(handle)

this

)就是記錄下這個物件的指標,這樣在靜態函式中可以通過

cwinbutton* cw =

(cwinbutton*

)getprop(hwnd,

"cwinbutton"

);來得到物件的指標,這樣就能進行正確的**。

呼叫示例:

bmp = loadbitmap(getmodulehandle(null), makeintresource(idb_bitmap));

win.init(m_testbutton.m_hwnd);//讓我們的類改變**過程

win.setbackpic(bmp, true);

參考文章:http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=301

下面只是乙個簡單的例子改變其背景,說明了這個方法。部分**如下:

// winbutton.h: inte***ce for the cwinbutton class.

////#if

!defined(afx_winbutton_h__f55c708d_1059_4aec_85da_83243e5d9369__included_)

#define afx_winbutton_h__f55c708d_1059_4aec_85da_83243e5d9369__included_

#if _msc_ver > 1000

#pragma once

#endif

// _msc_ver > 1000

//#i nclude

#ifdef win847

#define dllport __declspec(dllexport)

#else

#define dllport __declspec(dllimport)

#endif

class dllport cwinbutton ;#

endif

// !defined(afx_winbutton_h__f55c708d_1059_4aec_85da_83243e5d9369__included_)

// winbutton.cpp: implementation of the cwinbutton class.

////

#include

"stdafx.h"

#include

"winbutton.h"

//// construction/destruction

//cwinbutton:

:cwinbutton(

)cwinbutton:

:~cwinbutton(

)bool cwinbutton:

:init(hwnd hwnd)

m_oldproc = setwindowlong(m_hwnd,gwl_wndproc,

(long

)stdproc)

;//改變視窗**過程

}return

false;}

lresult winapi cwinbutton:

:stdproc(hwnd hwnd,uint umsg,uint wparam,

long lparam)

//改變原button的**過程

lresult callback cwinbutton:

:wndproc(uint message, wparam wparam, lparam lparam)

return callwindowproc(

(wndproc)m_oldproc, m_hwnd, message, wparam, lparam)

;//預設**過程

}//在這裡新增button的背景設定

lresult cwinbutton:

:onpaint(hdc hdc)

bitblt(hdcmem,0,0,width,height,hdcbmp,0,0,srccopy)

;bitblt(hdc,0,0,width,height,hdcmem,0,0,srccopy)

;deletedc(hdcbmp)

;deletedc(hdcmem)

;deleteobject(bmp)

;return

true;}

bool cwinbutton:

:setbackpic(hbitmap hbitmap,

bool bresize)

getclientrect(m_hwnd,

&rt)

;invalidaterect(m_hwnd,

&rt,

true);

return

true;}

return

false;}

用Win32 API實現序列通訊

2003 7 9 7 56 18 pcvc.wangxi 閱讀次數 30453 串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便 易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的 序列通訊程式。在win16中,可以利用open m clo...

用Win32 API建立不規則視窗

win32 api 支援建立不規則視窗,現在很多軟體使用這個技術,如 quicktime,windows media player 7等。a b使用api建立不規則視窗主要有兩種方式,即向量形狀疊加 布林運算 和點陣圖區域兩種。無論哪種方式,都可以實現上面兩圖的效果。在編寫這樣的視窗 前,我們必須清...

用jQuery 編寫自定義外掛程式

一 基本的 結構 方法一 name 外掛程式名 function var opts extend defaults,options 此處options為使用者設定的引數物件 使用者傳參 實現外掛程式的 bla bla bla jquery 方法二 function name2 function 其他...