青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

超類(lèi)化

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

理論:

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

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

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

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

舉例:

.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 ? ;原來(lái)的窗口過(guò)程

.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)榇髮?xiě)
.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è)例子是通過(guò)修改窗口了類(lèi)化的例子得來(lái)的。這個(gè)程序開(kāi)始和其它程序一樣,有趣的部分出現(xiàn)在主窗口被創(chuàng)建的時(shí)候:

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

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

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

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

invoke RegisterClassEx, addr wc

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

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è)完新類(lèi)就可以創(chuàng)建基于它的窗口了:
在上面的程序片斷中,用寄存器 ebx 來(lái)保存已創(chuàng)建的窗口數(shù)目,用寄存器 edi 來(lái)保存窗口左上角的 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 窗口控件了,替換的窗口過(guò)程處理了字符過(guò)濾,這實(shí)際上和在子類(lèi)化中的例子是一樣的。但不必做子類(lèi)化那些窗口的額外工作了。

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

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

posted on 2007-07-18 00:08 旅途 閱讀(288) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 深入windows

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国亚洲| 久久精品综合| 夜夜嗨av一区二区三区网页| 欧美三区美女| 欧美在线观看日本一区| 亚洲电影在线看| 中日韩男男gay无套| 国产情侣一区| 欧美电影打屁股sp| 亚洲一区二区三区精品动漫| 六月婷婷一区| 亚洲在线视频网站| 在线高清一区| 国产精品日韩欧美大师| 毛片精品免费在线观看| 亚洲一区二区高清| 美女精品在线| 午夜精品久久久久久久男人的天堂 | 欧美3dxxxxhd| 亚洲免费在线看| 亚洲国产精品电影| 国产欧美高清| 欧美日韩三区四区| 久久gogo国模裸体人体| 亚洲美女视频在线观看| 国产精品美女久久久久av超清 | 亚洲欧美在线免费| 亚洲国产精品一区二区www| 午夜视频在线观看一区| 亚洲精品久久久久久下一站| 国产一区深夜福利| 欧美系列亚洲系列| 久久亚洲色图| 欧美在线网址| 中日韩美女免费视频网址在线观看 | 亚洲视频网站在线观看| 欧美jizz19hd性欧美| 久久国产精品久久久久久| 一区二区三区精品久久久| …久久精品99久久香蕉国产| 国产精品久久网站| 欧美国产日韩精品| 久久免费视频网| 久久精品麻豆| 香蕉久久一区二区不卡无毒影院| 99热在线精品观看| 国产亚洲成av人片在线观看桃| 亚洲电影免费观看高清完整版在线 | 欧美伊久线香蕉线新在线| 亚洲午夜未删减在线观看| 亚洲精品乱码久久久久久| 米奇777超碰欧美日韩亚洲| 久久精品72免费观看| 校园春色综合网| 欧美理论在线| 欧美在线你懂的| 久久不射电影网| 欧美在线观看网址综合| 午夜精品一区二区三区四区| 亚洲欧美激情四射在线日 | 亚洲精品免费网站| 亚洲国产精品尤物yw在线观看| 裸体女人亚洲精品一区| 久久久久久一区二区三区| 久久精品国产99| 欧美在线精品免播放器视频| 欧美一区影院| 久久久久88色偷偷免费| 久久黄色影院| 日韩亚洲国产精品| 亚洲成色精品| 亚洲日本免费| 一级日韩一区在线观看| 一个人看的www久久| 亚洲网站视频福利| 亚洲男女自偷自拍| 久久国产精品亚洲77777| 久久精品国产一区二区三区免费看 | 国产精品成人一区二区网站软件| 欧美午夜宅男影院| 国产精品一区2区| 国产一二精品视频| 亚洲福利专区| 99国产精品久久久| 亚洲欧美www| 久久久久久穴| 欧美二区在线| 一本高清dvd不卡在线观看| 亚洲一区二区免费在线| 久久精品免费| 欧美精品在线一区| 国产精品免费区二区三区观看| 国产午夜亚洲精品羞羞网站| 亚洲国产美女| 亚洲一区在线直播| 久久精品一本| 亚洲激情av在线| 亚洲在线中文字幕| 亚洲伊人伊色伊影伊综合网| 欧美午夜视频网站| 国产日韩欧美综合精品| 91久久夜色精品国产九色| 在线午夜精品| 欧美一级淫片aaaaaaa视频| 免费在线观看一区二区| 夜夜嗨av一区二区三区中文字幕| 性感少妇一区| 欧美巨乳波霸| 黄色成人在线网址| 亚洲一区三区视频在线观看| 老司机午夜免费精品视频| 日韩视频第一页| 久久久久欧美| 国产精品成人一区二区三区夜夜夜| 精品999日本| 亚洲欧美日韩精品久久| 欧美超级免费视 在线| 亚洲一区在线看| 狼人天天伊人久久| 国产精品一级在线| 日韩写真视频在线观看| 久久麻豆一区二区| 日韩亚洲精品视频| 另类综合日韩欧美亚洲| 国产欧美在线播放| 亚洲特黄一级片| 欧美激情片在线观看| 性欧美xxxx视频在线观看| 欧美精品亚洲| 狠狠色狠狠色综合日日91app| 亚洲宅男天堂在线观看无病毒| 日韩视频在线观看一区二区| 国产精品久久一级| 亚洲欧洲三级| 久久精彩免费视频| 日韩午夜激情| 欧美bbbxxxxx| 在线成人av| 久久xxxx| 亚洲影院免费观看| 欧美日韩激情网| 亚洲黄色免费| 两个人的视频www国产精品| 亚洲香蕉伊综合在人在线视看| 欧美精品免费在线观看| 亚洲国产另类久久精品| 久久久亚洲国产天美传媒修理工 | 久久综合色一综合色88| 国产婷婷色一区二区三区在线 | 亚洲欧美制服另类日韩| 欧美午夜电影在线| 妖精成人www高清在线观看| 免费亚洲一区二区| 欧美在线综合视频| 国产有码一区二区| 欧美伊人久久久久久久久影院| 亚洲天堂第二页| 欧美视频中文在线看| 亚洲视频一起| 在线亚洲精品福利网址导航| 国产精品99免视看9| 正在播放欧美视频| 日韩亚洲精品在线| 红桃视频亚洲| 久久另类ts人妖一区二区| 欧美一区二区三区视频在线| 国产欧美一区二区精品性| 欧美亚洲视频一区二区| 亚洲你懂的在线视频| 国产日韩精品综合网站| 久久久另类综合| 久久网站免费| 亚洲人成网站777色婷婷| 亚洲国产视频a| 欧美黄色一区| 亚洲影院在线观看| 香蕉乱码成人久久天堂爱免费| 国产亚洲综合性久久久影院| 久久综合网色—综合色88| 噜噜噜在线观看免费视频日韩| 亚洲人体大胆视频| 亚洲精选中文字幕| 欧美色精品在线视频| 性高湖久久久久久久久| 性色av一区二区三区红粉影视| 国产性猛交xxxx免费看久久| 麻豆国产精品777777在线| 欧美韩日精品| 亚洲一区精品视频| 性一交一乱一区二区洋洋av| 玉米视频成人免费看| 亚洲欧洲精品一区二区三区| 欧美偷拍另类| 欧美一级理论性理论a| 久久久精品一品道一区| 99re成人精品视频| 亚洲欧美日韩在线一区| 亚洲国产精品视频一区| 亚洲精品国产精品久久清纯直播| 国产精品另类一区|