一、工具提示窗口
成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專(zhuān)業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十載企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都成百上千客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開(kāi)發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷(xiāo)型網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),同時(shí)也為不同行業(yè)的客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)。
1.有時(shí)候把鼠標(biāo)移動(dòng)到一個(gè)窗口控件的時(shí)候
會(huì)有一個(gè)提示彈出來(lái),這個(gè)的原理就是給工具提示窗口
發(fā)送一個(gè)消息,TM_ADDTOOL
2其中參數(shù)LPARAM是TOOLINFO結(jié)構(gòu)體指針
typedef struct tagTOOLINFO{
UINT cbSize 結(jié)構(gòu)體大小
UINT uFlag 焦點(diǎn)域的屬性
HWND hWnd 包含工具的窗口標(biāo)題,如果指定TTF_IDISHWND標(biāo)準(zhǔn)
則忽略值,而是用uid成員的值作為窗口句柄
UINT_PTR uId 吐過(guò)uFlag包含TTF_IDISHWND
此值為"工具"窗口句柄, 如果內(nèi)有包含 此值為工具ID,
RECT rect 如果包含TTF_IDISHWNDj就忽略此值,否則指定工具大小的RECT結(jié)構(gòu)
HINSTANCE hinst 應(yīng)用程序?qū)嵗浔?/p>
LPTSTR lpszText 這個(gè)域可以有如下幾個(gè)值: 如果為L(zhǎng)PSTR_TEXTCALBACK
工具就向它的窗口發(fā)送TTN_NEEDTEXT消息獲得要點(diǎn)是的字符串
如果為資源標(biāo)識(shí) 則顯示資源標(biāo)識(shí)所對(duì)應(yīng)的字符串
如果為字符串指針,則顯示字符指針指向的字符串
LPARAM lParam void* lpReserved
)TOOLINFO;
}
二、窗口半透明
1.創(chuàng)建帶有擴(kuò)展屬性的窗口,CreateWindow函數(shù)參數(shù)沒(méi)有擴(kuò)展屬性信息
要帶有擴(kuò)展信息使用CreateWindowEx
參數(shù)1 窗口窗口的擴(kuò)展樣式
參數(shù)2 窗口類(lèi)名
參數(shù)3 窗口標(biāo)題
參數(shù)4 窗口樣式
參數(shù)5 6 坐標(biāo)
參數(shù)7 8 大小
參數(shù)9 父窗口
參數(shù)10 窗口菜單句柄
參數(shù)11 程序?qū)嵗浔?/p>
參數(shù)12 創(chuàng)建窗口附加數(shù)據(jù)指針
通過(guò)CREATESTRUCT結(jié)構(gòu)體傳遞到WM_CREATE消息的LPARAM參數(shù)中
2改變窗口各種屬性: 風(fēng)格,擴(kuò)展風(fēng)格,ID,窗口消息過(guò)程,用戶數(shù)據(jù)等
LONG SetWindowLong(
參數(shù)1 改變屬性的窗口
參數(shù)2 nIndex 改變的類(lèi)型
改變樣式或擴(kuò)展樣式 GWL_STYLE GWL_EXSTYLE
ID類(lèi)型 GWL_ID
應(yīng)用程序句柄類(lèi)型 GWL_HINSTANCE
用戶數(shù)據(jù)類(lèi)型 GWL_USERDATA
窗口消息處理類(lèi)型 GWL)WNDPROC
LONG dwNewLong 窗口的新屬性值,具體的屬性類(lèi)型依賴于nIndex參數(shù)
)
返回創(chuàng)建舊屬性,具體返回什么依賴nIndex參數(shù)
3獲取窗口的屬性
GetWindowLong
參數(shù)1 要獲取的窗口句柄
參數(shù)2 含義和上面的nIndex意義
返回nIndex參數(shù)類(lèi)型獲得相應(yīng)返回值
4.要修改擴(kuò)展樣式,就要先獲得原來(lái)的擴(kuò)展樣式
然后再修改,比如將普通窗口改成層窗口
//獲得樣式
LONG lExStyle = GetWindowLong(hWnd,GWL_EXSTYLE);
//修改樣式
lExStyle |= WS_EX_LAYERED
//設(shè)置樣式
SetWindowLong(hWnd,GWL_EXSTYLE,lExStyle );
5.普通窗口變成層窗口 就可以具有半透明效果了
SetLayeredWindowAttributes
設(shè)置層窗口屬性
參數(shù)1 設(shè)置屬性窗口
參數(shù)2 掩碼顏色 可以用RGB指定
參數(shù)3 透明度取值范圍(0-255)0完全透明 255不透明
參數(shù)4 透明方式
LWA_ALPHA 參數(shù)2無(wú)效 參數(shù)3有效
LWA_COLORKEY 窗口中顏色為參數(shù)2的地方變透明
參數(shù)3失效
執(zhí)行成功返回TRUE
三、不規(guī)則窗口
1.大部分窗口都是長(zhǎng)方形這樣的,當(dāng)要做成一個(gè)
不規(guī)則的窗口應(yīng)該這樣做
2.SetWindowRgn函數(shù)
在窗口區(qū)域之外的部分不顯示,相當(dāng)于透明消息
窗口區(qū)域內(nèi)的正常顯示,窗口區(qū)域的編輯相當(dāng)于窗口形狀
參數(shù)1 HWND 要改變窗口區(qū)域的句柄
參數(shù)2 HRGN 新的窗口區(qū)域句柄
參數(shù)3 BOOL 設(shè)置窗口區(qū)域后 窗口界面是否重畫(huà)
成功返回非零值
3.窗口RGN
CreateRectRgn 創(chuàng)建普通矩形區(qū)域
CreateRoundRectRgn 創(chuàng)建圓角矩形
CreateEllipticRgn 創(chuàng)建園型區(qū)域
ExtCreateRegion 創(chuàng)建自定義區(qū)域
4 CreateRoundRectRgn
參數(shù)1 左上角x坐標(biāo)
參數(shù)2 左上角y坐標(biāo)
參數(shù)3 右下降x坐標(biāo)
參數(shù)4 右下角y坐標(biāo)
int w圓角園寬度
int h園高度
5.CreateEllipticRgn
參數(shù)1 園的外切矩形左上角x坐標(biāo)
參數(shù)2 園的外切矩形左上角y坐標(biāo)
參數(shù)3 園的外切矩形右下降x坐標(biāo)
參數(shù)4 園的外切矩形右下角y坐標(biāo)
6.ExtCreateRegion
參數(shù)1 lpx為執(zhí)行XFORM結(jié)構(gòu)體指針,用對(duì)創(chuàng)建后的區(qū)域做變化
如果指針為空 代表創(chuàng)創(chuàng)建后區(qū)域不變換
DWORD nCount lpData所指向控件大小
CONST RGNDATA* lpData 指向RGNDATA結(jié)構(gòu)體指針,包含區(qū)域數(shù)據(jù)信息
7.RGNDATA結(jié)構(gòu)體
RGNDATAHEADER rdg 指向RGNDATAHEADER 結(jié)構(gòu)體變量為區(qū)域數(shù)據(jù)頭信息
char Buffer[1]執(zhí)行一個(gè)任意大小緩沖區(qū).存放區(qū)域信息的RECT結(jié)構(gòu)體
8.RGNDATAHEADER 結(jié)構(gòu)體
DWIRD dwSize 結(jié)構(gòu)體大小
DWORD iType 區(qū)域類(lèi)型 必須為RDH_RECTANGLES
DWORD nCount 組成區(qū)域的所有矩形個(gè)數(shù)
DWORD nRgnSize 組成區(qū)域的所有矩形的緩沖區(qū)大小
RECT rcBound 區(qū)域的矩形邊界
四、截獲窗口消息或事件
1.有時(shí)候要改變Windows的MessageBox 改成自己的,
但是他是Windows里的, 我們沒(méi)有源碼, 所以我們需要用到
攔截他的PAINT消息,改變他的繪制效果.
2.可以通過(guò)子類(lèi)化的方法 SetWindowLong 把他的消息過(guò)程改了
但是呢 他這個(gè)你要在哪里改呢, 如果是在他彈出來(lái)后在更改
這樣就給人效果不好了, 所以你要知道窗口是再哪初始化最好的
然后來(lái)修改, 對(duì)話框一般在WM_INITDIALOG消息進(jìn)行初始化
所以在這里修改最好.把他子類(lèi)化,
3.那我怎么知道WM_INITDIALOG這個(gè)消息呢
通過(guò)Windows里的鉤子
五、鉤子
在目標(biāo)消息函數(shù)處理之前,處理該消息
1.安裝鉤子函數(shù)SetWindowsHookEx
HHOOK SetWindowsHookEx(
int idHook, //鉤子類(lèi)型
HOOKPROC lpfn, //鉤子程序函數(shù)指針
(
如果dwThreadId參數(shù)為0或者是由別的進(jìn)程創(chuàng)建的線程表示,
那么ipfn必須指向DLL中的鉤子程序,,
如果dwThreadId為當(dāng)前進(jìn)程所創(chuàng)建的線程標(biāo)識(shí),那么ipfn可以
指向當(dāng)前進(jìn)程的鉤子程序,lpfn為HOOKPROC
typedef LRESULT(CALLBACK* HOOKPROC)(int code,WPARAM,LPARAM)
code 提示了是否處理該消息,如果參數(shù)值為HC_ACTION,則可以處理
該消息,如果code值小于0,則不需要處理消息,這是要調(diào)用CallNext
HookEx函數(shù)并返回這個(gè)函數(shù)的值,CallNextHookEx為調(diào)用鉤子列表
中下一個(gè)鉤子的鉤子程序.
)
HINSTANCE hmod,//lpfn所在程序模塊的實(shí)例句柄,如果dwThreadId
為當(dāng)前進(jìn)程所創(chuàng)建的線程表示并且鉤子程序代碼也也位于當(dāng)前進(jìn)程,
則hmode必須為NULL
DWORD dwThreadId, //鉤子程序相關(guān)聯(lián)的線程的標(biāo)識(shí)符,如果為0,
鉤子程序就與所有程序關(guān)聯(lián),這時(shí)的鉤子就是全局鉤子.
)
2.鉤子類(lèi)型
每一類(lèi)型的鉤子可以使應(yīng)用程序能夠監(jiān)視不同類(lèi)型的消息處理機(jī)制
具體有:WH_CALLWNDPROC和WH_CALLWNDPROCRET:這兩種類(lèi)型使你
監(jiān)視發(fā)送到窗口過(guò)程的消息,系統(tǒng)再消息發(fā)送到接收窗口過(guò)程之前調(diào)用
WH_CALLWNDPROC類(lèi)型的鉤子,在窗口過(guò)程處理完消息之后調(diào)用
WH_CALLWNDPROCRET類(lèi)型的鉤子
WH_CBT:以下事件之前,系統(tǒng)都調(diào)用WH_CBT類(lèi)型鉤子
1) 激活,建立,最小化,最大化,移動(dòng),改變窗口大小,等窗口事件
2) 完成系統(tǒng)指令
3) 來(lái)自系統(tǒng)消息隊(duì)列中的移動(dòng)鼠標(biāo),鍵盤(pán)事件
4) 設(shè)置輸入焦點(diǎn)事件
5) 同步系統(tǒng)消息隊(duì)列事件
WH_GETMESSAGE: 監(jiān)視從消息隊(duì)列返回的消息,可使用
該鉤子類(lèi)型去監(jiān)視鼠標(biāo)和鍵盤(pán)輸入,已經(jīng)發(fā)送到消息隊(duì)列中的其他消息
WH_KEYBOARD:應(yīng)用程序可以使用WH_KEYBODY類(lèi)型的鉤子監(jiān)視消息隊(duì)列中的
鍵盤(pán)消息,
WH_MOUSE 應(yīng)用程序可以使用WH_MOUSE類(lèi)型的鉤子來(lái)監(jiān)視消息隊(duì)列中鼠標(biāo)消息
3.將鉤子信息床底到當(dāng)前鉤子鏈中的下一個(gè)子程,一個(gè)鉤子程序可以調(diào)用這個(gè)
函數(shù)之前或之后處理鉤子的信息
CallNextHookEx(
HHOOK hhk,當(dāng)前鉤子句柄
int nCode, 等同于HOOKPROC的nCode
WPARAM wParam, 等同于HOOKPROC的wParam
LPARAM lParam, 等同于HOOKPROC的lParam
)
4.HOOKPROC回調(diào)函數(shù)
LRESULT CAKKBACK HookProc(
int iCode HC_ACTION HC_GETNEXT HC_SKIP HC_NOREMOVE.....
WPARAM 取決于鉤子類(lèi)型
LPARAM 取決于鉤子類(lèi)型
比如鉤子類(lèi)型是WH_KEYBOARD那么lParam和wParam等同于WM_KEYDOWN的
lParam和wParam,如果鉤子類(lèi)型為WH_CALLWNDPROC,wParam表示消息
是否來(lái)源于當(dāng)前線程(非零,則表示當(dāng)前線程,否則來(lái)源于其他線程)
LPARAM就為指向CWPSTRUCT結(jié)構(gòu)體指針.
5.卸載鉤子
UnhookWindowsHookEx
卸載之前安裝成功的鉤子
BOOL UnhookWindowsHookEx(
HHOOK hhk //之前安裝鉤子返回的鉤子句柄
)成功返回TRUE
網(wǎng)站名稱:Windows核心編程(5)
本文鏈接:http://aaarwkj.com/article14/peeode.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)、電子商務(wù)、品牌網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)