日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转Win32开发(2):完整的开发流程

發(fā)布時間:2023/12/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转Win32开发(2):完整的开发流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?

上一篇中我給各位說了一般人認(rèn)為C++中較為難的東西——指針。其實對于C++,難點當(dāng)然不局限在指針這玩意兒上,還有一些有趣的概念,如模板類、虛基類、純虛函數(shù)等,這些都是概念性的東西,幾乎每一本C++書上都會介紹,而平時我們除了會接觸到純虛函數(shù)外,其他的不多用。純虛函數(shù),你可以認(rèn)為與C#中的抽象方法或接口中的方法類似,即只定義,不實現(xiàn)。好處就是多態(tài),發(fā)何處理,由派生類來決定。

在開始吹牛之前,我先推薦一套視頻教程,孫鑫老師的C++教程,共20課,我不是幫他老人家打廣告,而是因為孫老師講的課是我聽過的最好的課,我都看過4次了,我完全可以用他的視頻教程來復(fù)習(xí)C++的。

?

好了,F話說完了,下面我就扯一下編寫一個Win32應(yīng)用程序的大致流程,不管你的程序有多么復(fù)雜,多么變態(tài),其基本思路和流程是不變的。這就好比你寫書法的時候,特別是寫楷書,我不管你用的是歐體、顏體,還是柳體,你都得遵守“永字八法”基本規(guī)則。

那么,我們要編寫一個Win32應(yīng)用程序,要經(jīng)過哪幾個步驟呢?

你不妨想一想,你有一家工廠是生產(chǎn)女性服裝的,如果你要生產(chǎn)一批新式服裝(例如某種冬裝),你會有哪些流程?

首先,如果我們確定要做這么一款服式,我們要請設(shè)計師來把服裝設(shè)計好,然后打版,打版就是生成基本樣本,以后工人就按照這個樣本做就行了。

其次,注冊產(chǎn)品,向上級主管申報,登記后就轉(zhuǎn)入車間或下游加工企業(yè)開工。

再次,為了展示你的新產(chǎn)品的特色,你要舉辦一場服裝表演。

接著、持續(xù)更新,發(fā)現(xiàn)產(chǎn)品存在的問題,不斷改進(jìn)修正。

最后,推向市場。

我們開發(fā)Win32應(yīng)用程序也是遵守這樣的規(guī)范。不過,我想現(xiàn)在很少人用Win32在實際開發(fā)中,畢竟它的開發(fā)效率是相當(dāng)?shù)氐拖?#xff0c;所以,曾被某些人誤認(rèn)為只適用于開發(fā)木馬程序。其實,也不一定的,不要太邪惡了。

MFC對Win API函數(shù)的封裝,后來出現(xiàn)了托管C++,你可以用于寫WinForm程序,這樣可以提高開發(fā)效率。

如果你有足夠的時間,如果你還在學(xué)習(xí)編程,如果你是剛進(jìn)入大學(xué)的年輕有為者,你不用急,因為你會有更多的時間磨煉,你應(yīng)當(dāng)考慮多學(xué)一點C類語言,C++的學(xué)習(xí)你會發(fā)現(xiàn)你能學(xué)到很多其他語言中學(xué)不到的知識,特別是接觸到不少原理性的東西,能加深你對編程哲學(xué)的認(rèn)知。

?

一、WinMain入口點

我們在學(xué)習(xí)標(biāo)準(zhǔn)C++的時候,都知道每個應(yīng)用程序運(yùn)行時都會先進(jìn)入入口點函數(shù)main,而當(dāng)從main函數(shù)跳出時程序就結(jié)束了。在Windows編程里面,也是一樣的,只是我們的入口點函數(shù)不叫main,叫WinMain,這個函數(shù)不同于main,我們不能亂來,它的定義必須與聲明保持一致。

我建議各位安裝VS的時候,都順便更新幫助文檔到本地硬盤,這樣我們可以方便查找。有一點要注意,目前DestTop Develop的文檔基本上是英文的,做好心理準(zhǔn)備。

WinMain函數(shù)怎么寫呢,不用記的,到MSDN文檔一搜,直接復(fù)制就行了。

[cpp]?view plaincopyprint?
  • int?CALLBACK?WinMain(??
  • ????_In_??HINSTANCE?hInstance,??
  • ????_In_??HINSTANCE?hPrevInstance,??
  • ????_In_??LPSTR?lpCmdLine,??
  • ????_In_??int?nCmdShow??
  • ??);??

  • 這個函數(shù)帶了一個CALLBACK,說明它是一個回調(diào)函數(shù),那么這個CALLBACK是啥呢。我們先不管,我們先動寫一個Windows,讓大家有一個更直觀的認(rèn)識。

    1、啟動你的開發(fā)工具,版本任意。

    2、從菜單欄中依次【文件】【新建】【項目】,在新建項目窗口中,選擇Win32-Win32應(yīng)用程序。

    ?

    2、點擊確定后,會彈出一個向?qū)?#xff0c;單擊【下一步】。項目類型選擇Windows應(yīng)用程序,附加選項選擇空項目,我們要自己編寫實現(xiàn)代碼。

    ?

    3、單擊完成,項目創(chuàng)建成功。打開【解決方案資源管理器】,在“源文件”文件夾上右擊,從菜單中找到【添加】【新建項】,注意,是源文件,不要搞到頭文件去了。

    在新建項窗口中選C++代碼文件,.cpp后綴的,不要選錯了,選成頭文件,不然無法編譯,因為頭文件是不參與編譯的。文件名隨便。

    ?

    包含Windows.h頭文件,這個是最基本的。

    [cpp]?view plaincopyprint?
  • #include?<Windows.h>??

  • 然后是入口點,這個我們直接把MSDN的聲明Ctrl + C,然后Ctrl + V上去就行了。

    [cpp]?view plaincopyprint?
  • int?CALLBACK?WinMain(??
  • ????_In_??HINSTANCE?hInstance,??
  • ????_In_??HINSTANCE?hPrevInstance,??
  • ????_In_??LPSTR?lpCmdLine,??
  • ????_In_??int?nCmdShow??
  • ??)??
  • {??
  • ??
  • ????return?0;??
  • }??

  • WinMain返回整型,返回0就行了,其實是進(jìn)程的退出碼,一定要0,不要寫其他,因為0表示正常退出,其他值表示非正常退出。

    剛才我們提到這個函數(shù)帶了CALLBACK,那么,它是什么?很簡單,你回到IDE,在CALLBACK上右擊,選【轉(zhuǎn)到定義】,看看吧。

    我們看到它其實是一個宏,原型如下:

    [cpp]?view plaincopyprint?
  • #define?CALLBACK????__stdcall??
  • 這時候我們發(fā)現(xiàn)了,它其實就是__stdcall,那么這個__stdcall是什么呢?它是和__cdecl關(guān)鍵字對應(yīng)的,這些資料,你網(wǎng)上搜一下就有了,如果你覺得不好理解,你不妨這樣認(rèn)為,__stdcall是專門用來調(diào)用Win API 的,反正MSDN上也是這樣說的,它其實是遵循Pascal的語法調(diào)用標(biāo)準(zhǔn),相對應(yīng)地,__cdecl是C語言的調(diào)用風(fēng)格,這個也是編譯器選項。
    打開項目屬性,找到節(jié)點C/C++\高級,然后查看一下調(diào)用約定,我們看到默認(rèn)是選擇C風(fēng)格調(diào)用的,所以,WIN API 函數(shù)才用上關(guān)鍵字__stdcall,如果你實在不懂,也沒關(guān)系,這個東西一般不影響我們寫代碼,但屬性窗口中的編譯器選項不要亂改,改掉了可能會導(dǎo)致一些問題。

    ?

    那么CALLBACK有什么特別呢?一句話:函數(shù)不是我們調(diào)用的,但函數(shù)只定義了模型沒有具體處理,而代碼處理權(quán)在被調(diào)用者手里。怎么說呢,我們完全把它理解為.NET中的委托,我想這樣就好理解了,委托只聲明了方法的參數(shù)和返回值,并沒有具體處理代碼。

    WinMain是由系統(tǒng)調(diào)用的,而WinMain中的代碼如何寫,那操作系統(tǒng)就不管了。就好像我告訴你明天有聚會,一起去爬山,反正我是通知你了,至于去不去那是你決定了。

    接下來看看入口點函數(shù)的參數(shù)。

    注意,我們平時看到很多如HANDLE,HINSTANCE,HBRUSH,WPARAM。LPARAM,HICON,HWND等一大串?dāng)?shù)據(jù)類型,也許我們會說,怎么Windows開發(fā)有那么多數(shù)據(jù)類型。其實你錯了,人總是被眼睛所看到的東西欺騙,Win API 中根本沒有什么新的數(shù)據(jù)類型,全都是標(biāo)準(zhǔn)C++中的類型,說白了,這些東西全是數(shù)字來的。如果你不信,自己可以研究一下。

    它定義這些名字,只是方便使用罷了,比如下面這樣:

    [cpp]?view plaincopyprint?
  • int?hWindow;??
  • int?hIcon;??
  • int?theAppInstance;??
  • 第一個變量指的是窗口的句柄,第二個指的是一個圖標(biāo)的句柄,第三個是當(dāng)前應(yīng)用程序的實例句柄,你看看,如果我們所有的句柄都是int,我們就無法判斷那些類型是專門用來表示光標(biāo)資源,不知道哪些類型是專用來表示位圖的句柄了,但是,如果我們這樣:

    [cpp]?view plaincopyprint?
  • #defin?HBRUSH??int64??
  • 這樣就很直觀,我一看這名就知道是Brush Handlers,哦,我就明白它是專門用來管理內(nèi)存中的畫刷資源的,看,這就很明了,所以,通常這些新定義的類型或者宏,都是取有意義的名字。比如消息,它也是一個數(shù)字,如果我說115代表叫你去滾,但光是一個115誰知道你什么意思,但是,如果我們?yōu)樗x一個宏:

    [cpp]?view plaincopyprint?
  • #define?WM_GET_OUT????115??
  • 這樣,只要我SendMessage(hwnd, ?WM_GET_OUT, NULL, NULL),你就會收到一條消息,滾到一邊去。

    ?

    WinMain的第一個參數(shù)是當(dāng)前應(yīng)用程序的實例句柄,第二個參數(shù)是前一個實例,比如我把kill.exe運(yùn)行了兩個實例,進(jìn)程列表中會有兩個kill.exe,這時候第一次運(yùn)行的實例號假設(shè)為0001,就傳遞第一個參數(shù)hInstance,第二次運(yùn)行的假設(shè)實例號為0002,就傳給了hPrevInstance參數(shù)。

    lpCmdLine參數(shù)從名字上就猜到了,就是命令行參數(shù),那LPSTR是啥呢,它其實就是一個字符串,你可以跟入定義就知道了,它其實就是char*,指向char的指針,記得我上一篇文章中說的指針有創(chuàng)建數(shù)組的功能嗎?對,其實這里傳入的命令行參數(shù)應(yīng)該是char[ ],這就是我在第一篇文章中要說指針的原因。

    這里告訴大家一個技巧,我們怎么知道哪些參數(shù)是指針類型呢,因為不是所有參數(shù)都有 * 標(biāo)識。技巧還是在命名上,以后,只要我們看到P開頭的,或者LP開頭的,都是指針類型

    比如LPWSTR,LPCTSTR,LPRECT等等。

    最后一個參數(shù)nCmdShow是主窗口的顯示方式。它定義了以下宏。

    ?

    ValueMeaning
    SW_HIDE0

    Hides the window and activates another window.

    SW_MAXIMIZE3

    Maximizes the specified window.

    SW_MINIMIZE6

    Minimizes the specified window and activates the next top-level window in the Z order.

    SW_RESTORE9

    Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.

    SW_SHOW5

    Activates the window and displays it in its current size and position.

    SW_SHOWMAXIMIZED3

    Activates the window and displays it as a maximized window.

    SW_SHOWMINIMIZED2

    Activates the window and displays it as a minimized window.

    SW_SHOWMINNOACTIVE7

    Displays the window as a minimized window. This value is similar toSW_SHOWMINIMIZED, except the window is not activated.

    SW_SHOWNA8

    Displays the window in its current size and position. This value is similar toSW_SHOW, except the window is not activated.

    SW_SHOWNOACTIVATE4

    Displays a window in its most recent size and position. This value is similar toSW_SHOWNORMAL, except the window is not activated.

    SW_SHOWNORMAL1

    Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.

    ?


    這個參數(shù)是操作系統(tǒng)傳入的,我們無法修改它。那么,應(yīng)用程序在運(yùn)行時,是如何決定這個參數(shù)的呢?看看這個,不用我介紹了吧,你一定很熟悉。

    我們寫了WinMain,但我們還要在WinMain前面預(yù)先定義一個WindowProc函數(shù)。C++與C#,Java這些語言不同,你只需記住,C++編譯器的解析是從左到右,從上到下的,如果某函數(shù)要放到代碼后面來實現(xiàn),但在此之前要使用,那么你必須先聲明一下,不然編譯時會找不到。這里因為我們通常會把WindowProc實現(xiàn)放在WinMain之后,但是在WinMain中設(shè)計窗口類時要用到它的指針,這時候,我們必須在WinMain之前聲明WindowProc。

    同樣地,WindowProc的定義我們不用記,到MSDN直接抄就行了。

    [cpp]?view plaincopyprint?
  • #include?<Windows.h>??
  • //?必須要進(jìn)行前導(dǎo)聲明??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • );??
  • ??
  • int?CALLBACK?WinMain(??
  • ????_In_??HINSTANCE?hInstance,??
  • ????_In_??HINSTANCE?hPrevInstance,??
  • ????_In_??LPSTR?lpCmdLine,??
  • ????_In_??int?nCmdShow??
  • ??)??
  • {??
  • ????return?0;??
  • }??
  • //?在WinMain后實現(xiàn)??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • )??
  • {??
  • ????return?DefWindowProc(hwnd,?uMsg,?wParam,?lParam);??
  • }??

  • 前導(dǎo)聲明與后面實現(xiàn)的函數(shù)的簽名必須一致,編譯才會認(rèn)為它們是同一個函數(shù)。在WindowProc中返回DefWindowProc是把我們不感興趣或者沒有處理的消息交回給操作系統(tǒng)來處理。也許你會問,函數(shù)的名字一定要叫WindowProc嗎?當(dāng)然不是了,你可以改為其他名字,如MyProc,但前提是返回值和參數(shù)的類型以及個數(shù)必須一致。

    [cpp]?view plaincopyprint?
  • LRESULT?CALLBACK?MyProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • )??
  • 這個函數(shù)帶了CALLBACK,說明不是我們調(diào)用的,也是由操作系統(tǒng)調(diào)用的,我們在這個函數(shù)里面對需要處理的消息進(jìn)行響應(yīng)。至于,為什么可以改函數(shù)的名字而系統(tǒng)為什么能找到這個函數(shù)呢,后面你就知道了。

    ?

    二、設(shè)計與注冊窗口類

    設(shè)計窗口類,其實就是設(shè)計我們程序的主窗口,如有沒有標(biāo)題欄,背景什么顏色,有沒有邊框,可不可以調(diào)整大小等。要設(shè)計窗口類,我們用到一個結(jié)構(gòu)——

    [cpp]?view plaincopyprint?
  • typedef?struct?tagWNDCLASS?{??
  • ??UINT??????style;??
  • ??WNDPROC???lpfnWndProc;??
  • ??int???????cbClsExtra;??
  • ??int???????cbWndExtra;??
  • ??HINSTANCE?hInstance;??
  • ??HICON?????hIcon;??
  • ??HCURSOR???hCursor;??
  • ??HBRUSH????hbrBackground;??
  • ??LPCTSTR???lpszMenuName;??
  • ??LPCTSTR???lpszClassName;??
  • }?WNDCLASS,?*PWNDCLASS;??
  • 通常情況下,我們用WNDCLASS就可以了,當(dāng)然還有一個WNDCLASSEX的擴(kuò)展結(jié)構(gòu),在API里面,凡是看到EX結(jié)尾的都是擴(kuò)展的意思,比如CreateWindowEx就是CreateWindow的擴(kuò)展函數(shù)。

    第一個成員是窗口的類樣式,注意,不要和窗口樣式(WS_xxxxx)混淆了,這里指的是這個窗口類的特征,不是窗口的外觀特征,這兩個style是不一樣的。

    它的值可以參考MSDN,通常我們只需要兩個就可以了——CS_HREDRAW?|?CS_VREDRAW,從名字就看出來了,就是同時具備水平重畫和垂直重畫。因為當(dāng)我們的窗口顯示的時候,被其他窗口擋住后重新顯示,或者大小調(diào)整后,窗口都要發(fā)生繪制,就像我們在紙上涂鴉一樣,每次窗口的變化都會“粉刷”一遍,并發(fā)送WM_PAINT消息。

    lpfnWndProc參數(shù)就是用來設(shè)置你用哪個WindowProc來處理消息,前面我說過,我們只要不更改回調(diào)函數(shù)的返回值和參數(shù)的類型和順序,就可以隨意設(shè)置函數(shù)的名字,那為什么系統(tǒng)可以找到我們用的回調(diào)函數(shù)呢,對的,就是通過lpfnWndProc傳進(jìn)去的,它是一個函數(shù)指針,也就是它里面保存的是我們定義的WindowProc的入口地址,使用很簡單,我們只需要把函數(shù)的名字傳給它就可以了。

    cbClsExtra和cbWndExtra通常不需要,設(shè)為0就OK。hInstance是當(dāng)前應(yīng)用程序的實例句柄,從WinMain的hInstance參數(shù)中可以得到。hIcon和hCursor就不用我說了,看名字就知道了。

    hbrBackground是窗口的背景色,你也可以不設(shè)置,但在處理WM_PAINT消息時必須繪制窗口背景。也可以直接用系統(tǒng)定義的顏色,MSDN為我們列出這些值,大家不用記,直接到MSDN拿來用就行了,這些都比較好理解,看名字就知道了。

    • COLOR_ACTIVEBORDER
    • COLOR_ACTIVECAPTION
    • COLOR_APPWORKSPACE
    • COLOR_BACKGROUND
    • COLOR_BTNFACE
    • COLOR_BTNSHADOW
    • COLOR_BTNTEXT
    • COLOR_CAPTIONTEXT
    • COLOR_GRAYTEXT
    • COLOR_HIGHLIGHT
    • COLOR_HIGHLIGHTTEXT
    • COLOR_INACTIVEBORDER
    • COLOR_INACTIVECAPTION
    • COLOR_MENU
    • COLOR_MENUTEXT
    • COLOR_SCROLLBAR
    • COLOR_WINDOW???????????????????????????????????????? /*??這個就是窗口的默認(rèn)背景色? */
    • COLOR_WINDOWFRAME
    • COLOR_WINDOWTEXT

    lpszMenuName指的是菜單的ID,沒有菜單就NULL,lpszClassName就是我們要向系統(tǒng)注冊的類名,字符,不能與系統(tǒng)已存在的類名沖突,如“BUTTON”類。

    所以,在WinMain中設(shè)計窗口類。

    [cpp]?view plaincopyprint?
  • //?類名??
  • WCHAR*?cls_Name?=?L"My?Class";??
  • //?設(shè)計窗口類??
  • WNDCLASS?wc;??
  • wc.hbrBackground?=?(HBRUSH)COLOR_WINDOW;??
  • wc.lpfnWndProc?=?WindowProc;??
  • wc.lpszClassName?=?cls_Name;??
  • wc.hInstance?=?hInstance;??
  • 窗口類設(shè)計完成后,不要忘了向系統(tǒng)注冊,這樣系統(tǒng)才能知道有這個窗口類的存在。向操作系統(tǒng)注冊窗口類,使用RegisterClass函數(shù),它的參數(shù)就是一個指向WNDCLASS結(jié)構(gòu)體的指針,所以我們傳遞的時候,要加上&符號。

    [cpp]?view plaincopyprint?
  • //?注冊窗口類??
  • RegisterClass(&wc);??

  • ?

    三、創(chuàng)建和顯示窗口

    窗口類注冊完成后,就應(yīng)該創(chuàng)建窗口,然后顯示窗口,調(diào)用CreateWindow創(chuàng)建窗口,如果成功,會返回一個窗口的句柄,我們對這個窗口的操作都要用到這個句柄。什么是句柄呢?其實它就是一串?dāng)?shù)字,只是一個標(biāo)識而已,內(nèi)存中會存在各種資源,如圖標(biāo)、文本等,為了可以有效標(biāo)識這些資源,每一個資源都有其唯一的標(biāo)識符,這樣,通過查找標(biāo)識符,就可以知道某個資源存在于內(nèi)存中哪一塊地址中,就好比你出身的時候,長輩都要為你取個名字,你說名字用來干嗎?名字就是用來標(biāo)識你的,不然,你見到A叫小明,遇到B又叫小明,那誰知道哪個才是小明啊?就好像你上大學(xué)去報到號,會為你分配一個可以在本校學(xué)生中唯一標(biāo)識你的學(xué)號,所有學(xué)生的學(xué)號都是不同的,這樣,只要通過索引學(xué)號,就可以找到你的資料。

    CreateWindow函數(shù)返回一個HWND類型,它就是窗口類的句柄。

    [cpp]?view plaincopyprint?
  • //?創(chuàng)建窗口??
  • HWND?hwnd?=?CreateWindow(??
  • ????cls_Name,???????????//類名,要和剛才注冊的一致??
  • ????L"我的應(yīng)用程序",??????????//窗口標(biāo)題文字??
  • ????WS_OVERLAPPEDWINDOW,????????//窗口外觀樣式??
  • ????38,?????????????//窗口相對于父級的X坐標(biāo)??
  • ????20,?????????????//窗口相對于父級的Y坐標(biāo)??
  • ????480,????????????????//窗口的寬度??
  • ????250,????????????????//窗口的高度??
  • ????NULL,???????????????//沒有父窗口,為NULL??
  • ????NULL,???????????????//沒有菜單,為NULL??
  • ????hInstance,??????????//當(dāng)前應(yīng)用程序的實例句柄??
  • ????NULL);??????????????//沒有附加數(shù)據(jù),為NULL??
  • if(hwnd?==?NULL)????????????????//檢查窗口是否創(chuàng)建成功??
  • ????return?0;??

  • 窗外觀的樣式都是WS_打頭的,是Window Style的縮寫,這個我就不說了,MSDN上全有了。

    窗口創(chuàng)建后,就要顯示它,就像我們的產(chǎn)品做了,要向客戶展示。顯示窗口調(diào)用ShowWindow函數(shù)。

    [cpp]?view plaincopyprint?
  • //?顯示窗口??
  • ShowWindow(hwnd,?SW_SHOW);??
  • 既然要顯示窗口了,那么ShowWindow的第一個參數(shù)就是剛才創(chuàng)建的窗口的句柄,第二個參數(shù)控制窗口如何顯示,你可以從SW_XXXX中選一個,也可以用WinMain傳進(jìn)來的參數(shù),還記得WinMain的最后一個參數(shù)嗎?

    ?

    四、更新窗口(可選)

    為什么更新窗口這一步可有可無呢?因為只要程序在運(yùn)行著,只要不是最小化,只要窗口是可見的,那么,我們的應(yīng)用程序會不斷接收到WM_PAINT通知。這里先不說,后面你會明白的。好了,更新窗口,當(dāng)然是調(diào)用UpdateWindow函數(shù)。

    [cpp]?view plaincopyprint?
  • //?更新窗口??
  • UpdateWindow(hwnd);??

  • ?

    五、消息循環(huán)

    Windows操作系統(tǒng)是基于消息控制機(jī)制的,用戶與系統(tǒng)之間的交互,程序與系統(tǒng)之間的交互,都是通過發(fā)送和接收消息來完成的。就好像軍隊一樣,命令一旦傳達(dá),就要執(zhí)行,當(dāng)然,我們的應(yīng)用程序和軍隊不一樣,我們收到指令不一要執(zhí)行,我們是可以選擇性地執(zhí)行。

    我們知道,代碼是不斷往前執(zhí)行的,像我們剛才寫的WinMain函數(shù)一樣,如果你現(xiàn)在運(yùn)行程序,你會發(fā)現(xiàn)什么都沒有,是不是程序不能運(yùn)行呢,不是,其實程序是運(yùn)行了,只是它馬上結(jié)束了,只要程序執(zhí)行跳出了WinMain的右大括號,程序就會結(jié)束了。那么,要如何讓程序不結(jié)束了,可能大家注意到我們在C程序中可以用一個getchar()函數(shù)來等到用戶輸入,這樣程序就人停在那里,直到用戶輸入內(nèi)容。但我們的窗口應(yīng)用不能這樣做,因為用戶有可能進(jìn)行其他操作,如最小化窗口,移動窗口,改變窗口大小,或者點擊窗口上的按鈕等。因此,我們不能簡地弄一個getchar在那里,這樣就無法響應(yīng)用戶的其他操作了。

    可以讓程序留在某處不結(jié)束的另一個方法就是使用循環(huán),而且是死循環(huán),這樣程序才會永久地停在某個地方,但這個死循環(huán)必須具有跳出的條件,不然你的程序會永久執(zhí)行,直達(dá)停電或者把電腦砸了。

    這樣消息循環(huán)就出現(xiàn)了,只要有與用戶交互,系統(tǒng)人不斷地向應(yīng)用程序發(fā)送消息通知,因為這些消息是不定時不斷發(fā)送的,必須有一個綬沖區(qū)來存放,就好像你去銀行辦理手續(xù)要排隊一樣,我們從最前端取出一條一條消息處理,后面新發(fā)送的消息會一直在排隊,直到把所有消息處理完,這就是消息隊列

    要取出一條消息,調(diào)用GetMessage函數(shù)。函數(shù)會傳入一個MSG結(jié)構(gòu)體的指針,當(dāng)收到消息,會填充MSG結(jié)構(gòu)體中的成員變量,這樣我們就知道我們的應(yīng)用程序收到什么消息了,直到GetMessage函數(shù)取不到消息,條件不成立,循環(huán)跳出,這時應(yīng)用程序就退出。MSG的定義如下:

    [cpp]?view plaincopyprint?
  • typedef?struct?tagMSG?{??
  • ??HWND???hwnd;??
  • ??UINT???message;??
  • ??WPARAM?wParam;??
  • ??LPARAM?lParam;??
  • ??DWORD??time;??
  • ??POINT??pt;??
  • }?MSG,?*PMSG,?*LPMSG;??
  • hwnd不用說了,就是窗口句柄,哪個窗口的句柄?還記得WindowProc回調(diào)函數(shù)嗎?你把這個函數(shù)交給了誰來處理,hwnd就是誰的句柄,比如我們上面的代碼,我們是把WindowProc賦給了新注冊的窗口類,并創(chuàng)建了主窗口,返回一個表示主窗口的句柄,所以,這里MSG中的hwnd指的就是我們的主窗口。

    message就是我們接收到的消息,看到,它是一個數(shù)字,無符號整型,所以我們操作的所有消息都是數(shù)字來的。wParam和lParam是消息的附加參數(shù),其實也是數(shù)值來的。通常,lParam指示消息的處理結(jié)果,不同消息的結(jié)果(返回值)不同,具體可參閱MSDN。

    有了一個整型的值來表示消息,我們?yōu)槭裁催€需要附加參數(shù)呢?你不妨想一下,如果接收一條WM_LBUTTONDOWN消息,即鼠標(biāo)左鍵按下時發(fā)送的通知消息,那么,我們不僅知道左鍵按下這件事,我們更感趣的是,鼠標(biāo)在屏幕上的哪個坐標(biāo)處按下左鍵,按了幾下,這時候,你公憑一條WM_LBUTTONDOWN消息是無法傳遞這么多消息的。可能我們需要把按下左鍵時的坐標(biāo)放入wParam參數(shù)中;最典型的就是WM_COMMAND消息,因為只要你使用菜單,點擊按鈕都會發(fā)送這樣一條消息,那么我怎么知道用戶點了哪個按鈕呢?如果窗口中只有一個按鈕,那好辦,用戶肯定單擊了它,但是,如果窗口上有10個按鈕呢?而每一個按鈕被單擊都會發(fā)送WM_COMMAND消息,你能知道用戶點擊了哪個按鈕嗎?所以,我們要把用戶點擊了的那個按鈕的句柄存到lParam參數(shù)中,這樣一來,我們就可以判斷出用戶到底點擊了哪個按鈕了。

    GetMessage函數(shù)聲明如下:

    [cpp]?view plaincopyprint?
  • BOOL?WINAPI?GetMessage(??
  • ??_Out_?????LPMSG?lpMsg,??
  • ??_In_opt_??HWND?hWnd,??
  • ??_In_??????UINT?wMsgFilterMin,??
  • ??_In_??????UINT?wMsgFilterMax??
  • );??
  • 這個函數(shù)在定義時帶了一個WINAPI,現(xiàn)在,按照前面我說的方法,你應(yīng)該猜到,它就是一個宏,而真實的值是__stdcall,前文中說過了。

    第一個參數(shù)是以LP開頭,還記得嗎,我說過的,你應(yīng)該想到它就是 MSG* ,一個指向MSG結(jié)構(gòu)的指針。第二個參數(shù)是句柄,通常我們用NULL,因為我們會捕捉整個應(yīng)用程序的消息。后面兩個參數(shù)是用來過濾消息的,指定哪個范圍內(nèi)的消息我接收,在此范圍之外的消息我拒收,如果不過濾就全設(shè)為0.。返回值就不說了,自己看。

    [cpp]?view plaincopyprint?
  • //?消息循環(huán)??
  • MSG?msg;??
  • while(GetMessage(&msg,?NULL,?0,?0))??
  • {??
  • ????TranslateMessage(&msg);??
  • ????DispatchMessage(&msg);??
  • }??
  • TranslateMessage是用于轉(zhuǎn)換按鍵信息的,因為鍵盤按下和彈起會發(fā)送WM_KEYDOWN和WM_KEYUP消息,但如果我們只想知道用戶輸了哪些字符,這個函數(shù)可以把這些消息轉(zhuǎn)換為WM_CHAR消息,它表示的就是鍵盤按下的那個鍵的字符,如“A”,這樣我們處理起來就更方便了。

    DispatchMessage函數(shù)是必須調(diào)用的,它的功能就相當(dāng)于一根傳送帶,每收到一條消息,DispatchMessage函數(shù)負(fù)責(zé)把消息傳到WindowProc讓我們的代碼來處理,如果不調(diào)用這個函數(shù),我們定義的WindowProc就永遠(yuǎn)接收不到消息,你就不能做消息響應(yīng)了,你的程序就只能從運(yùn)行就開始死掉了,沒有響應(yīng)。


    ?

    六、消息響應(yīng)

    其實現(xiàn)在我們的應(yīng)用程序是可以運(yùn)行了,因為在WindowProc中我們調(diào)用了DefWindowProc,函數(shù),消息我們不作任何處理,又把控制權(quán)路由回到操作系統(tǒng)來默認(rèn)處理,所以,整個過程中,我們現(xiàn)在的消息循環(huán)是成立的,只不過我們不做任何響應(yīng)罷了。

    好的,現(xiàn)在我把完整的代碼貼一下,方便你把前面我們說的內(nèi)容串聯(lián)起來。

    [cpp]?view plaincopyprint?
  • #include?<Windows.h>??
  • //?必須要進(jìn)行前導(dǎo)聲明??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • );??
  • ??
  • //?程序入口點??
  • int?CALLBACK?WinMain(??
  • ????_In_??HINSTANCE?hInstance,??
  • ????_In_??HINSTANCE?hPrevInstance,??
  • ????_In_??LPSTR?lpCmdLine,??
  • ????_In_??int?nCmdShow??
  • ??)??
  • {??
  • ????//?類名??
  • ????WCHAR*?cls_Name?=?L"My?Class";??
  • ????//?設(shè)計窗口類??
  • ????WNDCLASS?wc;??
  • ????wc.hbrBackground?=?(HBRUSH)COLOR_WINDOW;??
  • ????wc.lpfnWndProc?=?WindowProc;??
  • ????wc.lpszClassName?=?cls_Name;??
  • ????wc.hInstance?=?hInstance;??
  • ????//?注冊窗口類??
  • ????RegisterClass(&wc);??
  • ??
  • ????//?創(chuàng)建窗口??
  • ????HWND?hwnd?=?CreateWindow(??
  • ????????cls_Name,???????????//類名,要和剛才注冊的一致??
  • ????????L"我的應(yīng)用程序",??//窗口標(biāo)題文字??
  • ????????WS_OVERLAPPEDWINDOW,?//窗口外觀樣式??
  • ????????38,?????????????//窗口相對于父級的X坐標(biāo)??
  • ????????20,?????????????//窗口相對于父級的Y坐標(biāo)??
  • ????????480,????????????????//窗口的寬度??
  • ????????250,????????????????//窗口的高度??
  • ????????NULL,???????????????//沒有父窗口,為NULL??
  • ????????NULL,???????????????//沒有菜單,為NULL??
  • ????????hInstance,??????????//當(dāng)前應(yīng)用程序的實例句柄??
  • ????????NULL);??????????????//沒有附加數(shù)據(jù),為NULL??
  • ????if(hwnd?==?NULL)?//檢查窗口是否創(chuàng)建成功??
  • ????????return?0;??
  • ??
  • ????//?顯示窗口??
  • ????ShowWindow(hwnd,?SW_SHOW);??
  • ??
  • ????//?更新窗口??
  • ????UpdateWindow(hwnd);??
  • ??
  • ????//?消息循環(huán)??
  • ????MSG?msg;??
  • ????while(GetMessage(&msg,?NULL,?0,?0))??
  • ????{??
  • ????????TranslateMessage(&msg);??
  • ????????DispatchMessage(&msg);??
  • ????}??
  • ????return?0;??
  • }??
  • //?在WinMain后實現(xiàn)??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • )??
  • {??
  • ????return?DefWindowProc(hwnd,?uMsg,?wParam,?lParam);??
  • }??

  • 所有代碼看上去貌似很正常,也遵守了流程,設(shè)計窗口類,注冊窗口類,創(chuàng)建窗口,顯示窗口,更新窗口,消息循環(huán)。是吧,這段代碼看上去毫無破綻,運(yùn)行應(yīng)該沒問題吧。好,如果你如此自信,那就試試吧。

    按下F5試試運(yùn)行。
    哈哈,結(jié)果會讓很多人失望,很多初學(xué)者就是這樣,一切看起來好像正常,于是有人開始罵VC是垃圾,是編譯器有bug,也有人開始想放棄了,媽的,這么難,不學(xué)了。人啊,總是這樣,老指責(zé)別人的問題,從不在自己身上找問題,是真的VC的bug嗎?

    我前面說了,這段代碼貌似很正常,呵呵,你看到問題在哪嗎?給你兩分鐘來找錯。我提示一下,這個程序沒有運(yùn)行是因為主窗口根本就沒有創(chuàng)建,因為我在代碼里面做了判斷,如果窗口順柄hwnd為NULL,就退出,現(xiàn)在程序一運(yùn)行就退出了,明顯是窗口創(chuàng)建失敗。

    …………

    好了,不用找了,很多人找不出來,尤其是許多初學(xué)者,不少人找了一遍又一遍,都說沒有錯誤,至少代碼提示沒說有錯,編譯運(yùn)行也沒報錯,所以不少人自信地說,代碼沒錯。

    其實你是對的,代碼確實沒有錯,而問題就出在WNDCLASS結(jié)構(gòu)上,認(rèn)真看一下MSDN上有關(guān)RegisterClass函數(shù)說明中的一句話,這句話很多人沒注意到,但它很關(guān)鍵。

    You must fill the structure with the appropriate class attributes before passing it to the function.

    現(xiàn)在你明白了吧,還不清楚?沒關(guān)系,看看我把代碼這樣改一下你就知道了。

    [cpp]?view plaincopyprint?
  • //?設(shè)計窗口類??
  • WNDCLASS?wc;??
  • wc.cbClsExtra?=?0;??
  • wc.cbWndExtra?=?0;??
  • wc.hCursor?=?LoadCursor(hInstance,?IDC_ARROW);;??
  • wc.hIcon?=?LoadIcon(hInstance,?IDI_APPLICATION);;??
  • wc.lpszMenuName?=?NULL;??
  • wc.style?=?CS_HREDRAW?|?CS_VREDRAW;??
  • wc.hbrBackground?=?(HBRUSH)COLOR_WINDOW;??
  • wc.lpfnWndProc?=?WindowProc;??
  • wc.lpszClassName?=?cls_Name;??
  • wc.hInstance?=?hInstance;??
  • 現(xiàn)在,你運(yùn)行一下,你一定能看到窗口。

    但現(xiàn)在你對窗口無法進(jìn)行操作,因為后續(xù)的代碼還沒完成。

    為什么現(xiàn)在又可以了呢?MSDN那句話的意思就是說我們在注冊窗口類之前必須填充WNDCLASS結(jié)構(gòu)體,何為填充,就是要為結(jié)構(gòu)的所有成員賦值,就算不需要你也要為它賦一個NULL或0,因為結(jié)構(gòu)在創(chuàng)建時沒有對成員進(jìn)行初始化,這就導(dǎo)致變量無法正確的分配內(nèi)存,最后注冊失敗。

    那么,如果一個結(jié)構(gòu)體成員很多,而我只需要用到其中三個,其他的也要初始化,是不是很麻煩,是的,除了為每個成員賦值,還有一種較簡單的方法,就是在聲明變量時給它賦一對大括號,里面放置結(jié)構(gòu)體的應(yīng)該分配內(nèi)存的大小,如:

    [cpp]?view plaincopyprint?
  • //?設(shè)計窗口類??
  • WNDCLASS?wc?=?{?sizeof(WNDCLASS)?};??
  • wc.hbrBackground?=?(HBRUSH)COLOR_WINDOW;??
  • wc.lpfnWndProc?=?WindowProc;??
  • wc.lpszClassName?=?cls_Name;??
  • wc.hInstance?=?hInstance;??
  • 這樣一來,我們也發(fā)現(xiàn),窗口也可以成功創(chuàng)建。

    我們還可以更簡單,直接把sizeof也去掉,在聲明變量時,直接賦一對空的大括號就行了,就如這樣。

    [cpp]?view plaincopyprint?
  • WNDCLASS?wc?=?{?};??
  • 這樣寫更簡單,窗口類同樣可以正常注冊。大括號代表的是代碼塊,這樣,結(jié)構(gòu)體有了一個初值,因此它會按照結(jié)構(gòu)體的大小分配了相應(yīng)的內(nèi)存。

    ?

    為什么會這樣呢?這里涉及到一個關(guān)于結(jié)構(gòu)體的一個很有趣的賦值方式。我們先放下我們這個例子,下面我寫一個簡單的例子,你就明白了。

    [cpp]?view plaincopyprint?
  • #include?<stdio.h>??
  • ?typedef?struct?rectStruct??
  • ?{??
  • ?????int?x;??
  • ?????int?y;??
  • ?????int?width;??
  • ?????int?height;??
  • ?}?RECT,?*PRECT;??
  • ??
  • ?void?main()??
  • ?{??
  • ?????RECT?rect?=?{?0,?0,?20,?30?};??
  • ?????printf("矩形的坐標(biāo)是:%d,?%d\n矩形的大小:%d?,?%d",?rect.x,?rect.y,?rect.width,?rect.height);??
  • ?????getchar();??
  • ?}??
  • 在本例中,我們定義了一個表示矩形的結(jié)構(gòu)體 RECT ,它有四個成員,分別橫坐標(biāo),縱坐標(biāo),寬度,高度,但是,我們在聲明和賦值中,我們只用了一對大括號,把每個成員的值,按照定義的順序依次寫到大括號中,即{ 0, 0, 20, 30?},x的值為0,y的值為0,width為20,height的值為30。

    也就是說,我們可以通過這種簡單的方法向結(jié)構(gòu)變量賦值,注意值的順序要和成員變量定義的順序相同。

    現(xiàn)在,回到我們的Windows程序來,我們明白了這種賦值方式,對于 WNDCLASS wc = {? } 就不難理解了,這樣雖然大括號里面是空的,其實它已經(jīng)把變量初始化了,都賦了默認(rèn)值,這樣一來,就可以正確分配內(nèi)存了。

    ?

    七、為什么不能退出

    通常情況下,當(dāng)我們的主窗口關(guān)閉后,應(yīng)用程序應(yīng)該退出(木馬程序除外),但是,我們剛才運(yùn)行后發(fā)現(xiàn),為什么我的窗口關(guān)了,但程序不退出呢?前面我說了,要退出程序,就要先跳出消息循環(huán),和關(guān)閉哪個窗口無關(guān)。因此,我們要解決兩個問題:

    1、如果跳出消息循環(huán);

    2、什么時候退出程序。

    其實兩個問題是可以合并到一起解決。

    首先要知道,當(dāng)窗口被關(guān)閉,為窗口所分配的內(nèi)存會被銷毀,同時,我們會收到一條WM_DESTROY消息,因而,我們只要在收到這條消息時調(diào)用PostQuitMessage函數(shù),這個函數(shù)提交一條WM_QUIT消息,而在消息循環(huán)中,WM_QUIT消息使GetMessage函數(shù)返回0,這樣一來,GetMessage返回FALSE,就可以跳出消息循環(huán)了,這樣應(yīng)用程序就可以退出了。

    所以,我們要做的就是捕捉WM_DESTROY消息,然后PostQuitMessage.

    [cpp]?view plaincopyprint?
  • //?在WinMain后實現(xiàn)??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • )??
  • {??
  • ????switch(uMsg)??
  • ????{??
  • ????case?WM_DESTROY:??
  • ????????{??
  • ????????????PostQuitMessage(0);??
  • ????????????return?0;??
  • ????????}??
  • ????}??
  • ????return?DefWindowProc(hwnd,?uMsg,?wParam,?lParam);??
  • }??

  • 我們會收到很多消息,所以用switch判斷一下是不是WM_DESTROY消息,如果是,退出應(yīng)用程序。

    好了,這樣,我們一個完整的Windows應(yīng)用程序就做好了。

    下面是完整的代碼清單。

    [cpp]?view plaincopyprint?
  • #include?<Windows.h>??
  • //?必須要進(jìn)行前導(dǎo)聲明??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • );??
  • ??
  • //?程序入口點??
  • int?CALLBACK?WinMain(??
  • ????_In_??HINSTANCE?hInstance,??
  • ????_In_??HINSTANCE?hPrevInstance,??
  • ????_In_??LPSTR?lpCmdLine,??
  • ????_In_??int?nCmdShow??
  • ??)??
  • {??
  • ????//?類名??
  • ????WCHAR*?cls_Name?=?L"My?Class";??
  • ????//?設(shè)計窗口類??
  • ????WNDCLASS?wc?=?{?};??
  • ????wc.hbrBackground?=?(HBRUSH)COLOR_WINDOW;??
  • ????wc.lpfnWndProc?=?WindowProc;??
  • ????wc.lpszClassName?=?cls_Name;??
  • ????wc.hInstance?=?hInstance;??
  • ????//?注冊窗口類??
  • ????RegisterClass(&wc);??
  • ??
  • ????//?創(chuàng)建窗口??
  • ????HWND?hwnd?=?CreateWindow(??
  • ????????cls_Name,???????????//類名,要和剛才注冊的一致??
  • ????????L"我的應(yīng)用程序",??//窗口標(biāo)題文字??
  • ????????WS_OVERLAPPEDWINDOW,?//窗口外觀樣式??
  • ????????38,?????????????????//窗口相對于父級的X坐標(biāo)??
  • ????????20,?????????????????//窗口相對于父級的Y坐標(biāo)??
  • ????????480,????????????????//窗口的寬度??
  • ????????250,????????????????//窗口的高度??
  • ????????NULL,???????????????//沒有父窗口,為NULL??
  • ????????NULL,???????????????//沒有菜單,為NULL??
  • ????????hInstance,??????????//當(dāng)前應(yīng)用程序的實例句柄??
  • ????????NULL);??????????????//沒有附加數(shù)據(jù),為NULL??
  • ????if(hwnd?==?NULL)?//檢查窗口是否創(chuàng)建成功??
  • ????????return?0;??
  • ??
  • ????//?顯示窗口??
  • ????ShowWindow(hwnd,?SW_SHOW);??
  • ??
  • ????//?更新窗口??
  • ????UpdateWindow(hwnd);??
  • ??
  • ????//?消息循環(huán)??
  • ????MSG?msg;??
  • ????while(GetMessage(&msg,?NULL,?0,?0))??
  • ????{??
  • ????????TranslateMessage(&msg);??
  • ????????DispatchMessage(&msg);??
  • ????}??
  • ????return?0;??
  • }??
  • //?在WinMain后實現(xiàn)??
  • LRESULT?CALLBACK?WindowProc(??
  • ????_In_??HWND?hwnd,??
  • ????_In_??UINT?uMsg,??
  • ????_In_??WPARAM?wParam,??
  • ????_In_??LPARAM?lParam??
  • )??
  • {??
  • ????switch(uMsg)??
  • ????{??
  • ????case?WM_DESTROY:??
  • ????????{??
  • ????????????PostQuitMessage(0);??
  • ????????????return?0;??
  • ????????}??
  • ????}??
  • ????return?DefWindowProc(hwnd,?uMsg,?wParam,?lParam);??
  • } ?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/lvdongjie/p/4502532.html

    總結(jié)

    以上是生活随笔為你收集整理的玩转Win32开发(2):完整的开发流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    色综合久久中文综合久久牛 | 久久都是精品 | 国产视频亚洲视频 | 97超碰色 | 91av资源网 | 精品国产免费av | japanesexxxxfreehd乱熟 | 免费av试看 | 欧美激精品 | 久久欧美在线电影 | 一本到视频在线观看 | 欧美亚洲久久 | 亚洲第一区精品 | 激情av在线资源 | 草久草久| 草久中文字幕 | 91亚洲精品久久久蜜桃网站 | 国产女教师精品久久av | 国产精品婷婷 | 美女黄网久久 | 国产精品淫片 | 成人av亚洲| 国产精品永久免费 | 免费看片网址 | 黄色三级在线看 | av免费看在线 | 久久免费视频在线观看 | 日韩精品一区二 | 九九精品毛片 | 国产真实在线 | 日韩精品不卡在线观看 | 亚洲精品乱码久久久久v最新版 | 午夜视频色| 中文字幕av有码 | 一本到在线 | 丁香 久久 综合 | 日韩大片免费观看 | 日韩在线观看一区 | 激情视频一区二区 | 日本精品视频免费 | 婷婷丁香六月天 | 久久久国产一区二区三区 | www色网站| 国产精品私人影院 | 色婷婷成人网 | 欧美激情视频久久 | 欧美一区二区三区四区夜夜大片 | 免费看的黄色 | 免费男女羞羞的视频网站中文字幕 | 99视频在线免费播放 | 一区中文字幕电影 | av超碰在线| 成人在线免费av | 人成免费网站 | 成年人精品| 国产裸体bbb视频 | 亚洲精品美女久久 | 在线a人v观看视频 | 97超视频 | 国产精品久久久久久久久久了 | 中文字幕在线观看2018 | 国产精品白丝jk白祙 | 国产一区二区在线观看视频 | 麻豆成人在线观看 | 一区在线免费观看 | 亚洲精品一区二区三区高潮 | 欧美国产日韩一区二区 | 精品字幕在线 | 91av在线免费| 中文字幕一区二区三区四区 | 免费在线观看不卡av | 久久女教师 | 午夜美女网站 | 九九热在线观看视频 | 免费在线成人av | 成人黄色电影视频 | 国产福利精品一区二区 | 国产精品伦一区二区三区视频 | 日韩久久在线 | 狠狠ri | 国产91粉嫩白浆在线观看 | 日韩午夜在线播放 | 97电影在线观看 | 2023年中文无字幕文字 | 久久久精品国产免费观看同学 | 狠狠干夜夜爽 | 五月天婷亚洲天综合网精品偷 | 一区二区精品国产 | 日日夜夜精品视频天天综合网 | 欧美韩国日本在线 | 久久免费黄色大片 | 97天天综合网 | a v在线视频 | 精品国产一区二区三区久久久 | 99热这里精品 | 狠狠狠狠狠狠干 | 久久私人影院 | 在线日本看片免费人成视久网 | 久久精品日本啪啪涩涩 | 最近2019年日本中文免费字幕 | 久久综合色天天久久综合图片 | 亚洲经典视频 | 日本精品中文字幕在线观看 | 日日干夜夜骑 | 超碰人人超 | 国产精品久久久 | 一区二区三区在线视频111 | 在线亚洲观看 | 黄色三级在线观看 | 久草国产在线观看 | 国产裸体无遮挡 | 国产一二区在线观看 | 欧美乱码精品一区二区 | 欧美日韩国产免费视频 | 黄色成人av | 99色免费| 欧美黄污视频 | 久久久资源 | 在线a人v观看视频 | 日韩在线高清 | 激情自拍av | 久久av电影| 97成人免费 | 国产精品成人一区二区三区吃奶 | 国产99久久精品一区二区永久免费 | 麻豆视频一区二区 | www色com | 国产精品久久久久久久久久直播 | 一区二区三区免费 | 亚洲妇女av| www91在线观看| 99色精品视频 | 国产福利在线免费 | 久久经典国产视频 | 久久国产精品99精国产 | 久久精品一二区 | 日韩av资源在线观看 | 国产在线观看中文字幕 | 日日婷婷夜日日天干 | 国产精品久久久 | 99在线观看免费视频精品观看 | 日韩精品免费在线视频 | 成人午夜精品福利免费 | 超碰97.com | 在线看v片成人 | 91精品国产麻豆国产自产影视 | 久久成年人 | 国产理论片在线观看 | 午夜久久视频 | 色香蕉视频 | 精品在线观看一区二区三区 | 国产视频999 | 国产日韩视频在线 | 成年人网站免费观看 | 精品在线你懂的 | 日韩激情久久 | 国产成人三级在线 | 婷婷九月激情 | 国产最新视频在线 | 免费观看午夜视频 | 国产精品毛片一区二区三区 | 国产aaa毛片 | 91免费网址 | 久久99久久99精品免观看软件 | 亚洲免费激情 | 国产九九精品视频 | 久久久久久久免费观看 | 国产精品一区二区av日韩在线 | 91大神精品视频 | 超碰在线公开免费 | 成人毛片一区 | 日狠狠| 日日夜夜草 | 亚洲天堂视频在线 | 国产午夜小视频 | 亚洲精品www.| 国产精品视频地址 | 国产一级二级在线观看 | a级国产乱理伦片在线播放 久久久久国产精品一区 | jizz999| 夜夜躁狠狠燥 | 99精品视频一区二区 | 久草在线看片 | 日韩欧美在线视频一区二区三区 | 欧美一性一交一乱 | 天天天天天天天操 | 国产h在线播放 | 91麻豆网站 | 亚洲专区中文字幕 | 久久字幕精品一区 | av中文字幕在线免费观看 | 久久毛片视频 | 国产男女免费完整视频 | 69国产盗摄一区二区三区五区 | 在线导航福利 | 日本高清dvd | 日韩在线一二三区 | 久久婷综合 | 欧美日韩国产精品一区二区 | 日韩激情中文字幕 | 国产精品视频免费在线观看 | 日韩在线播放av | 中文字幕久久精品一区 | 亚洲美女精品视频 | 中文字幕色婷婷在线视频 | 在线香蕉视频 | 麻豆视频免费播放 | 波多野结衣在线视频免费观看 | www.99热精品 | 人人爽人人爽人人爽学生一级 | 精品视频在线观看 | 国产特级毛片 | 天天爽天天摸 | 日韩视频在线一区 | 视频一区二区在线 | 999久久久免费视频 午夜国产在线观看 | 久久九九网站 | 国产精品久久久久婷婷二区次 | 丁香花中文字幕 | 亚洲一区二区三区在线看 | 亚洲综合涩 | v片在线播放| 黄网站污 | 久久久久综合精品福利啪啪 | 国产热re99久久6国产精品 | 久久综合成人 | 欧美人人 | 天天做天天爱夜夜爽 | 夜夜躁天天躁很躁波 | 国产vs久久 | 国产尤物视频在线 | 日韩在线不卡视频 | 91视频专区| 日韩久久精品一区二区 | 日韩免费在线视频观看 | 天天天干天天射天天天操 | 国内精品亚洲 | 成人观看视频 | 激情五月在线视频 | 99人久久精品视频最新地址 | 久久综合中文字幕 | 91九色蝌蚪视频网站 | 97超碰.com| a色视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 色综合中文字幕 | 一区二区三区日韩精品 | 国产成人三级一区二区在线观看一 | 免费在线观看日韩 | 天堂激情网 | 韩国一区二区三区在线观看 | 婷婷丁香色综合狠狠色 | 久久99精品国产麻豆宅宅 | 麻豆91在线观看 | 91精品视频网站 | 91福利视频免费 | 中文字幕免费高 | 久久久99精品免费观看乱色 | 91在线在线观看 | 午夜影院在线观看18 | 欧美婷婷综合 | 亚洲精品久久久久久久蜜桃 | 国产成人在线播放 | 欧美一区二区三区在线播放 | 日韩中文字幕a | 国产理论片在线观看 | 五月精品 | 日韩欧美在线一区二区 | 国产在线播放一区二区三区 | 国产精品自产拍在线观看中文 | 婷婷精品国产一区二区三区日韩 | 女人18毛片a级毛片一区二区 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产精品99久久久久 | 国产视频日本 | 欧美在线资源 | 欧美日韩xxxxx | 久久手机精品视频 | 国产精品无av码在线观看 | 免费h视频 | 亚洲欧美激情精品一区二区 | 91久久影院 | 免费在线观看av网站 | 国产黄色av | 丁香综合五月 | 亚洲综合在线观看视频 | 国内外成人在线 | 爱爱av网站| 久操伊人 | 91av视屏| 天天爽人人爽 | 免费在线观看成人小视频 | 久久久久国产精品免费网站 | 久久精品爱爱视频 | 久久免费电影网 | 波多野结衣一区二区三区中文字幕 | 国产精品自产拍在线观看蜜 | 成人精品久久久 | 4438全国亚洲精品在线观看视频 | 国产 成人 久久 | 一区二区激情视频 | 蜜臀av网址 | 最近中文字幕免费 | 91成人在线网站 | 国产精品成人久久 | 97久久精品午夜一区二区 | 久久在线观看 | 欧美精品一区二区蜜臀亚洲 | 欧美性受极品xxxx喷水 | 久久66热这里只有精品 | 亚洲专区中文字幕 | 日本精品久久久久中文字幕5 | 免费一级片在线观看 | 五月天激情视频在线观看 | 天天天天综合 | 国产视频一二区 | 一区二精品 | 国产在线久草 | 在线日本v二区不卡 | 国产精品久久久久久吹潮天美传媒 | 毛片网站在线 | 亚洲二区精品 | 狠狠色狠狠色 | 中文字幕在线影院 | 久久免费视频7 | 国产午夜三级 | 麻豆手机在线 | 久久99精品视频 | 亚洲国产日韩av | 精品视频在线免费 | 日韩伦理片一区二区三区 | 国产午夜免费视频 | 97av在线| 91网站在线视频 | 国产在线观看不卡 | 综合亚洲视频 | 日日骑 | 日本少妇高清做爰视频 | 美女露久久| 色综合五月 | 免费看成年人 | 天天色官网 | 国产精品免费久久久久影院仙踪林 | 爱色av.com| 人人精品久久 | 免费日韩一区二区 | 色婷婷成人网 | 日韩av午夜在线观看 | 国产精品福利在线播放 | jizzjizzjizz亚洲 | 久久久高清一区二区三区 | 国产精品一区二区久久精品爱涩 | 在线小视频 | 久久草草热国产精品直播 | 国产最新视频在线观看 | 国产美女精品人人做人人爽 | 美女免费视频一区 | 天天做天天爱天天综合网 | 国产精品久久99综合免费观看尤物 | 国产三级午夜理伦三级 | 国产成人一区三区 | 国产高清在线永久 | 91精品国产高清自在线观看 | 亚洲综合小说电影qvod | 欧美极品久久 | 久久黄色小说 | av导航福利 | 天天视频亚洲 | 黄色小说在线免费观看 | 国产精品不卡在线播放 | 国产精华国产精品 | 最新日韩精品 | 一区二区三区手机在线观看 | 中文字幕在线观看你懂的 | 免费看毛片在线 | 精品伊人久久久 | 人人揉人人揉人人揉人人揉97 | 黄色小网站免费看 | 国产精品18久久久久久不卡孕妇 | 人人澡人人模 | 在线观看完整版免费 | 国产精品资源在线 | 日韩高清不卡一区二区三区 | 国产精品久久久久一区二区 | 久久一区国产 | 五月婷亚洲 | 成人h在线播放 | 伊人成人久久 | 国产在线观看污片 | 日本二区三区在线 | 成人影音av | 91精品国产综合久久福利 | 草免费视频 | av资源免费看 | 国产精品视频免费 | 天天艹| 欧美看片 | 免费看亚洲毛片 | 97国产情侣爱久久免费观看 | 精品久久1| av网站免费线看精品 | 伊人久久婷婷 | 亚洲精品女人 | 亚洲国内精品在线 | 人人爽人人澡人人添人人人人 | 九九九热精品免费视频观看 | 久久96国产精品久久99漫画 | 久久精品第一页 | 日韩精品欧美专区 | 国产手机在线观看视频 | 日韩欧美精品一区二区三区经典 | 一区二区三区在线观看免费视频 | 免费电影一区二区三区 | 国产精品二区三区 | 天堂av网站 | 欧美日韩视频精品 | 激情综合五月 | 精品免费在线视频 | 婷婷色吧 | 国产在线97| 久久精品视频国产 | 最新国产精品亚洲 | 成人欧美一区二区三区黑人麻豆 | 欧美一区二区伦理片 | 日韩av黄 | 国产精品久久久久av福利动漫 | 特级片免费看 | 日韩一区二区三区高清免费看看 | 97国产大学生情侣酒店的特点 | 日本在线视频网址 | 午夜免费电影院 | 婷婷av网站| av免费看av | 日韩视频1区 | 五月婷婷一区二区三区 | 日韩视频三区 | 成人a视频片观看免费 | 美国人与动物xxxx | 亚洲国产网站 | 国产成人av电影在线观看 | 首页国产精品 | 天天色天天操天天爽 | 国产精品久久久久久久久久直播 | 国产精品mv在线观看 | 人人干人人添 | 天天综合五月天 | 青青草国产在线 | 99精品免费 | 美女视频黄网站 | 97狠狠操 | 欧美久久99 | 久久夜色精品国产欧美一区麻豆 | 亚洲久久视频 | 国际精品久久 | 国产系列 在线观看 | 欧美精品中文在线免费观看 | 天天操天天操天天操天天操天天操天天操 | 欧美日韩在线视频一区 | 天天操天天曰 | 久久av在线播放 | 中文字幕一区二区三区四区 | 91精品国产九九九久久久亚洲 | 激情综合网在线观看 | 色a4yy| 免费看国产一级片 | 麻豆手机在线 | 国产成人一区二区三区久久精品 | 国际精品久久久久 | 国产亚洲精品久久久久久网站 | 久久综合狠狠综合久久综合88 | 五月婷婷丁香在线观看 | 一区二区三区四区五区六区 | 久久男女视频 | 久久精品这里都是精品 | 久久国产精品二国产精品中国洋人 | 91大神免费在线观看 | av片子在线观看 | 国产手机在线 | 国产高清一 | 色狠狠综合天天综合综合 | 亚洲精品午夜aaa久久久 | 国产日韩一区在线 | 亚洲国产精久久久久久久 | 在线蜜桃视频 | 久久久久一区 | 久久精品视频在线看 | 不卡的av在线播放 | 亚洲精品久久久久久国 | 激情电影在线观看 | 91福利视频久久久久 | 麻豆视频免费在线播放 | 成人小视频在线免费观看 | 毛片网站观看 | 中文字幕精品三级久久久 | 天海冀一区二区三区 | 亚洲性xxxx | 不卡av免费在线观看 | 黄色大全免费观看 | 三上悠亚一区二区在线观看 | 在线一级片 | 成人毛片在线观看视频 | 国产视频观看 | 欧美有色 | 99999精品| 五月天免费网站 | a√国产免费a | 国产毛片久久久 | 欧美日产在线观看 | av线上免费看 | 丁香电影小说免费视频观看 | 久久久免费播放 | 免费看的黄色小视频 | 在线观看黄色av | 日本成人免费在线观看 | 久久视频6| 综合久久一本 | 国产精品手机视频 | 激情五月av| 91成人精品国产刺激国语对白 | 国产资源在线免费观看 | 欧美性生活久久 | 中文字幕123区 | 国产资源网站 | 亚洲国产日韩在线 | 黄色av成人在线 | 黄色av电影网 | 久久不卡日韩美女 | 日韩欧美在线观看 | 国产精品麻豆视频 | 麻豆精品在线 | 99精品国产免费久久 | 亚洲开心激情 | 一区二区三区精品在线视频 | 中文字幕在线观看1 | 国产理论在线 | 亚洲精品福利在线 | 夜夜夜| 色中色资源站 | 黄色精品一区二区 | 最新色站 | 91免费在线播放 | 日韩电影久久久 | 国产99久久九九精品免费 | 国产主播大尺度精品福利免费 | 在线中文字幕av观看 | 二区三区在线观看 | 中文字幕成人一区 | 人人看人人艹 | 久久伦理影院 | 在线观看色视频 | 日韩欧美视频一区二区三区 | 五月天久久久 | 亚洲男男gaygay无套同网址 | 久久久久国产精品午夜一区 | 91日韩在线视频 | 美女免费视频观看网站 | 视频二区在线视频 | 国产精品久久久久久爽爽爽 | 一区二区激情视频 | 亚洲黄色激情小说 | 亚洲精品午夜久久久久久久久久久 | 中文字幕免费高清在线观看 | 国产亚洲精品久久久久久大师 | 免费在线观看av网站 | 97操碰| 在线免费看黄色 | 久久久久欧美精品 | 四虎永久网站 | 色婷婷av国产精品 | 午夜黄色| 亚洲aaa级| 国产91电影在线观看 | 久久午夜免费观看 | 中文字幕有码在线播放 | а天堂中文最新一区二区三区 | 欧美二区视频 | 成人黄色免费在线观看 | 日韩欧美在线视频一区二区三区 | 中文字幕精品在线 | 免费开视频| 亚洲国产大片 | 手机看片国产日韩 | 好看的国产精品视频 | 六月婷婷久香在线视频 | 亚洲精品av中文字幕在线在线 | 久久狠狠一本精品综合网 | 综合网中文字幕 | 成人久久免费视频 | 欧美a√在线 | 色先锋av资源中文字幕 | 国产一区二区三区在线免费观看 | 一本色道久久综合亚洲二区三区 | 天天干天天操天天射 | 亚洲欧洲av| 国产区在线 | 黄影院| 免费黄色特级片 | 久久久久黄 | 天天干夜夜夜操天 | 国产99久久精品一区二区300 | 精品国产一区二区三区在线观看 | 日韩电影在线看 | 香蕉视频一级 | 亚洲精品乱码久久久久 | 97人人网| 国内外激情视频 | 青青河边草免费观看完整版高清 | 国产精品12345 | 狠狠色狠狠色终合网 | 蜜桃久久久 | 黄污网站在线观看 | 日本一区二区三区免费观看 | 亚洲一区不卡视频 | 韩日电影在线观看 | 亚洲欧美精品一区 | 亚洲精品高清视频 | 中文字幕成人 | 国产精品18p| 91麻豆精品国产 | 久久综合亚洲鲁鲁五月久久 | 久久久成人精品 | 色福利网 | 国产高清久久久久 | 日韩精品视频免费在线观看 | 欧美日韩免费一区二区 | 国产麻豆视频在线观看 | 日韩电影一区二区在线 | 亚洲五月婷婷 | 黄色在线观看免费网站 | 国产高清专区 | 国产精品一区二区久久精品爱涩 | 日韩精品一区二区三区免费观看 | 99c视频在线 | 中文字幕美女免费在线 | 一区二区三区四区五区六区 | 美女免费电影 | 成年人在线免费看 | 久久人人爽人人片 | 日韩精品国产一区 | 日韩毛片在线播放 | 九九色在线观看 | 人人插人人草 | 日日操狠狠干 | 国产精品手机在线观看 | 日韩免费在线视频观看 | 中文字幕在线播放视频 | 国产精品成人久久 | 国产精品欧美一区二区三区不卡 | 日韩av在线影视 | 日日操日日 | 欧洲亚洲精品 | 国产一区视频在线观看免费 | 欧美久久久久久久 | 天天操欧美 | 久久久影院官网 | 国产中文字幕在线视频 | 久久久夜色 | 日韩精品一区在线播放 | 亚洲精品一区二区三区在线观看 | 欧美午夜剧场 | 国产精品成人av在线 | 亚洲aⅴ一区二区三区 | 久久91久久久久麻豆精品 | av噜噜噜在线播放 | 日韩欧美网站 | 久久久久激情电影 | 日韩大片在线免费观看 | 五月天开心 | 日黄网站| 国产精品久久久久久a | 婷婷久久精品 | 色在线免费视频 | 日韩av电影中文字幕 | 在线观看免费高清视频大全追剧 | 色综合天天综合 | 久久亚洲二区 | 1024手机看片国产 | 四虎成人精品永久免费av九九 | 日韩一区在线免费观看 | 国产精品一码二码三码在线 | 国产成人精品一区二区三区网站观看 | 亚洲国产美女久久久久 | 久久国产精品久久国产精品 | 国产午夜精品福利视频 | 99精品视频免费看 | 中文字幕在线播放一区二区 | 久久激情网站 | 国产a级片免费观看 | 国产成人av网址 | 日韩欧美国产视频 | 国产高清视频在线免费观看 | 午夜av免费在线观看 | 99热精品在线| 国产日韩精品一区二区在线观看播放 | 久久九九国产视频 | 亚洲精品乱码久久久久久久久久 | 亚洲精品一区二区三区在线观看 | 日韩电影在线观看一区二区三区 | 97超级碰碰碰碰久久久久 | 成人免费观看网站 | 91欧美国产| 婷婷射五月 | 久草视频免费播放 | 91精品久久久久久综合乱菊 | 中文字幕专区高清在线观看 | 久草在线官网 | av先锋中文字幕 | a在线免费 | 91系列在线| 亚洲一区二区视频 | 伊人丁香 | 精品久久一 | 91天天视频| 天天色图 | 碰超在线| 久久xx视频| 在线观看免费av网站 | 少妇bbr搡bbb搡bbb | 欧美精品一区二区免费 | 在线国产一区 | 日本系列中文字幕 | 国产精品九九视频 | 麻豆免费精品视频 | 福利区在线观看 | 丁香久久五月 | 中文字幕在线观 | 国产精品久久久久婷婷二区次 | 久草综合在线 | 西西人体4444www高清视频 | 黄色一二级片 | 一区二区三区免费在线观看视频 | 欧美日韩中文国产一区发布 | 国产精品久久久久久久久大全 | 久色 网 | 69国产精品视频免费观看 | 中文字幕中文字幕在线中文字幕三区 | 五月婷婷在线观看 | 中文字幕亚洲欧美日韩2019 | 在线亚洲成人 | 99精品视频在线看 | 国产精品久久久久久久久久久久久久 | 日韩高清无线码2023 | 国产精品人人做人人爽人人添 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲精品tv久久久久久久久久 | 在线观看色视频 | 久久专区| 久久乱码卡一卡2卡三卡四 五月婷婷久 | 精品视频在线免费观看 | 成人午夜免费剧场 | 成人午夜电影免费在线观看 | 亚洲精品五月 | 日三级在线 | 免费进去里的视频 | 深爱五月激情五月 | www.99av| 激情婷婷综合 | 欧美日视频 | 欧美日韩久久不卡 | 国产一区av在线 | 国产精品爽爽久久久久久蜜臀 | 综合久久久久久久久 | 日韩一三区 | av大全在线看 | 国内精品久久久久久久久 | 日韩在线中文字幕视频 | 久久久久久久久毛片精品 | 波多野结衣在线视频一区 | 国产日韩精品一区二区三区 | 欧美日韩国产综合一区二区 | 国产一级高清 | 九九免费精品视频在线观看 | 97超碰免费在线观看 | 日韩午夜大片 | 日韩手机在线观看 | 久久神马影院 | 亚洲人天堂 | 成人观看| 香蕉视频在线播放 | 亚洲电影黄色 | 亚洲一区二区三区四区精品 | 91视频3p| 日本中文字幕网 | 亚洲视频www | 久久人人97超碰国产公开结果 | 国产精品久久久久久久久婷婷 | 美女国产精品 | 一级a毛片高清视频 | 中文字幕精品一区二区三区电影 | 99视频久久 | 顶级欧美色妇4khd | 欧美成人tv | 丝袜美女视频网站 | 激情综合久久 | 97精品在线观看 | 久久久久久久久久久网站 | 久久手机精品视频 | 国产美腿白丝袜足在线av | 久久国产成人午夜av影院宅 | 中文字幕在线观看91 | 国产手机在线精品 | 国产亚洲精品久久久网站好莱 | 亚洲精品国精品久久99热 | 精品999久久久 | 女人18毛片a级毛片一区二区 | 日韩精品在线播放 | 99久久综合国产精品二区 | 日韩精品一区二区三区第95 | 久久五月婷婷丁香社区 | 国产一二区在线观看 | 久久久久影视 | 干干日日 | 51久久成人国产精品麻豆 | 日韩在线观看视频一区二区三区 | 99精品在线免费在线观看 | www毛片com| 久久夜色精品国产欧美一区麻豆 | 久久久久久中文字幕 | 黄色片网站免费 | 国产精品99久久久久久久久久久久 | 亚洲国产成人在线播放 | 久久精品视频在线播放 | 黄色录像av | 麻豆综合网 | www.国产在线 | 综合久久久久久 | 免费在线观看不卡av | 夜夜操夜夜干 | 天天综合网国产 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美黑人巨大xxxxx | www一起操| 91麻豆精品国产91久久久无限制版 | 久久国产精品99久久久久久老狼 | 久草精品电影 | 国产一级在线观看视频 | 精品亚洲免费 | 精品国产网址 | 六月色婷婷 | 欧美黑人巨大xxxxx | 国产精品一区二区在线观看免费 | av网在线观看 | 蜜臀aⅴ国产精品久久久国产 | 久久av影院 | 亚洲视频456 | 日韩精品一区二区三区三炮视频 | 日韩欧美视频在线播放 | 久久久久电影 | 66av99精品福利视频在线 | 国产成人一区在线 | 亚洲三级性片 | 国产成人一区二区三区在线观看 | 中文字幕麻豆 | 91喷水| 欧美日本不卡视频 | 麻豆精品91| 日韩免费看的电影 | 99综合电影在线视频 | 一区二区三区在线视频观看58 | 天天爱天天 | 色婷婷视频网 | 日本黄色免费在线 | 91手机视频在线 | 国产精品免费观看视频 | 91av看片| 毛片网在线 | 精品在线免费视频 | 97精品国产97久久久久久久久久久久 | 亚州av免费 | 超碰个人在线 | 色婷婷久久| 九色精品 | 日韩av影视 | 久久伦理| 日韩av片免费在线观看 | 超级碰99 | 99riav1国产精品视频 | 久久99精品久久只有精品 | 日韩av高清在线观看 | 精品在线观看国产 | 色成人亚洲网 | 国产片免费在线观看视频 | 国产日韩高清在线 | 黄色亚洲片| 天天干,天天射,天天操,天天摸 | 精精国产xxxx视频在线播放 | av中文字幕第一页 | 国产亚洲精品久久19p | 国内精品久久久久久 | 日韩精品免费在线播放 | 成人午夜久久 | 国产在线不卡视频 | 成人资源在线观看 | 西西444www高清大胆 | 日韩av偷拍| 国产精品aⅴ| 伊人中文字幕在线 | 日韩精品三区四区 | 黄在线免费看 | 色婷婷视频 | 久久精品精品 | 成人久久亚洲 | 丁香综合av| 免费看的黄色片 | 最近久乱中文字幕 | 欧美男男激情videos | 久久婷婷色综合 | 日韩在线首页 | 久久久久免费网站 | 奇米网444| 日韩毛片久久久 | 天天操天天射天天舔 | 日韩在线电影一区 | 成人黄色av免费在线观看 | 天天爽天天搞 | 久久永久免费 | 亚洲另类交 | 久久久久97国产 | 成人久久久精品国产乱码一区二区 | 久久精品影片 | 欧美一级性生活视频 | 午夜 在线 | 在线电影 一区 | 麻豆 videos | 中文字幕在线专区 | 午夜久久精品 | 欧美成人tv | 玖玖爱在线观看 | 日日夜夜天天 | 天天色天天综合 | 国产亚洲精品久久久久久久久久 | 日韩av视屏| 久久久久久久久久久久久影院 | 久久99精品国产一区二区三区 | 97超碰人人模人人人爽人人爱 | 激情网综合 | 国产一级黄色免费看 | 久久一二区 | 热久久电影 | 日韩欧美精品一区二区 | 日韩91精品 | 国产精品久久亚洲 | 日韩欧美在线视频一区二区三区 | 丁香在线观看完整电影视频 | 丁香花在线观看视频在线 | 四虎永久免费网站 | 一级黄毛片 | www.玖玖玖| 国产日韩欧美在线 | 亚洲国产中文在线 | 国产精品网红直播 | 国产日韩精品一区二区三区在线 | 久草在线免费看视频 | 特级毛片爽www免费版 | 久草久草在线 | 九九热在线免费观看 | a国产精品| 国产三级香港三韩国三级 | 精品女同一区二区三区在线观看 | 91精品少妇偷拍99 | 日韩精品五月天 | 麻豆 91 在线| 91在线视频观看 | 免费看麻豆| 麻豆一级视频 | 一区二区三区在线视频观看58 | 久久99久久99久久 | 久久精品国产一区二区三区 | 亚洲欧美日韩在线看 | 久久人人爽人人爽人人片av软件 | 99婷婷狠狠成为人免费视频 | 日韩视频一区二区三区 | 在线观看一级 | 国内精品免费久久影院 | 欧美日本不卡高清 | 日韩欧美视频一区二区 | 日韩欧美国产精品 | 激情丁香婷婷 | 99久久99久久免费精品蜜臀 | 亚洲欧洲精品一区二区 | 91精品伦理 | av千婊在线免费观看 | 亚洲欧美精品一区二区 | 不卡av免费在线观看 | 国产字幕在线观看 | 久久手机视频 | 97视频在线观看视频免费视频 | 99电影| 日韩精品一区电影 | 超碰97公开 | 国产69精品久久久久久 | 久久久国产精华液 | 国产精品久久久久av免费 | 91精品电影 | 日韩一二三区不卡 | 成人av中文字幕 | 免费观看国产精品 | 深夜免费小视频 |