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

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

Win32匯編--開始了解窗口程序

 

窗口是什么?大家每天在使用Windows,屏幕上的一個個方塊就是一個個窗口!那么,窗口為什么是這個樣子呢?窗口就是程序嗎?

 

回想DOS時代的計算屏幕,在1990Windows 3.0推出之前,計算機的屏幕一直使用文本模式,黑洞洞的底色上漂浮著白色的小字。對DOS程序來說,屏幕是唯一的,上面有光標表示輸入字符的位置,程序運行后往屏幕輸出一些信息,退出時輸出的信息就留在了屏幕上,然后是第二個程序重復這個過程,當屏幕被寫滿的時候,整個屏幕上卷一行,最上面一行被去掉,然后程序在最底下新空出來的一行上繼續(xù)輸出。

 

對于一個單任務(wù)的操作系統(tǒng),這種方式是很合理的,因為平時使用傳真機或打字機就是用上卷的方式來容納新的內(nèi)容的。但是如果是多任務(wù)呢?兩個程序同時往屏幕上寫東西或者兩個人同時往打字機上打字,那么誰都看不懂混在一起的是什么。DOS下的TSR(內(nèi)存駐留)程序是多個程序同時使用一個屏幕的例子,但實質(zhì)上這并不是多任務(wù),而是TSR將別的程序暫時掛起,掛起的程序不可能在TSR執(zhí)行期間再向屏幕輸出內(nèi)容,TSR在輸出自己的內(nèi)容之前必須保存屏幕上顯示的內(nèi)容,并在退出的時候把屏幕恢復原來的樣子,否則掛起的程序并不知道屏幕已經(jīng)被改變,在這個過程中,DOS不會去干預中間發(fā)生的一切。

 

Windows是多任務(wù)的操作系統(tǒng),可以同時運行多個程序,同樣,各個程序在屏幕上的顯示不能互相干擾,而且,多個程序可以看成是“同時”運行的,在后臺的程序也可能隨時向屏幕輸出內(nèi)容,這中間的高度是由Windows完成的。Windows采用的方法是給程序一塊矩形的屏幕空間,這就是窗口。應(yīng)用程序通過Windows向?qū)儆谧约旱拇翱陲@示信息,Windows判斷該窗口是不是被別的窗口擋住,并把沒有擋住的部分輸出到屏幕上,這樣屏幕上顯示的東西就不會互相覆蓋而亂套。對于應(yīng)用程序來說,它只需認為窗口就是自己擁有的顯示空間就可以了。

 

窗口和程序的關(guān)系

既然不同窗口的內(nèi)容就是不同程序的輸出,那么一個窗口就是一個程序嗎?反過來,一個程序就是一個窗口嗎?

答案是否定的,一個窗口不一定就是一個程序,它可能只是一個程序的一部分。一個程序可以建立多個頂層窗口,如Windows的桌面和任務(wù)欄都是頂層窗口,但它們都屬于“文件管理器”進程,所以并不是一個窗口就是一個程序的代表。Windows的窗口采用層次結(jié)構(gòu),一個窗口中可以建立多個子窗口,如窗口中的狀態(tài)欄,工具欄,對話框中的按鈕,文本輸入框與復選框等都是子窗口。子窗口中還可以建立下一級子窗口,如Word工具欄上的字體選擇框。

 

反過來,運行的程序并非一定就是窗口,比如悄悄在后臺運行的木馬程序就不會顯示一個窗口向用戶報告它在干什么。在Windows NT下用“任務(wù)管理器”查看,進程的數(shù)量比屏幕上的窗口多得多,意味著很多的運行程序并沒有顯示窗口。如果一個程序不想和用戶交互,它可以選擇不建立窗口。

 

所以本章的標題“第一個窗口程序”,指學習編寫第一個以標準的窗口為界面的程序,而不是泛指Windows程序。如果要寫的Win32程序不是以窗口為界面的,如控制臺程序等,就不一定采用本章中提及的以消息驅(qū)動的程序結(jié)構(gòu)。

 

雖然以窗口為界面的程序并不是所有Windows程序的必須選擇,但絕大部分的應(yīng)用程序是以這種方式出現(xiàn)的,從操作系統(tǒng)的名稱“Windows”就可以看出這一點,了解窗口程序就是相當于在了解Windows工作方式的基礎(chǔ)。

 

 

窗口界面

大部分的窗口看上去都是大同小異。

典型的窗口,即Windows附帶的寫字板程序窗口。

 

窗口一般由屏幕上的矩形區(qū)域組成,不同的窗口可能包括一些相同的組成部分,如標題欄、菜單、工具欄、邊框和狀態(tài)欄等,每個部分都有自己固定的行為模式:

·窗口邊框:窗口的外沿就是窗口邊框,用鼠標按住邊框并拖動可以調(diào)整窗口的大小。

·標題欄:窗口的最上面是標題欄,用鼠標按住標題欄拖動可以移動窗口,雙擊標題欄則將窗口最大化或從最大化的狀態(tài)恢復。通過標題欄的顏色可以區(qū)分窗口是不是活動窗口,同時標題欄列出了應(yīng)用程序的名稱。

·菜單:標題欄下面是菜單,單擊菜單會彈出各種功能選擇。

·工具欄:菜單的下面是工具欄,工具欄上用圖標的方式列出最常用的功能,相當于菜單的快捷方式。

·圖標和最小化、最大化與關(guān)閉按鈕:圖標位于標題欄的左邊,三個控制按鈕則位于標題欄的右邊。單擊圖標會彈出一個系統(tǒng)菜單,雙擊圖標則相當于按下了關(guān)閉按鈕。最小化、最大化按鈕用來控制窗口的大小。

·狀態(tài)欄:位于窗口的最下面,用來顯示一些狀態(tài)信息。

·客戶區(qū):窗口中間用來工作或輸出的區(qū)域,叫做窗口的客戶區(qū),把窗口看做是一張白紙的話,客戶區(qū)就是白紙中真正用來寫東西的區(qū)域,程序在這里和用戶進行交互。

·滾動條:如果客戶區(qū)太小不足以顯示全部內(nèi)容,右邊或底部可能還有滾動條,拖動它可以滾動窗口的客戶區(qū),以便看到其他的內(nèi)容。

 

雖然大部分的窗口看上去都差不多,但并不是每個窗口都有這些東西,也許有的窗口就沒有圖標和最小化、最大化框,有的沒有工具欄或狀態(tài)欄,有的沒有標題欄,而有的就干脆是個奇怪的形狀,如Office幫助中助手,那些小狗小貓都些不折不扣的窗口,Windows的桌面和桌面下面的任務(wù)欄也都是窗口,就連屏幕保護的黑屏幕也是一個大小為整個屏幕、沒有標題欄和邊框的窗口!

 

一致的窗口形狀和行為模式為Windows用戶提供了一致的用戶界面,幾乎所有的窗口程序都在菜單的第一欄設(shè)置有關(guān)文件的操作和退出功能、最后一欄設(shè)置程序的幫助,相同的功能在工具欄上的圖標也是大同小蒸發(fā)量的,用戶可以不再像在DOS下那樣,對不同的程序需要學習不同的界面,用戶自從學會使用第一個軟件起,就基本學會了所有Windows軟件的使用模式,而且可以通過相似的菜單、工具欄等來發(fā)掘程序的新功能。窗口的菜單和客戶區(qū)則是最個性化的東西,菜單隨程序的不同而不同,而客戶區(qū)則是窗口程序的輸出區(qū)域,不同的程序在客戶區(qū)內(nèi)顯示了不同的內(nèi)容。

 

 

窗口程序是怎么工作的

窗口程序的運行模式

對程序員來說,要了解的不僅是用戶可以看到的部分,還必須了解窗口底下的東西,了解用怎樣的程序結(jié)構(gòu)來實現(xiàn)窗口的行為模式。

 

DOS程序員熟悉的是順序化的、按過程驅(qū)動的程序設(shè)計方法。程序有明顯的開始、明顯的過程和明顯的結(jié)束,由程序運行的階段來決定用戶該做什么。而窗口程序是事件驅(qū)動的(再次提醒:這里是“窗口程序”,而不是“Windows程序”,因為和窗口有關(guān)的程序者事件驅(qū)動的,其他的Windows程序可能并不這樣工作,如控制臺程序的結(jié)構(gòu)還是同DOS程序一樣是順序化的,但與窗口相關(guān)的Windows程序占了絕大多數(shù),所以大部分的書籍中講到Windows程序就認為是事件驅(qū)動的程序),用戶可能隨時發(fā)出各種消息,如操作的過程中覺得窗口不夠大了,就馬上會拖動邊框,程序必須馬上調(diào)整客戶區(qū)的內(nèi)容以適應(yīng)新的窗口大小;用戶覺得想先干別的事情,可能會把窗口最小化,關(guān)閉按鈕也有可能隨時被按下,這意味著程序要隨時可以處理退出的請求。如果非要規(guī)定干活的時候不能移動窗口與調(diào)整大小,那么這些窗口就會呆在桌面上一動不動。

 

窗口程序在結(jié)構(gòu)上和DOS程序有很大的不同,窗口程序?qū)崿F(xiàn)大部分功能的代碼應(yīng)該呆在同一個模塊——消息處理模塊,這個模塊可以隨時應(yīng)付所有類型的消息,只有這樣才能隨時響應(yīng)用戶的各種操作。

 

下面是地地道道的Win32匯編窗口程序:

FirstWindow源代碼。

                .386

                .model flat,stdcall

                option casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 文件定義

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include         windows.inc

include         gdi32.inc

includelib      gdi32.lib

include         user32.inc

includelib      user32.lib

include         kernel32.inc

includelib      kernel32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 數(shù)據(jù)段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .data?

hInstance       dd      ?

hWinMain        dd      ?

 

                .const

szClassName     db      'MyClass',0

szCaptionMain   db      'My first Window!',0

szText          db      'Win32 Assembly, Simple and powerful!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代碼段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 窗口過程

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcWinMain    proc uses ebx edi esi, hWnd, uMsg, wParam, lParam

                local @stPs:PAINTSTRUCT

                local @stRect:RECT

                local @hDc

 

                mov eax,uMsg

;*************************************************************************

                .if     eax == WM_PAINT

                        invoke     BeginPaint,hWnd,addr @stPs

                        mov     @hDc,eax

 

                        invoke GetClientRect,hWnd,addr @stRect

                        invoke    DrawText,@hDc,addr szText,-1, \

                                addr @stRect, \

                                DT_SINGLELINE or DT_CENTER or DT_VCENTER

 

                        invoke     EndPaint, hWnd, addr @stPs

;***************************************************************************

                .elseif eax == WM_CLOSE

                        invoke     DestroyWindow,hWinMain

                        invoke     PostQuitMessage,NULL

;***************************************************************************

                .else

                        invoke     DefWindowProc,hWnd,uMsg,wParam,lParam

                        ret

                .endif

;***************************************************************************

                xor     eax,eax

                ret

_ProcWinMain    endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_WinMain        proc

                local   @stWndClass:WNDCLASSEX

                local   @stMsg:MSG

 

                invoke     GetModuleHandle,NULL

                mov     hInstance,eax

                invoke     RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

;**************************************************************************

; 注冊窗口類

;**************************************************************************

                invoke     LoadCursor,0,IDC_ARROW

                mov     @stWndClass.hCursor,eax

                push    hInstance

                pop     @stWndClass.hInstance

                mov     @stWndClass.cbSize, sizeof WNDCLASSEX

                mov     @stWndClass.style, CS_HREDRAW or CS_VREDRAW

                mov     @stWndClass.lpfnWndProc, offset _ProcWinMain

                mov     @stWndClass.hbrBackground,COLOR_WINDOW + 1

                mov     @stWndClass.lpszClassName, offset szClassName

                invoke     RegisterClassEx, addr @stWndClass

;***************************************************************************

; 建立并顯示窗口

;***************************************************************************

                invoke     CreateWindowEx, WS_EX_CLIENTEDGE, \

                        offset szClassName, offset szCaptionMain, \

                        WS_OVERLAPPEDWINDOW, \

                        100, 100, 600, 400, \

                        NULL, NULL, hInstance, NULL

                mov     hWinMain,eax

                invoke     ShowWindow,hWinMain,SW_SHOWNORMAL

                invoke     UpdateWindow,hWinMain

;**************************************************************************

; 消息循環(huán)

;**************************************************************************

                .while TRUE

                        invoke     GetMessage, addr @stMsg, NULL, 0, 0

                        .break     .if eax == 0

                        invoke     TranslateMessage, addr @stMsg

                        invoke     DispatchMessage, addr @stMsg

                .endw

                ret

_WinMain        endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:

                call    _WinMain

                invoke ExitProcess, NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                end start

 

編譯運行后,窗口出來了,對于這個窗口,用戶可以拖動邊框去改變大小、按標題欄上的按鈕來最大化和最小化,當光標到邊框的時候,會自動變成箭頭,總之,這個窗口包括了一個典型窗口的所有特征。

 

接下來開始分析源代碼,看了這三頁多的源代碼,第一個感覺是什么?是不是想撤退了?90%的人有同樣的感覺,別急,過了這一關(guān),Win32匯編的入門就成功了一半了,所以千萬要挺?。∮袀€振奮人心的消息是,這個程序是大部分窗口程序的模板,以后要寫一個新的程序,把它拷貝過來再往中間添磚加瓦就是了,功夫一點都不白費。

 

先靜下心來分析一下程序的結(jié)構(gòu),首先是注釋,模式定義,include,.data數(shù)據(jù)段,.code代碼段。

 

程序入口是start,然后執(zhí)行了一下_WinMain子程序,完成后就是程序退出的函數(shù)ExitProcess,再看_WinMain的結(jié)構(gòu),前面是順序下來的幾個API調(diào)用:

GetMoudleHandle à RelZeroMemory à LoadCursor à RegisterClassEx à CreateWindowEx à ShowWindow à UpdateWindow

 

從名稱上就能看出它們的用途,很明顯,窗口是在CreateWindowEx處建立的,ShowWindow則是把窗口顯示在屏幕上,這些代碼是窗口的建立過程。

 

接下來,就是一個由3API組成的循環(huán)了:

GetMessage à TranslateMessage à DispatchMessage

 

很明顯,這是和消息有關(guān)的循環(huán),因為API名稱中都帶有Message字樣,如果退出這個循環(huán),程序也就結(jié)束了,這個循環(huán)叫做消息循環(huán)。

 

設(shè)置_WinMain子程序并不是必須的,可以把_WinMain的所有代碼放到主程序中,沒有任何影響,之所以這樣只是為將這里使用的變量定義成局部變量,這樣可以方便移植。

 

看了程序的流程,似乎沒有什么地方涉及窗口的行為,如改變大小和移動位置的處理等。

再看源程序,除了_WinMain,還有一個子程序_ProcWinMain,但除了在WNDCLASSEX結(jié)構(gòu)的賦值中提到過它,好像就沒有什么地方要用到這個子程序,起碼在自己編寫的源代碼中沒有任何一個地方調(diào)用過它。

 

再看ProWinMain,它是一個分支結(jié)構(gòu)處理的子程序,功能是把參數(shù)uMsg取出來,根據(jù)不同的uMsg執(zhí)行不同的代碼,完了以后就退出了,中間也沒有任何東西和主程序有關(guān)聯(lián)。

 

第一個窗口程序就是由這么兩個似乎是風馬牛不相及的部分組成的,但它確實能工作,對于寫慣了DOS匯編的程序員來說,這似乎不可理解。下面來看看這么一個陌生而奇怪的程序是如何工作的。

 

窗口程序的運行過程

在屏幕上顯示一個窗口的過程一般有以下步驟,這就是主程序的結(jié)構(gòu)流程:

1)得到應(yīng)用程序的句柄(GetMoudleHandle)。

2)注冊窗口類(RegisterClassEx)。在注冊之前,要先填寫RegisterClassEx的參數(shù)WNDCLASSEX結(jié)構(gòu)。

3)建立窗口(CreateWindowEx)。

4)顯示窗口(ShowWindow)。

5)刷新窗口客戶區(qū)(UpdateWindow)。

6)進入無限的消息獲取和處理的循環(huán)。首先獲取消息(GetMessage),如果有消息到達,則將消息分派到回調(diào)函數(shù)處理(DispatchMessage),如果消息是WM_QUIT,則退出循環(huán)。

 

程序的另一半_ProcWinMain子程序是用來處理消息的,它就是窗口的回調(diào)函數(shù)(CallBack),也叫做窗口過程,之所以是回調(diào)函數(shù)是因為它是由Windows而不是我們自己調(diào)用的,我們調(diào)用DispatchMessage,而DispatchMessage再回過來調(diào)用窗口過程。

 

所有的用戶操作都是通過消息來傳給應(yīng)用程序的,如用戶按鍵,鼠標移動,選擇了菜單和拖動了窗口等,應(yīng)用程序中由窗口過程接收消息并處理,在例子程序中就是_ProcWinMain。窗口過程構(gòu)造了一個分支結(jié)構(gòu),對應(yīng)不同的消息執(zhí)行不同的代碼,所以一個應(yīng)用程序中幾乎所有的功能代碼都集中在窗口過程里。

 

Windows在系統(tǒng)內(nèi)部有一個系統(tǒng)消息隊列,當輸入設(shè)備有所動作的時候,如用戶按動了鍵盤、移動了鼠標,按下或放開了鼠標等,Windows都會產(chǎn)生相應(yīng)的記錄放在系統(tǒng)消息隊列里,每個記錄中包含消息的類型、發(fā)生的位置(如鼠標在什么坐標移動)和發(fā)生的時間等信息。

 

同時,Windows為每個程序(嚴格地說是每個線程)維護一個消息隊列,Windows檢查系統(tǒng)消息隊列里消息的發(fā)生位置,當位置位于某個應(yīng)用程序的窗口范圍內(nèi)的時候,就把這個消息派送到應(yīng)用程序的消息隊列里。

 

當應(yīng)用程序還沒有來取消息的時候,消息就暫時保留在消息隊里,當程序中的消息循環(huán)執(zhí)行到GetMessage的時候,控制權(quán)轉(zhuǎn)移到GetMessage所在的USER32.DLL中,USER32.DLL從程序消息隊列中取出一條消息,然后把這條消息返回應(yīng)用程序。

 

應(yīng)用程序可以對這條消息進行預處理,如可以用TranslateMessage把基于鍵盤掃描碼的按鍵消息轉(zhuǎn)換成基于ASCII碼的鍵盤消息,以后也會用到TranslateAccelerator把鍵盤快捷鍵轉(zhuǎn)換成命令消息,但這個步驟不是必需的。

 

然后應(yīng)用程序?qū)⑻幚磉@個消息,但方法不是自己直接調(diào)用窗口過程來完成,而是通過DispatchMessage間接調(diào)用窗口過程,Dispatch的英文含義是“分派”,之所以是“分派”,是因為一個程序可能建有不止一個窗口,不同的窗口消息必須分派給相應(yīng)的窗口過程。當控制權(quán)轉(zhuǎn)移到USER32.DLL中的DispatchMessage時,DispatchMessage找出消息對應(yīng)窗口的窗口過程,然后把消息的具體信息當做參數(shù)來調(diào)用它,窗口過程根據(jù)消息找到對應(yīng)的分支去處理,然后返回,這時控制權(quán)回到DispatchMessage,最后DispatchMessage函數(shù)返回應(yīng)用程序。這樣,一個循環(huán)就結(jié)束了,程序又開始新一輪的GetMessage。

 

窗口程序 à GetMessage(USER32.DLL) –> TranslateMessage(USER32.DLL) –> DispatchMessage(USER32.DLL) à 窗口過程 à USER32.DLL à 窗口程序

 

為什么要由Windows來調(diào)用窗口過程,程序取了消自以后自己處理不是更簡便嗎?事實上并非如此,如果程序自己處理消息的“分派”,就必須自己維護本程序所屬窗口的列表,當程序建立的窗口不止一個的時候,這個工作就變得復雜起來;另一個原因是:別的程序也可能用SendMessage通過Windows直接調(diào)用你的窗口過程;第三個原因:Windows并不是把所有的消息都放進消息隊列,有的消息是直接調(diào)用窗口過程處理的,如WM_SETCURSOR等實時性很強的消息,所以窗口過程必須開放給Windows。

 

應(yīng)用程序之間也可以互發(fā)消息,PostMessage是把一個消息放到其他程序的消息隊列中,目標程序收到了這個條消息就把它放入該程序的消息隊列去處理;而SendMessage則越過消息隊列直接調(diào)用目標程序的窗口過程,窗口過程返回以后才從SendMessage返回。

 

窗口過程是由Windows回調(diào)的,Windows又是怎么知道往哪里回調(diào)呢?答案是我們在調(diào)用RegisterClassEx函數(shù)的時候告訴了Windows。

 

posted on 2010-08-13 09:53 luqingfei 閱讀(1393) 評論(0)  編輯 收藏 引用 所屬分類: Win32匯編程語言序設(shè)計

導航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統(tǒng)計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美一区二区色老头 | 红桃视频国产精品| 国产精品入口尤物| 国产精品v日韩精品| 欧美二区在线播放| 欧美丰满少妇xxxbbb| 欧美激情一区二区三区四区| 欧美日韩国产成人在线观看| 国产精品户外野外| 国产一区视频在线观看免费| 亚洲国产第一| 久久一区亚洲| 欧美va天堂| 欧美日本三区| 国产精品一香蕉国产线看观看| 国产亚洲福利| 亚洲精品免费电影| 亚洲欧美日韩在线不卡| 久久久国产一区二区三区| 老鸭窝毛片一区二区三区| 91久久夜色精品国产网站| 亚洲黄页一区| 亚洲免费视频一区二区| 久久久久亚洲综合| 欧美日韩亚洲一区二区三区在线| 国产精品国内视频| 亚洲黄色av| 欧美在线视频免费播放| 另类亚洲自拍| 制服丝袜亚洲播放| 米奇777超碰欧美日韩亚洲| 国产精品成人播放| 亚洲激情影视| 久久久久久久国产| 一区二区三区欧美在线| 免费精品99久久国产综合精品| 国产精品久久久久9999高清| 亚洲黄一区二区三区| 新狼窝色av性久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 日韩小视频在线观看专区| 久久精品一区二区三区不卡牛牛| 欧美日韩一区二区三区在线| 亚洲精品国产品国语在线app| 久久女同互慰一区二区三区| 中文精品一区二区三区| 欧美mv日韩mv国产网站| 在线观看日韩av电影| 香蕉久久夜色精品| 一本一本a久久| 欧美日韩一区二区三区免费| 99视频一区| 亚洲经典一区| 欧美18av| 亚洲精品乱码久久久久久日本蜜臀| 久久久免费观看视频| 午夜精品视频网站| 国产精品久久久久久久一区探花| 亚洲一级片在线看| 在线视频你懂得一区| 国产精品啊啊啊| 一区二区三区日韩| av成人黄色| 国产精品黄视频| 欧美亚洲系列| 欧美一区二区三区久久精品| 国产欧美日韩91| 欧美一区视频| 久久久久99| 欧美四级在线观看| 亚洲视频大全| 亚洲精品国产精品国自产观看| 久久久久久穴| 久久婷婷国产综合尤物精品 | 亚洲一区成人| 国产精品伊人日日| 久久久久久成人| 久久久久久亚洲精品不卡4k岛国| 亚洲夫妻自拍| 亚洲人成亚洲人成在线观看图片 | 欧美一区二区三区四区在线观看地址 | 亚洲最新视频在线播放| 99精品国产在热久久下载| 国产精品美女久久久久久久| 欧美亚洲在线视频| 久久久另类综合| 亚洲最新视频在线| 新狼窝色av性久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 好吊妞**欧美| 欧美黄色精品| 国产精品多人| 久久久久久穴| 欧美精品粉嫩高潮一区二区| 亚洲欧美国产视频| 久久免费黄色| 亚洲视频导航| 久久综合给合久久狠狠色| 一区二区三区久久精品| 欧美一区二区三区在线看 | 久久精品国产一区二区三| 蜜乳av另类精品一区二区| 香蕉久久夜色| 欧美精品18videos性欧美| 久久av一区二区三区漫画| 免费看黄裸体一级大秀欧美| 午夜久久久久久久久久一区二区| 久久久精品一区| 一区二区三区日韩精品视频| 久久久99久久精品女同性| 亚洲欧美国产另类| 欧美成人一区二区三区片免费| 亚洲欧美日韩中文视频| 欧美激情91| 亚洲精品网址在线观看| 亚洲毛片在线免费观看| 亚洲欧美日韩精品久久| 玖玖在线精品| 久久国产精品久久久久久久久久 | 亚洲午夜激情免费视频| 亚洲国产欧美日韩| 欧美在线|欧美| 亚洲欧美在线一区| 你懂的视频一区二区| 久久一区二区三区超碰国产精品| 欧美日韩在线播放一区| 亚洲精品乱码久久久久久按摩观| 黄色成人小视频| 欧美一区激情| 久久gogo国模裸体人体| 国产精品美女诱惑| 亚洲一区二区三区成人在线视频精品| 亚洲国产成人久久| 久久久久免费视频| 久久久久国色av免费看影院| 国产九九精品视频| 亚洲午夜伦理| 亚洲午夜av在线| 欧美日韩1区2区3区| 亚洲清纯自拍| 欲色影视综合吧| 亚洲自拍高清| 欧美在线三区| 久久这里有精品15一区二区三区| 午夜视频在线观看一区二区三区| 日韩天堂在线观看| 亚洲国产毛片完整版 | 久久精视频免费在线久久完整在线看| 在线综合+亚洲+欧美中文字幕| 欧美精品三级| 在线天堂一区av电影| 亚洲一区二区在线| 国产精品拍天天在线| 小黄鸭精品密入口导航| 免费不卡视频| 日韩一二三在线视频播| 亚洲美女av黄| 欧美一区二区高清| 亚洲免费在线观看视频| 久久亚洲捆绑美女| 久久综合色天天久久综合图片| 国产精品观看| 欧美亚洲日本国产| 欧美一级免费视频| 在线日韩欧美视频| 欧美激情成人在线视频| 美女国产精品| 久久婷婷丁香| 在线免费观看日韩欧美| 欧美一区视频| 久久久久久久综合日本| 亚洲国产一区在线| 欧美有码在线视频| 欧美精品v日韩精品v国产精品| 国产精品私房写真福利视频| 一区二区在线不卡| 免费观看久久久4p| 欧美日韩国产综合网| 久久久xxx| 欧美午夜精品一区| 亚洲精品免费在线播放| 国产美女诱惑一区二区| 亚洲精品一二三| 亚洲国产一区二区三区青草影视| 亚洲一二三四区| 欧美一区日韩一区| 欧美日韩一区二区三区在线视频 | 欧美日韩国产在线观看| 午夜精品一区二区在线观看 | 另类尿喷潮videofree| 国产精品chinese| 亚洲免费观看在线观看| 一本一道久久综合狠狠老精东影业 | 免费欧美日韩国产三级电影| 日韩午夜激情| 久久免费视频网| 亚洲欧美精品在线观看| 亚洲乱码日产精品bd| 性色av一区二区三区| 91久久精品视频|