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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 020.txt

?? 會變語言實現的一些程序
?? TXT
字號:
第二十課 窗口子類化


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

在這一講,我們將學習什么是窗口子類化和怎樣按你所想要的方式方便地使用它。

理論:

如果你曾經在 Windows 環境下編過程序,有時候就會發現:有一個現成的窗口,幾乎有你所需要的全部功能,但還不完全一樣(否則就沒有必要講這一節了)。你曾遇到過這樣的處境嗎,如果你需要一個具有過濾特殊字符功能的 Edit 控件。當然最直接的方法就是自己用代碼來實現,但這的確是一個費時又很困難的任務,而窗口子類化就可以用來做這種事情。 

窗口子類化允許你接管被子類化的窗口,使你對它有絕對的控制權。舉個例子了來闡明一下:例如你需要一個只接受十六進制數字輸入的文本編輯框,如果使用一個簡單的 Edit控件,當用戶輸入十六進制以外的字符時,你既不知道也無計可施。也就是說,當用戶進文本框中輸入字符串 "zb+q*" 時,如果除了拒絕接受整個字符串以外幾乎什么也不能做,至少這顯得特別不專業。重要的是,你需要具有輸入檢測的能力,即每當用戶輸入一個字符到編輯框中時要能檢測這個字符。

現在來解釋實現細節:當用戶往文本框中輸入字符時,Windows 會給Edit控件的窗口函數發送 WM_CHAR 消息。這個窗口函數本身寄生于 Windows 中,因此不能直接修改它。但是我們可以重定向這個消息使之發送到我們自己編寫的窗口處理函數。如果自定義窗口要處理這個消息那就可以處理它,如果不處理就可以把這個消息轉發到它原來窗口處理函數。通過這種方式,自定義的窗口處理函數就把它自己插入到 Windows 系統和 Edit 控件之間。

看下面的流程: 
窗口子類化之前 
Windows ==>Edit 控件的窗口處理函數。 

子類化之后 
Windows ==>自定義的窗口處理函數==> Edit 控件的窗口處理函數。 

注意子類化并不局限于控件,可以子類化任何窗口,現在我們要把精力集中到怎樣實現子類化一個窗口上。讓我們想想Windows 怎樣知道 Edit 控件的窗口處理函數放在什么地方。猜的?…肯定不是。原來 WNDCLASSEX 結構的成員 lpfnWndProc 指出了窗口函數地址。如果能用自己編寫的窗口函數的地址來替換這個成員變量,那 Windows 不就把消息發到自定義的窗口函數了嗎! 我們通過調用函數SetWindowLong 來實現這個任務,此函數的原型為: 

SetWindowLong PROTO hWnd:DWORD, nIndex:DWORD, dwNewLong:DWORD

hWnd = 將要實施子類化的窗口的句柄 
nIndex = 函數了功能索引 
GWL_EXSTYLE 設置窗口的擴展風格. 
GWL_STYLE 設置新的窗口風格
GWL_WNDPROC 設置新的窗口處理函數地址
GWL_HINSTANCE 設置新的應用程序句柄
GWL_ID 設置新的窗口標識
GWL_USERDATA 設置一個與這個窗口相關的給用戶使用的32位的數據 
dwNewLong = 用來更新的數據 
我們的工作還是比較簡單的: 

寫一個窗口函數用于處理發給 Edit 控件的消息。 
用參數GWL_WNDPROC調用SetWindowLong 函數,如果調用成功那么返回值就是與調用功能相聯系的一個32位的整數 
在我們的程序中,返回值就是原先窗口函數的地址。我們要保存這個值以便以后使用。 記?。河幸恍┪覀儾惶幚淼南?,需要把它們派遣給原來的窗口函數來處理,這就用到另外一個函數 CallWindowProc, 函數原型為:

CallWindowProc PROTO lpPrevWndFunc:DWORD, hWnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD 

lpPrevWndFunc = 窗口原來函數的地址. 剩下的四個參數就是發給自定義函數的參數,直接把它們傳給函數 CallWindowProc 就行了。

代碼舉例: 


.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\comctl32.inc 
includelib \masm32\lib\comctl32.lib 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD 
EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD 

.data 
ClassName  db "SubclassWinClass",0 
AppName    db "Subclassing Demo",0 
EditClass  db "EDIT",0 
Message  db "You pressed Enter in the text box!",0 

.data? 
hInstance  HINSTANCE ? 
hwndEdit dd ? 
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,ADDR ClassName,ADDR AppName,\ 
 WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\ 
           CW_USEDEFAULT,350,200,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 hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    .if uMsg==WM_CREATE 
        invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClass,NULL,\ 
            WS_CHILD+WS_VISIBLE+WS_BORDER,20,\ 
            20,300,25,hWnd,NULL,\ 
            hInstance,NULL 
        mov hwndEdit,eax 
        invoke SetFocus,eax 
        ;----------------------------------------- 
        ; Subclass it! 
        ;----------------------------------------- 
        invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr EditWndProc 
        mov OldWndProc,eax 
    .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 
            .if al>="a" && al<="f" 
                sub al,20h 
            .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 
        .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 

分析:

invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr EditWndProc
mov OldWndProc,eax 

在創建 Edit 控件后,通過調用 SetWindowLong 把原來的窗口函數地址替換為自定義函數的地址,從而對它實施了窗口子類化,要注意 為了調用函數 CallWindowProc,我們存儲了原窗口函數地址,自已編寫的EditWndProc 僅僅是個普普通通的窗口函數。當然也可以再調用一次 SetWindowLong 函數來存儲這個32位的值,

invoke SetWindowLong ,hwndEdit,GWL_USERDATA,eax 。

當然用的時候就要調用GetWindowLong 來取回這個值。 


  .if uMsg==WM_CHAR 
        mov eax,wParam 
        .if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK 
            .if al>="a" && al<="f" 
                sub al,20h 
            .endif 
            invoke CallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam 
            ret 
        .endif 

在函數 EditWndProc 中,我們自己處理了WM_CHAR消息: 如果輸入的字符是'0'--'9'、'A'-'F'或者是'a'--'f'就接受,并且把此消息轉發給原窗口函數,其中若輸入的是小寫的'a'--'f'就把它變為大寫。如果輸入的不是十六進制字符,就丟掉它,并且也不轉發此消息。因此當輸入是非十六進制字符時,這個字符就不會顯示在 Edit 控件中。 

    .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 
        .else 
            invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam 
            ret 
        .end 

在這里我們通過處理 回車(Enter) 鍵進一步示范了子類化的能力。EditWndProc 通過檢查 WM_KEYDONW 消息來判斷是否是 回車鍵,若是顯示提示消息框,否則轉發此消息。 你可以用窗口子類化來控制另外的窗口,這是必須掌握的十分有用的技術之一。 
--------------------------------------------------------------------------------




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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一品二品| 久久精品夜夜夜夜久久| 欧美不卡在线视频| 亚洲美女视频在线观看| 国产一区二区三区电影在线观看 | 成人欧美一区二区三区1314 | 成人免费av在线| 欧美一级精品在线| 亚洲一区二区欧美| av成人老司机| 国产色综合一区| 精品一区二区三区免费播放| 欧美丝袜丝交足nylons图片| **网站欧美大片在线观看| 国产精品系列在线播放| 欧美刺激午夜性久久久久久久| 亚洲一区二区成人在线观看| 99综合电影在线视频| 国产日韩影视精品| 国产精品自拍av| 26uuu另类欧美| 国内精品视频666| 日韩精品一区在线观看| 日韩国产一二三区| 91精品国产综合久久精品图片| 亚洲专区一二三| 欧美日韩情趣电影| 亚洲国产精品久久人人爱蜜臀| 欧美在线观看一区二区| 亚洲综合区在线| 欧美色综合网站| 亚洲bt欧美bt精品| 91精品国产麻豆国产自产在线| 亚洲成人av一区二区| 欧美精品高清视频| 日产精品久久久久久久性色| 欧美一区二区三区成人| 免费视频一区二区| 日韩午夜小视频| 国内精品不卡在线| 中文欧美字幕免费| 成人毛片老司机大片| 亚洲欧洲中文日韩久久av乱码| 色哟哟亚洲精品| 亚洲一区在线视频观看| 91精品国产福利| 国内不卡的二区三区中文字幕 | 高清不卡在线观看| 国产日韩视频一区二区三区| av在线一区二区三区| 成人免费在线播放视频| 欧美亚洲高清一区| 日本aⅴ亚洲精品中文乱码| 日韩精品在线网站| av在线不卡电影| 亚洲国产视频在线| 久久婷婷久久一区二区三区| www.在线成人| 亚洲成人免费影院| 久久蜜桃av一区二区天堂 | 成人综合在线网站| 亚洲品质自拍视频网站| 日韩一区二区三区四区| 成人福利视频在线| 午夜精品成人在线视频| 国产清纯美女被跳蛋高潮一区二区久久w| 丁香婷婷综合网| 亚洲自拍另类综合| 国产午夜精品理论片a级大结局 | 夜夜揉揉日日人人青青一国产精品| 777色狠狠一区二区三区| 国产成人综合在线观看| 亚洲综合视频在线观看| 久久九九全国免费| 欧美电影影音先锋| 成人精品视频网站| 麻豆一区二区三区| 亚洲激情av在线| 久久久精品2019中文字幕之3| 欧美三级三级三级爽爽爽| 国产一区二区在线影院| 亚洲国产一区二区在线播放| 中文字幕不卡在线播放| 制服.丝袜.亚洲.中文.综合| 99久久久久久| 国产成人av网站| 青青草97国产精品免费观看| 有坂深雪av一区二区精品| 久久精品亚洲麻豆av一区二区 | 奇米在线7777在线精品 | 色天天综合久久久久综合片| 精东粉嫩av免费一区二区三区| 亚洲综合成人在线视频| 国产精品免费丝袜| 国产日韩精品一区二区浪潮av | 国产一区二区三区免费观看| 日韩成人免费在线| 亚洲与欧洲av电影| 亚洲美女淫视频| 国产精品国产三级国产专播品爱网| 精品国产一区二区在线观看| 欧美乱熟臀69xxxxxx| 欧美无砖专区一中文字| 91欧美激情一区二区三区成人| 成人综合在线视频| 成人午夜在线视频| 国产在线不卡视频| 韩国中文字幕2020精品| 美女视频黄 久久| 麻豆91精品91久久久的内涵| 青娱乐精品在线视频| 日韩国产在线观看一区| 偷拍一区二区三区| 亚洲福利一区二区三区| 婷婷丁香久久五月婷婷| 亚洲成人免费观看| 日本在线观看不卡视频| 美女视频一区在线观看| 美女网站一区二区| 国产一区二区按摩在线观看| 国产精品一区二区三区网站| 成人污视频在线观看| 99久久国产综合精品女不卡| 色网综合在线观看| 欧美网站一区二区| 日韩一卡二卡三卡四卡| 久久久亚洲精品石原莉奈| 国产精品久久久久久久久免费桃花| 亚洲视频你懂的| 五月婷婷另类国产| 国产在线播放一区二区三区| 高清国产一区二区| 色综合久久88色综合天天 | 色婷婷综合久久久久中文一区二区| 91美女片黄在线| 91精品欧美久久久久久动漫| 精品国产伦一区二区三区观看方式| 久久美女高清视频| 亚洲欧美精品午睡沙发| 婷婷激情综合网| 丁香另类激情小说| 在线免费视频一区二区| 日韩午夜激情av| 国产女同互慰高潮91漫画| 亚洲最快最全在线视频| 精品一区二区国语对白| 99久久婷婷国产综合精品电影| 在线免费观看日本一区| 欧美大片在线观看一区| 18欧美乱大交hd1984| 美日韩黄色大片| a级精品国产片在线观看| 欧美一区二区三区四区在线观看 | 一区二区三区丝袜| 久久国产精品第一页| av电影在线观看一区| 欧美一级片在线| 自拍偷拍亚洲激情| 精品一区二区三区在线观看国产| 99re8在线精品视频免费播放| 6080yy午夜一二三区久久| 亚洲欧洲日韩在线| 精品亚洲aⅴ乱码一区二区三区| 91日韩在线专区| 国产日韩欧美不卡| 久久国产福利国产秒拍| 在线观看日韩毛片| 中文字幕一区在线观看| 久久国产视频网| 欧美日韩1234| 亚洲综合一区二区三区| 国产成人精品影视| 欧美一级在线免费| 亚洲午夜一二三区视频| 97精品视频在线观看自产线路二| 精品美女在线播放| 日韩av不卡一区二区| 色哟哟欧美精品| 最新欧美精品一区二区三区| 国产99久久久国产精品免费看| 日韩视频中午一区| 性做久久久久久免费观看欧美| 色哟哟精品一区| 日韩一区欧美小说| 成人a免费在线看| 国产亚洲一区字幕| 国产麻豆视频精品| 欧美精品一区二区三区蜜臀| 婷婷成人综合网| 欧美人狂配大交3d怪物一区| 一区二区成人在线视频| 色哟哟国产精品| 亚洲三级在线观看| av高清不卡在线| 亚洲免费观看高清| 色av成人天堂桃色av| 亚洲美女屁股眼交| 欧美网站一区二区| 日韩中文字幕亚洲一区二区va在线| 欧美在线视频全部完|