亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 022.txt

?? 會(huì)變語言實(shí)現(xiàn)的一些程序
?? TXT
字號(hào):
第22課 超類化


--------------------------------------------------------------------------------


在這一講我們將學(xué)習(xí)什么是超類化以及它有什么作用;同時(shí)你還會(huì)學(xué)到怎樣在自己的窗口中用Tab鍵在控件中切換這一技巧。

理論:

在你的程序生涯中你肯定遇到過這樣的情況,你需要一系列的控件,但它們之間卻只有一點(diǎn)點(diǎn)的不同。例如,你可能需要10個(gè)只接受數(shù)字的 Edit 控件,當(dāng)然你可以通過多種方法來達(dá)到這個(gè)目的。

創(chuàng)建自己的類并用它實(shí)例化為那些控件 
創(chuàng)建那些 Edit 控件并把它們?nèi)孔宇惢?
超類化Edit 控件 
第一種方法太乏味了,因?yàn)槟惚仨氉约簩?shí)現(xiàn)Edit 控件的每個(gè)功能,但這項(xiàng)工作不是輕松就能完成的。第二種方法好于第一種,但仍然要做許多工作,子類化幾個(gè)Edit 控件還可以接受,但若要子類化十幾二十個(gè),這項(xiàng)工作簡(jiǎn)直就是一場(chǎng)惡夢(mèng)。在這種情況下就應(yīng)該使用超類化這個(gè)技巧,它是用于控制某一個(gè)特定窗口類的特殊方法。通過這種控制就可以修改窗口類的特性使之符合你的要求,然后再創(chuàng)建那一堆控件就可以了。

超類化有如下幾個(gè)步驟:

通過調(diào)用 GetClassInfoEx 來獲得想要進(jìn)行超類化操作的窗口類的信息。函數(shù)GetClassInfoEx 需要一個(gè)指向 WNDCLASSEX 結(jié)構(gòu)的指針,用于當(dāng)成功返回時(shí)填入窗口類的信息。 
按需要修改 WNDCLASSEX 結(jié)構(gòu)的成員,其中有兩個(gè)成員必須修改:
hInstance 存放程序的實(shí)例句柄
lpszClassName 指向一個(gè)新類名的指針
不必修改成員 lpfnWndProc,但大多數(shù)情況下還是需要的。但要記住如果要使用函數(shù) CallWindowProc 調(diào)用老窗口的過程,那就必須保存成員 lpfnWndProc 的原值。 
注冊(cè)修改完的 WNDCLASSEX 結(jié)構(gòu),得到一個(gè)具有舊窗口類某些特性的新窗口類。 
用新窗口類創(chuàng)建窗口 
如果要?jiǎng)?chuàng)建具有相同特性的多個(gè)控件,超類化就比子類化要好。

舉例:

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
WM_SUPERCLASS equ WM_USER+5 
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD 
EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD 

.data 
ClassName db "SuperclassWinClass",0 
AppName db "Superclassing Demo",0 
EditClass db "EDIT",0 
OurClass db "SUPEREDITCLASS",0 
Message db "You pressed the Enter key in the text box!",0 

.data? 
hInstance dd ? 
hwndEdit dd 6 dup(?) ;存放6個(gè)窗口句柄的數(shù)組
OldWndProc dd ? ;原來的窗口過程

.code 
start: 
invoke GetModuleHandle, NULL 
mov hInstance,eax 
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT 
invoke ExitProcess,eax 

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
LOCAL wc:WNDCLASSEX 
LOCAL msg:MSG 
LOCAL hwnd:HWND 

mov wc.cbSize,SIZEOF WNDCLASSEX 
mov wc.style, CS_HREDRAW or CS_VREDRAW 
mov wc.lpfnWndProc, OFFSET WndProc 
mov wc.cbClsExtra,NULL 
mov wc.cbWndExtra,NULL 
push hInst 
pop wc.hInstance 
mov wc.hbrBackground,COLOR_APPWORKSPACE 
mov wc.lpszMenuName,NULL 
mov wc.lpszClassName,OFFSET ClassName 
invoke LoadIcon,NULL,IDI_APPLICATION 
mov wc.hIcon,eax 
mov wc.hIconSm,eax 
invoke LoadCursor,NULL,IDC_ARROW 
mov wc.hCursor,eax 
invoke RegisterClassEx, addr wc 
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_CONTROLPARENT,ADDR ClassName,ADDR AppName,\ 
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\ 
CW_USEDEFAULT,350,220,NULL,NULL,\ 
hInst,NULL 
mov hwnd,eax 

.while TRUE 
invoke GetMessage, ADDR msg,NULL,0,0 
.BREAK .IF (!eax) 
invoke TranslateMessage, ADDR msg 
invoke DispatchMessage, ADDR msg 
.endw 
mov eax,msg.wParam 
ret 
WinMain endp 

WndProc proc uses ebx edi hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
LOCAL wc:WNDCLASSEX 
.if uMsg==WM_CREATE 
mov wc.cbSize,sizeof WNDCLASSEX 
invoke GetClassInfoEx,NULL,addr EditClass,addr wc 
push wc.lpfnWndProc 
pop OldWndProc 
mov wc.lpfnWndProc, OFFSET EditWndProc 
push hInstance 
pop wc.hInstance 
mov wc.lpszClassName,OFFSET OurClass 
invoke RegisterClassEx, addr wc 
xor ebx,ebx 
mov edi,20 
.while ebx<6 
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR OurClass,NULL,\ 
WS_CHILD+WS_VISIBLE+WS_BORDER,20,\ 
edi,300,25,hWnd,ebx,\ 
hInstance,NULL 
mov dword ptr [hwndEdit+4*ebx],eax 
add edi,25 
inc ebx 
.endw 
invoke SetFocus,hwndEdit 
.elseif uMsg==WM_DESTROY 
invoke PostQuitMessage,NULL 
.else 
invoke DefWindowProc,hWnd,uMsg,wParam,lParam 
ret 
.endif 
xor eax,eax 
ret 
WndProc endp 

EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD 
.if uMsg==WM_CHAR 
mov eax,wParam 
.if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK 
;處理字符0~9,A~F,a~f,這幾個(gè)十六進(jìn)制數(shù)
.if al>="a" && al<="f" 
sub al,20h 
如果是字符a~f,則把它們變?yōu)榇髮?.endif 
invoke CallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam 
ret 
.endif 
.elseif uMsg==WM_KEYDOWN 
mov eax,wParam 
.if al==VK_RETURN 
invoke MessageBox,hEdit,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION 
invoke SetFocus,hEdit 
.elseif al==VK_TAB 
invoke GetKeyState,VK_SHIFT 
test eax,80000000 
.if ZERO? 
invoke GetWindow,hEdit,GW_HWNDNEXT 
.if eax==NULL 
invoke GetWindow,hEdit,GW_HWNDFIRST 
.endif 
.else 
invoke GetWindow,hEdit,GW_HWNDPREV 
.if eax==NULL 
invoke GetWindow,hEdit,GW_HWNDLAST 
.endif 
.endif 
invoke SetFocus,eax 
xor eax,eax 
ret 
.else 
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam 
ret 
.endif 
.else 
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam 
ret 
.endif 
xor eax,eax 
ret 
EditWndProc endp 
end start 


分析 

這個(gè)程序創(chuàng)建了一個(gè)在其客戶區(qū)有六個(gè)被修改的 Edit 控件的簡(jiǎn)單窗口,這些 Edit控件只接受十六進(jìn)制的數(shù)字。實(shí)際上,這個(gè)例子是通過修改窗口了類化的例子得來的。這個(gè)程序開始和其它程序一樣,有趣的部分出現(xiàn)在主窗口被創(chuàng)建的時(shí)候:

.if uMsg==WM_CREATE 
mov wc.cbSize,sizeof WNDCLASSEX 
invoke GetClassInfoEx,NULL,addr EditClass,addr wc 

必須用想進(jìn)行超類化操作的類數(shù)據(jù)填充 WNDCLASSEX 結(jié)構(gòu),在我們的例子中就是類 Edit ,記住在調(diào)用函數(shù) GetClassInfoEx 之前必須填寫成員 cbSize,否則函數(shù)調(diào)用 GetClassInfoEx不會(huì)在 WNDCLASSEX 結(jié)構(gòu)中填入正確的返回值。成功返回后,變量 wc中保存的就是想要?jiǎng)?chuàng)建一個(gè)新類所需要的所有信息。

push wc.lpfnWndProc 
pop OldWndProc 
mov wc.lpfnWndProc, OFFSET EditWndProc 
push hInstance 
pop wc.hInstance 
mov wc.lpszClassName,OFFSET OurClass 

現(xiàn)在必須修改變量 wc 的一些屬性:第一個(gè)要修改的就是指向窗口過程的指針。因?yàn)樵谛麓翱谶^程中函數(shù) CallWindowProx 要用到老窗口過程,因此得把它保存到一個(gè)變量中以便使用。這個(gè)技巧和在子類化中用到的一樣,只不過不是調(diào)用 SetWindowLong 而是直接修改 WNDCLASSEX 結(jié)構(gòu)罷了。接下來必須得為這個(gè)新類取個(gè)名字。

invoke RegisterClassEx, addr wc 

當(dāng)所有這些都完成時(shí),注冊(cè)這個(gè)新類就會(huì)得到一個(gè)具有舊類某些特征的新類了。

xor ebx,ebx 
mov edi,20 
.while ebx<6 
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR OurClass,NULL,\ 
WS_CHILD+WS_VISIBLE+WS_BORDER,20,\ 
edi,300,25,hWnd,ebx,\ 
hInstance,NULL 
mov dword ptr [hwndEdit+4*ebx],eax 
add edi,25 
inc ebx 
.endw 
invoke SetFocus,hwndEdit 

注冊(cè)完新類就可以創(chuàng)建基于它的窗口了:
在上面的程序片斷中,用寄存器 ebx 來保存已創(chuàng)建的窗口數(shù)目,用寄存器 edi 來保存窗口左上角的 y 坐標(biāo)。創(chuàng)建一個(gè)新窗口時(shí),把它的句柄保存在一個(gè)雙字的數(shù)組中,當(dāng)創(chuàng)建完所有的窗口后,設(shè)定輸入焦點(diǎn)為所創(chuàng)建的第一個(gè)窗口。

這時(shí)已經(jīng)有6個(gè)只能接受十六進(jìn)制數(shù)字的 edit 窗口控件了,替換的窗口過程處理了字符過濾,這實(shí)際上和在子類化中的例子是一樣的。但不必做子類化那些窗口的額外工作了。 

在此程序中,通過使用 Tabs 鍵來在各個(gè) Edit 控件中切換來使得這個(gè)程序更加有趣。一般來說,如果使用對(duì)話框,對(duì)話框管理器會(huì)處理好所有這些問題,即:
按下 Tabs 輸入焦點(diǎn)切換到下一個(gè)控件窗口中,按下 Shift-Tabs 輸入焦點(diǎn)切換到上一個(gè)控件窗口中;但一個(gè)簡(jiǎn)單的窗口不具有這個(gè)功能,必須子類化它們以處理 Tabs 鍵。在這個(gè)例子中,不必一個(gè)一個(gè)去子類化已經(jīng)進(jìn)行過超類化操作的這些控件,可以使用一種集中控制切換策略。

.elseif al==VK_TAB 
invoke GetKeyState,VK_SHIFT 
test eax,80000000 
.if ZERO? 
invoke GetWindow,hEdit,GW_HWNDNEXT 
.if eax==NULL 
invoke GetWindow,hEdit,GW_HWNDFIRST 
.endif 
.else 
invoke GetWindow,hEdit,GW_HWNDPREV 
.if eax==NULL 
invoke GetWindow,hEdit,GW_HWNDLAST 
.endif 
.endif 
invoke SetFocus,eax 
xor eax,eax 
ret 

上面是摘自于 EditWndClass 過程的程序片斷,它檢查用戶是否按下了 Tabs 鍵,若是就調(diào)用函數(shù) GetKeyState 來檢查 SHIFT 鍵是否也被同時(shí)按下了。函數(shù) GetKeyState 在寄存器 eax 中設(shè)立一個(gè)返回值,用于判斷某個(gè)特定的鍵是否被按下了,若按下了,則把 eax 的的最高位置1,否則把最高位清0。所以只要用 80000000h 來測(cè)試返回值就行了,若最高位是1則說明用戶按下了 SHIFT-Tabs,這需要單獨(dú)處理;否則說明只按下 Tabs 鍵,調(diào)用函數(shù) GetWindow 來獲得 hEdit 所指向窗口的下一個(gè)窗口句柄,若該函數(shù)返回 NULL ,說明這是當(dāng)前窗口是窗口鏈中最后一個(gè)窗口了,應(yīng)該通過以參數(shù) GW_HWNDFIRST 調(diào)用函數(shù) GetWindow 來卷回到窗口鏈中的第一個(gè)窗口控件。SHIFT-Tabs 的處理過程和這正好相反。



--------------------------------------------------------------------------------




--------------------------------------------------------------------------------

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩综合色| 国产精品123| 91精品欧美综合在线观看最新| 亚洲成人综合视频| 欧美日韩在线不卡| 青青草原综合久久大伊人精品 | 激情综合网天天干| 国产亚洲一区二区三区在线观看| 国产成人精品综合在线观看 | 成人激情av网| 亚洲欧美日韩国产成人精品影院| 欧洲日韩一区二区三区| 麻豆91免费观看| 亚洲国产高清aⅴ视频| 91在线观看视频| 三级成人在线视频| 久久久噜噜噜久噜久久综合| 99国产精品久久| 亚洲成av人**亚洲成av**| 精品日本一线二线三线不卡| 99国产精品视频免费观看| 亚洲午夜精品在线| 精品国产青草久久久久福利| 成+人+亚洲+综合天堂| 天天影视涩香欲综合网| 久久亚洲综合色| 91偷拍与自偷拍精品| 蜜臀av亚洲一区中文字幕| 中文字幕国产一区| 欧美一区二区三区视频在线观看| 激情六月婷婷久久| 亚洲精品高清视频在线观看| 欧美tickle裸体挠脚心vk| 91污在线观看| 国产专区欧美精品| 一区二区三区欧美激情| 337p日本欧洲亚洲大胆精品| 欧美综合亚洲图片综合区| 国产一区视频导航| 天堂资源在线中文精品| 中文字幕一区在线观看视频| 日韩免费视频一区二区| 欧美亚洲动漫精品| 不卡的av在线播放| 精品一区二区成人精品| 午夜欧美在线一二页| 亚洲青青青在线视频| 精品国产污污免费网站入口| 欧美亚洲尤物久久| 91丨porny丨户外露出| 精品一区二区三区在线播放| 亚洲一线二线三线视频| 中文字幕不卡在线| 久久精品夜色噜噜亚洲aⅴ| 制服丝袜在线91| 欧美日韩精品久久久| 91女厕偷拍女厕偷拍高清| 福利一区福利二区| 国产成人免费xxxxxxxx| 国产做a爰片久久毛片| 强制捆绑调教一区二区| 日韩精品电影一区亚洲| 亚洲在线观看免费视频| 亚洲精品乱码久久久久久黑人| 国产精品视频九色porn| 中文一区二区完整视频在线观看| 久久综合九色综合97婷婷| 欧美一区二区视频免费观看| 91精品国产一区二区三区香蕉| 亚洲欧美日韩国产成人精品影院 | 日韩不卡一二三区| 亚洲精品亚洲人成人网| 亚洲女人的天堂| 日韩精品一级中文字幕精品视频免费观看| 中文字幕一区二区三区蜜月| 中文字幕电影一区| 国产精品久久777777| 国产精品每日更新| 一色桃子久久精品亚洲| 亚洲日本va在线观看| 亚洲视频资源在线| 一区二区三区中文字幕电影| 亚洲黄色性网站| 午夜精品久久久| 日韩精品欧美精品| 久久99精品国产91久久来源| 国产麻豆精品久久一二三| 国产精华液一区二区三区| 成人国产精品免费观看| 93久久精品日日躁夜夜躁欧美| 91在线高清观看| 欧美日韩美少妇| 日韩欧美中文一区二区| 2014亚洲片线观看视频免费| 国产欧美精品一区二区色综合| 国产精品久久99| 午夜精品在线视频一区| 麻豆国产91在线播放| 国产成人在线视频免费播放| 色一情一乱一乱一91av| 9191精品国产综合久久久久久 | 国产欧美一区二区精品性色超碰 | av午夜一区麻豆| 欧美三级三级三级爽爽爽| 日韩欧美自拍偷拍| 国产精品网站在线| 亚洲一卡二卡三卡四卡| 国内精品视频一区二区三区八戒| 国产69精品久久777的优势| 欧美性做爰猛烈叫床潮| 精品国产免费久久| 成人免费在线视频| 日韩高清不卡一区二区| 欧美日韩精品是欧美日韩精品| 欧美一二三在线| 国产欧美日韩综合精品一区二区| 亚洲天堂网中文字| 日韩国产欧美在线播放| a在线欧美一区| 91精品国产综合久久精品性色| 欧美激情中文不卡| 天天爽夜夜爽夜夜爽精品视频 | 成人av片在线观看| 777奇米成人网| 国产精品久久久久久户外露出| 婷婷久久综合九色综合伊人色| 成人免费毛片片v| 欧美日韩三级一区二区| 国产精品午夜免费| 免费在线看成人av| 色狠狠一区二区| 国产日韩精品视频一区| 日本成人中文字幕| 在线一区二区三区四区| 日本一区二区三区国色天香| 日韩黄色免费电影| 99精品久久久久久| 亚洲国产精品ⅴa在线观看| 久久精品国产色蜜蜜麻豆| 欧美色视频一区| 亚洲精品免费在线观看| 成人毛片在线观看| 久久久综合激的五月天| 免费不卡在线视频| 欧美片在线播放| 一区二区三区电影在线播| av毛片久久久久**hd| 久久久久久久性| 久久91精品国产91久久小草| 3d动漫精品啪啪1区2区免费| 亚洲一区二区三区四区在线观看 | 亚洲国产精品ⅴa在线观看| 久久国产福利国产秒拍| 欧美乱妇23p| 亚洲不卡av一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 中文字幕色av一区二区三区| 粉嫩av一区二区三区粉嫩| 久久久久88色偷偷免费| 国产精品888| 国产欧美日韩一区二区三区在线观看| 国产自产v一区二区三区c| 精品国产伦一区二区三区观看体验 | 欧美日韩国产综合草草| 一区二区三区日韩在线观看| 欧洲精品一区二区三区在线观看| 亚洲久本草在线中文字幕| 色综合天天天天做夜夜夜夜做| 亚洲免费成人av| 欧美日韩亚洲综合一区| 亚洲成a人在线观看| 欧美日本在线视频| 日本va欧美va精品发布| 日韩欧美专区在线| 国产精品1区二区.| 国产精品久久一级| 在线欧美日韩国产| 日韩**一区毛片| 2021久久国产精品不只是精品| 国产精品自拍在线| 亚洲视频免费观看| 欧美日韩国产高清一区二区三区| 日韩精品福利网| 久久久精品一品道一区| 不卡一区二区三区四区| 亚洲午夜精品久久久久久久久| 91精选在线观看| 国产一区二区三区在线观看免费| 中文字幕精品一区 | 欧美一区二区三区四区高清| 麻豆成人综合网| 国产精品久线在线观看| 欧美午夜精品久久久久久超碰 | 蜜臀a∨国产成人精品| 久久综合丝袜日本网| 91首页免费视频| 捆绑调教美女网站视频一区| 国产人成亚洲第一网站在线播放 | 国内成+人亚洲+欧美+综合在线| 中文字幕亚洲综合久久菠萝蜜|