亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Windows程序內部運行機制實例詳解

2020-01-26 15:24:58
字體:
來源:轉載
供稿:網友

本文以孫鑫老師VC++教程中的程序為基礎,詳細講解了Windows程序內部運行機制,相信可以幫助大家更好的理解Windows程序運行原理及相應的VC++程序設計。具體內容如下:

創建一個Win32應用程序步驟:

1、編寫WinMain函數;

2、創建窗口(步驟如下):

 a、設計(一個)窗口類(WNDCLASS)

 b、注冊(該)窗口類。

 c、創建窗口。

 d、顯示并更新窗口。

3、編寫消息循環。

4、編寫窗口過程函數。

//WinMain.cpp#include <windows.h>#include <stdio.h>LRESULT CALLBACK WinAzeProc(   HWND hwnd,   // handle to window   UINT uMsg,   // message identifier   WPARAM wParam, // first message parameter   LPARAM lParam  // second message parameter   );int WINAPI WinMain(          HINSTANCE hInstance,   // handle to current instance          HINSTANCE hPrevInstance, // handle to previous instance          LPSTR lpCmdLine,     // command line          int nCmdShow       // show state          ){  //設計一個窗口類  WNDCLASS wndcls;  wndcls.cbClsExtra = 0;  wndcls.cbWndExtra = 0;  wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);  wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);  wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);  wndcls.hInstance = hInstance;  //應用程序實例句柄由WinMain函數傳進來  wndcls.lpfnWndProc = WinAzeProc;  wndcls.lpszClassName = "aze_003";  wndcls.lpszMenuName = NULL;  wndcls.style = CS_HREDRAW | CS_VREDRAW;  RegisterClass(&wndcls);  //注冊窗口類    //創建窗口,定義一個變量用來保存成功創建后返回的句柄  HWND hwnd;    hwnd = CreateWindow("aze_003", "first Application", WS_OVERLAPPEDWINDOW, 0, 0, 600, 500, NULL, NULL,hInstance, NULL);  ShowWindow(hwnd, SW_SHOWNORMAL);  //顯示窗口  UpdateWindow(hwnd);    //刷新窗口  //定義消息結構體,開始消息循環  MSG msg;  while( GetMessage(&msg, NULL, 0, 0) )  {    TranslateMessage(&msg);    DispatchMessage(&msg);  }  return msg.wParam;}//編寫窗口過程函數LRESULT CALLBACK WinAzeProc(   HWND hwnd,   // handle to window   UINT uMsg,   // message identifier   WPARAM wParam, // first message parameter   LPARAM lParam  // second message parameter   ){  switch(uMsg)  {  case WM_CHAR:    char szChar[20];    sprintf(szChar, "char code is %d", wParam);    MessageBox(hwnd, szChar, "char", 0);    break;  case WM_LBUTTONDOWN:    MessageBox(hwnd, "mouse clicked", "message", 0);    HDC hdc;    hdc = GetDC(hwnd);    //不能在響應WM_PAINT消息時調用    TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") );    ReleaseDC(hwnd, hdc);    break;  case WM_PAINT:    HDC hDC;    PAINTSTRUCT ps;    hDC = BeginPaint(hwnd, &ps);  //BeginPaint只能在響應WM_PAINT消息是調用    TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org"));    EndPaint(hwnd, &ps);    break;  case WM_CLOSE:    if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) )    {      DestroyWindow(hwnd);    }    break;  case WM_DESTROY:    PostQuitMessage(0);    break;  default:    return DefWindowProc(hwnd, uMsg, wParam, lParam);  }  return 0;}

程序運行后顯示界面如下:

窗口分為客戶區(是窗口的一部分)與非客戶區。

標題欄、菜單欄、系統菜單、最?。ù螅┗?、可調邊框統稱為窗口的非客戶區,由Windows系統管理;應用程序主要管理客戶區的外觀及操作(顯示文字、繪制圖形)。

對話框、消息框也是一種窗口;對話框上還包括許多子窗口:按鈕、單選按鈕、復選框、組狂、文本編輯框等。

2、窗口與句柄:

在Windows應用程序中,窗口是通過窗口句柄(HWND)來標識的;要對某個窗口進行操作,就必須要得到這個窗口的句柄。

句柄是Windows程序中一個重要的概念(圖標句柄(HICON)、光標句柄(HCURSOR)、畫刷句柄(HBRUSH))。

3、消息與消息隊列:

Windows程序設計模式是一種事件驅動方式的程序設計模式,主要是基于消息的。(當系統感知到一事件時(如點擊鼠標),系統會將這個事件包裝成一個消息,投遞到應用程序的消息隊列中,然后應用程序從消息隊列中取出消息并進行響應。在這個處理過程中,操作系統也會給應用程序“發送消息”?!鞍l送消息”:實際指:操作系統調用程序中一個負責處理消息的窗口過程函數)

(1)消息:Windows中,消息由MSG結構體表示,如下: 

//The MSG structure contains message information from a thread's message queue. typedef struct tagMSG { HWND  hwnd;     //消息所屬的窗口,消息都是與窗口相關聯的 UINT  message;   //the message identifier WPARAM wParam;    //指定消息的附加消息 LPARAM lParam;    //指定消息的附加消息 DWORD time;     //消息投遞到隊列中的時間 POINT pt;      //鼠標的當前位置} MSG, *PMSG;

Windows中,消息是由一個個數值表示的;Windows將消息對應的數值定義為WM_XXX宏(WM:Window Message)的形式,XXX對應某種消息的英文拼寫的大寫形式。如:WM_LBUTTONDOWN:鼠標左鍵按下消息、WM_KEYDOWN:鍵盤按下消息、WM_CHAR:字符消息???

(2)消息隊列:每一個Windows應用程序開始執行后,系統都會為改程序創建一個消息隊列,這個消息隊列用來存放改程序創建的窗口的消息。

(3)進隊消息 與 不進隊消息:

      進隊的消息將由系統放入到應用程序的消息隊列中,然后由應用程序取出并發送;

      不進隊消息在系統調用窗口過程時,直接發送給窗口;

      兩者最終都是有系統調用窗口過程函數對消息進行處理。

4、WinMain函數

(一)MSDN上的WinMain函數定義如下(備有詳盡的注釋):

//The WinMain function is called by the system as the initial entry point for a Windows-based application. int WINAPI WinMain( HINSTANCE hInstance,   // handle to current instance當前窗口句柄 HINSTANCE hPrevInstance, // handle to previous instance前一個打開的窗口句柄 LPSTR lpCmdLine,     // command line 指定傳遞給應用程序的*命令行*參數 int nCmdShow       // show state 指定窗口應該如何顯示,如:最大(?。┗㈦[藏等);

(二)窗口類的結構體的定義:

(1)本文程序中對應代碼如下:

typedef struct _WNDCLASS {   UINT    style;    //指定*這一類型*窗口的樣式,如:CS_HREDRAW、CS_VREDRAW、CS_NOCLOSE、CS_DBLCLKS  WNDPROC  lpfnWndProc;   //函數指針,指向窗口過程函數(窗口過程函數是一回調函數)  int    cbClsExtra;   //一般為0  int    cbWndExtra;   //同上  HINSTANCE hInstance;   //指定包含窗口過程的程序的實例句柄  HICON   hIcon;     //指定窗口類的圖標句柄  HCURSOR  hCursor;   //指定窗口類的光標句柄  HBRUSH   hbrBackground;   //指定窗口類的背景畫刷句柄;當窗口發生重繪值,系統使用這里指定的畫刷來查處窗口的背景  LPCTSTR  lpszMenuName;   //指定菜單資源的名字 **菜單并不是一個窗口**  LPCTSTR  lpszClassName;   //指定窗口類的名字} WNDCLASS, *PWNDCLASS;

回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時有另一方調用的,用于該事件或條件進行響應。

回調函數的實現機制是:

   ?、?span style="color: #0000ff">定義一個回調函數。

    ②提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者。

   ?、?span style="color: #0000ff">當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。

針對Windows的消息處理機制,窗口過程函數被調用的過程如下:

   ?、?span style="color: #0000ff">在設計窗口類的時候,將窗口過程函數的地址賦值給lpfnWndProc成員變量;

   ?、?span style="color: #0000ff">調用RegisterClass(&wndclass)注冊窗口類,那么系統就有了我們所編寫的窗口過程函數的地址。

   ?、?span style="color: #0000ff">當應用程序接收到某一窗口的消息時,調用DispatchMessage(&msg)將對消息回傳給系統。系統則利用先前注冊窗口類時得到的函數指針,調用窗口過程函數對消息進行處理。

提示:一個Windows程序可以包含多個窗口過程函數,一個窗口過程總是與某一個特定的窗口類相關聯(通過WNDCLASS結構體中的lpfnWndProc成員變量指定),基于該窗口類創建的窗口使用同一個窗口過程。

lpfnWndProc成員變量的類型是WNDPROC,定義如下:

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); //LRESULT=long, CALLBACK=_stdcall WNDPROC是函數指針類型。

注意:WNDPROC被定義為指向窗口過程函數的指針類型,窗口過程函數的格式必須與WNDPROC相同。

在VC++中,資源是通過標識符(ID)來標識的,同一個ID可以標識多個不同的資源(資源的ID本質上是一個整數)。如:菜單資源:IDM_XXX(M表示Menu)、圖標資源:IDI_XXX(I表示圖標)、按鈕資源:IDB_XXX(B表示Button)

可以調用GetStockObject(int fnObject) 來得到系統的標準畫刷。聲明如下:

//The GetStockObject function retrieves a handle to one of the stock pens, brushes, fonts, or palettes. HGDIOBJ GetStockObject( int fnObject  // stock object type);

GetStockObject函數:返回多種資源對象的句柄,如:畫刷、畫筆、字體、調色板等;

函數返回時,需進行類型轉換。如:

wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 

(2)注冊窗口類:設計窗口類(WNDCLASS)后,需要調用RegisterClass函數對其進行注冊,注冊成功后,才可以創建該類型的窗口。聲明如下:

ATOM RegisterClass( CONST WNDCLASS *lpWndClass // class data, 窗口類對象的指針               // Pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function. );

(3)創建窗口:CreateWindow函數聲明如下:

HWND CreateWindow( LPCTSTR lpClassName, // registered class name 即:窗口類WNDCLASS的lpszClassName成員指定的名稱(必須先注冊) LPCTSTR lpWindowName, // window name  指定窗口的名字 DWORD dwStyle,    // window style 指定創建窗口的樣式 如:WS_OVERLAPPEDWINDOW int x,        // horizontal position of window int y,        // vertical position of window int nWidth,      // window width int nHeight,     // window height HWND hWndParent,   // handle to parent or owner window 指定被創建窗口的父窗口句柄 HMENU hMenu,     // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam    // window-creation data 作為WM_CREATE消息的附加參數lParam傳入的數據指針(一般為:NULL));

如果窗口創建成功,CreateWindow函數將返回系統為該窗口分配的句柄;否則,返回NULL。

?注意:在創建窗口之前應先定義一個窗口句柄變量來接收創建窗口之后的句柄值。

顯示及更新窗口:

(4)顯示窗口:ShowWindow聲明如下:

BOOL ShowWindow( HWND hWnd,   // handle to window 該參數為成功創建窗口后返回的那個窗口句柄 int nCmdShow  // show state 如:SW_HIDE、SW_SHOW、SW_SHOWNORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED??);

(5)更新(刷新)窗口:UpdateWindow函數聲明原型如下:

BOOL UpdateWindow( HWND hWnd  // handle to window 創建成功后的窗口句柄);

UpdateWindow函數通過發送一個WM_PAINT消息來刷新窗口,UpdateWindow將WM_PAINT消息直接發送給了窗口過程函數進行處理,而沒有放到消息隊列里面。

(三)、消息循環

窗口 創建、顯示、更新后;需要編寫一個消息循環,不斷的從消息隊列中取出消息,并進行響應。

GetMessage()函數:從消息隊列中取出消息

BOOL GetMessage( LPMSG lpMsg,     // message information 指向一個消息(MSG)結構體,GetMessage從線程的消息隊列中取出的消息信息將保存在該結構體對象中 HWND hWnd,      // handle to window 指定接收屬于哪一個窗口的消息;NULL:用于接收屬于調用線程的所有窗口的窗口消息 UINT wMsgFilterMin, // first message 指定獲取打的消息的最小值 UINT wMsgFilterMax  // last message 如果wMsgFilterMin=0和wMsgFilterMax=0,則接收所有消息);

GetMessage函數接收到除WM_QUIT外的消息均返回非零值。

//消息循環代碼,一般形式  MSG msg;  while( GetMessage(&msg, NULL, 0, 0) )  {    TranslateMessage(&msg); //TranslateMessage函數將虛擬鍵消息*轉換*為字符消息,被投遞到調用線程的消息隊列中,當下一次調用GetMessage函數時被取出    DispatchMessage(&msg);  //DispatchMessage函數分派一個消息到窗口過程,有窗口過程函數對消息進行處理//DispatchMessage實際上是將消息會傳給操作系統,有操作系統調用窗口過程函數對消息進行處理(響應)  }

Windows應用程序的消息處理機制如下圖所示:

Windows應用程序的消息處理過程:

   ?。?)操作系統就收到應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中。

   ?。?)應用程序在消息循環匯總調用GetMessage函數從消息隊列中取出一條一條的消息。取出消息后,應用程序可以對消息進行一些預處理,如:放棄對某些消息的響應,或者調用TranslateMessage產生新的消息。

   ?。?)應用程序調用DisPatchMessage,將消息回傳給操作系統。消息是由MSG結構體對象來表示的,其中就包含了接收消息的窗口的句柄。故:DisPatchMessage函數總能進行正確的傳遞。

   ?。?)操作利用WNDCLASS結構體的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程,對消息進行處理(即“系統給應用程序發送了消息”)。

補充:

  (1)從消息隊列中獲取消息還可以調用PeekMessage函數,函數原型如下:

BOOL PeekMessage( LPMSG lpMsg,     // message information HWND hWnd,      // handle to window UINT wMsgFilterMin, // first message UINT wMsgFilterMax, // last message UINT wRemoveMsg   // removal options);

前四個參數與GetMessage函數的參數作用相同;

最后一個參數指定消息獲取的方式;如果設為PM_NOREMOVE, 那么消息將不會從消息隊列中被移除;如果設為PM_REMOVE, 那么消息將從消息隊列中被移除(與GetMessage函數的行為一致)

  (2)發送消息可以使用SendMessage和PostMessage函數。

      SendMessage將消息直接發送給窗口,并調用該窗口的窗口過程進行處理;在窗口過程對消息處理完畢后,該函數才返回(SendMessage發送的消息為不進隊消息)。

      PostMessage函數將消息放入與創建窗口的線程相關聯的消息隊列后立即返回。

      PostThreadMessage函數,用于向線程發送消息。

      對于線程消息,MSG結構體中的hwnd成員為NULL。

(四)、編寫窗口過程函數:用于處理發送給窗口的消息

LRESULT CALLBACK WindowProc(  //窗口過程函數的名字可以隨便取,如:WinAzeProc,但函數聲明與定義要一致; HWND hwnd,   // handle to window UINT uMsg,   // message identifier 消息代碼 WPARAM wParam, // first message parameter 消息代碼的兩個附加值 LPARAM lParam  // second message parameter);

提示:系統通過窗口過程函數的地址(指針)來調用窗口過程函數,而不是名字。

//編寫窗口過程函數LRESULT CALLBACK WinAzeProc(              HWND hwnd,   // handle to window              UINT uMsg,   // message identifier              WPARAM wParam, // first message parameter              LPARAM lParam  // second message parameter              ){  switch(uMsg)  {  case WM_CHAR:  //通過調用TranslateMessage函數轉換得到    char szChar[20];    sprintf(szChar, "char code is %d", wParam);    MessageBox(hwnd, szChar, "char", 0);    break;  case WM_LBUTTONDOWN:    MessageBox(hwnd, "mouse clicked!", "message", 0);    HDC hdc;    hdc = GetDC(hwnd);    //用hdc保存GetDC函數返回的與特定窗口相關聯的DC的句柄。                //GetDC()不能在響應WM_PAINT消息時調用    TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") );  //TextOut利用得到的DC句柄在指定的位置(0,50)出輸出一行文字    ReleaseDC(hwnd, hdc);  //釋放hdc    break;  case WM_PAINT:  //當窗口客服區的一部分或者全部變為“無效”時,系統會發送WM_PAINT消息,通知應用程序重新繪制窗口          //窗口剛創建時,客戶區是無效狀態,當調用UpdateWindow函數時,會發送WM_PAINT消息給窗口過程,對窗口進行刷新          //當窗口從無到有、改變尺寸、最小化在恢復、被其他窗口遮蓋后在顯示時,窗口的客戶區都將變為無效,此時系統會給應用程序發送WM_PAINT消息,通知應用程序重新繪制          //提示:窗口大小發生變化時,是否發生重繪,取決于WNDCLASS結構體中style成員是否設置了CS_HREDRAW和CS_VREDRAW標志    HDC hDC;    PAINTSTRUCT ps;    //ps用于接收繪制的信息    hDC = BeginPaint(hwnd, &ps);  //BeginPaint只能在響應WM_PAINT消息是調用    TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org"));     EndPaint(hwnd, &ps);    break;  case WM_CLOSE:    if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) )    {      DestroyWindow(hwnd);    }    break;  case WM_DESTROY:    PostQuitMessage(0);    break;  default:    return DefWindowProc(hwnd, uMsg, wParam, lParam); //DefWindowProc調用默認的窗口過程,對應用程序沒有處理的其他消息提供默認處理。//對于大多數的消息,應用程序可以直接調用DefWindowProc函數進行處理。//在編寫窗口過程時,應將DefWindowProc函數的調用放到default語句中,并將該函數的返回值作為窗口過程函數的返回值。  }  return 0;}

提示:要在窗口中輸出文字或者顯示圖形,需要用到設備描述表(Device ConText)。

設備描述表(簡稱DC):

DC是一個包含設備(物理輸出設備,如顯示器、設備驅動器)信息的結構體,在Windows平臺下,所有的圖形操作都是利用DC來完成的。

第30、31行代碼:在調用BeginPaint時,如果客戶區的背景還沒有被擦除,那么BeginPaint會發送WM_ERASEBKGND消息給窗口,系統就會使用WNDCLASS結構體的hbrBackGround成員指定的畫刷來擦除背景。如果我們想要讓某個圖形時鐘在窗口中顯示,就應該將圖形的繪制操作放到響應WM_PAINT消息的代碼中,如TextOut()的位置。

第34-48行代碼:DestroyWindow函數在銷毀窗口后會向窗口過程發送WM_DESTROY消息。注意:此時窗口雖然銷毀了,但應用程序并沒有退出。故:如果自己要控制程序是否退出,應該在WM_CLOSE消息的響應代碼中完成。

   對WM_CLOSE消息的響應并不是必須的,如果應用程序沒有對該消息進行響應,系統將把這條消息傳給DefWindowProc函數,而DefWindowProc函數則條用DestroyWindow函數來響應 這條WM_CLOSE消息。

第40-42行代碼:DestroyWindow函數在銷毀窗口后,會給窗口過程發送WM_DESTROY消息, 然后在該消息的響應代碼中調用PostQuitMessage函數。PostQuitMessage函數項應用程序的消息隊列中投遞一條WM_QUIT消息并返回。GetMessage函數只有在收到WM_QUIT消息時才返回0,此時消息循環才結束,程序退成。

  想讓程序正常退出,我們必須響應WM_DESTROY消息,并在消息響應代碼中調用PostQuitMessage,向應用程序的消息隊列中投遞WM_QUIT消息。傳遞給PostQuitMessage函數的參數值將作為WM_QUIT消息的wParam參數,這個值通常用做WinMain函數的返回值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲成视频免费观看| 高清亚洲成在人网站天堂| 亚洲人成在线观看网站高清| 精品亚洲国产成av人片传媒| 欧美午夜片在线免费观看| 日韩美女在线看| 国产成人a亚洲精品| 伊人久久免费视频| 欧美日韩精品国产| 亚洲视频精品在线| 欧美丰满老妇厨房牲生活| 91精品成人久久| 九色成人免费视频| 萌白酱国产一区二区| 精品亚洲夜色av98在线观看| 国产色综合天天综合网| 久久久国产91| 色婷婷久久一区二区| 国产情人节一区| 亚洲最大av网| 国产精品久久99久久| 亚洲天堂av在线播放| 日韩毛片在线观看| 久久久精品久久久久| 成人免费观看网址| 亚洲精品久久久久中文字幕欢迎你| 国产精品com| 国产精品91久久| 亚洲free性xxxx护士白浆| 国产日韩欧美日韩大片| 欧美色另类天堂2015| 精品国产一区二区三区久久狼5月| 精品国产美女在线| 国产最新精品视频| 亚洲国产精品悠悠久久琪琪| 欧美性做爰毛片| 91在线观看免费观看| 美女撒尿一区二区三区| 精品视频在线导航| 欧美国产日本在线| 色樱桃影院亚洲精品影院| 这里只有精品在线播放| 中文字幕在线视频日韩| 影音先锋欧美精品| 久久人91精品久久久久久不卡| 欧美日韩国产一区中文午夜| 91精品久久久久久久久久入口| 精品激情国产视频| 日韩美女av在线| 97超视频免费观看| 亚洲福利在线播放| 国内揄拍国内精品少妇国语| 精品亚洲一区二区三区四区五区| 欧美噜噜久久久xxx| 午夜精品免费视频| 亚洲免费中文字幕| 欧美一区二区三区精品电影| 成人高清视频观看www| 久久久亚洲网站| 国产精品流白浆视频| 欧美亚洲成人免费| 国产这里只有精品| 亚洲欧洲一区二区三区在线观看| 高潮白浆女日韩av免费看| 中文字幕久热精品在线视频| 久久精品国产精品亚洲| 成人精品福利视频| 91福利视频在线观看| 在线播放亚洲激情| 久久精品国产91精品亚洲| 日韩av电影国产| 久久免费精品日本久久中文字幕| 国产精品2018| 成人黄色在线免费| 日韩精品免费看| 国产黑人绿帽在线第一区| 日韩成人在线网站| 欧美一级高清免费播放| 国产一区二区成人| 亚洲精品中文字幕有码专区| 日韩国产高清视频在线| 精品久久久久久中文字幕一区奶水| 久久久久久久色| 国产精品流白浆视频| 亚洲精品电影网| 国产精品久在线观看| 国产精品天天狠天天看| 欧美俄罗斯乱妇| 国产亚洲成精品久久| 最近2019免费中文字幕视频三| 国内揄拍国内精品少妇国语| 日韩欧美国产网站| 欧美影院成年免费版| 久久精品91久久香蕉加勒比| 国产视频精品xxxx| 亚洲精品一区二区在线| 欧美亚洲伦理www| 欧美激情一区二区三区高清视频| 欧美在线一级视频| 91精品国产综合久久香蕉最新版| 亚洲国产美女精品久久久久∴| 国产丝袜精品第一页| 久久久久久久久久亚洲| 亚洲女同精品视频| 日韩美女免费视频| 久久精彩免费视频| 91精品国产91久久| 在线观看亚洲区| 最近中文字幕mv在线一区二区三区四区| 欧美性资源免费| 日韩av最新在线观看| 成年无码av片在线| 中文字幕国产精品久久| 国产视频在线观看一区二区| 久久视频免费观看| 成人国产精品久久久久久亚洲| 亚洲天堂视频在线观看| 欧美色播在线播放| 国产在线98福利播放视频| 在线成人激情黄色| 国产日韩欧美影视| 国产999精品久久久| 91久久国产婷婷一区二区| 久久亚洲精品视频| 久久精品视频在线观看| 日韩精品极品视频| 久久综合五月天| 91高清视频免费观看| 国产精品扒开腿爽爽爽视频| 538国产精品一区二区在线| 亚洲天堂男人天堂| 国产亚洲福利一区| 91高清视频免费观看| 欧美黄色www| 久久精品国产亚洲7777| 久久久精品一区二区三区| 亚洲电影免费观看高清完整版在线| 欧美成人全部免费| 91亚洲精品久久久| 51色欧美片视频在线观看| 日韩高清免费观看| 在线日韩精品视频| 亚洲精品国产精品乱码不99按摩| 在线电影欧美日韩一区二区私密| 色悠久久久久综合先锋影音下载| 久久精品色欧美aⅴ一区二区| 日韩最新av在线| 欧美成人精品在线播放| 成人淫片在线看| 国产精品欧美日韩| 欧美极品美女视频网站在线观看免费| 中文字幕日韩在线视频| 91精品国产99| 久久久国产精品x99av| 国产精品永久免费视频| 国产精品三级网站| 中文字幕精品av| 亚洲最大福利视频网站| 欧美国产日韩一区二区三区| 青青青国产精品一区二区| 国产精品大片wwwwww| 国产精品网站大全| 91国产精品视频在线| 色yeye香蕉凹凸一区二区av|