用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 其他...