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

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

?? 8. 定時器.txt

?? 本書介紹了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序寫作的方法
?? TXT
?? 第 1 頁 / 共 4 頁
字號:
定時器
 智能中國——游戲組  整理編譯   
 

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

Microsoft Windows定時器是一種輸入設備,它周期性地在每經過一個指定的時間間隔后就通知應用程序一次。您的程序將時間間隔告訴Windows,例如「每10秒鐘通知我一聲」,然后Windows給您的程序發送周期性發生的WM_TIMER消息以表示時間到了。

初看之下,Windows定時器似乎不如鍵盤和鼠標設備重要,而且對許多應用程序來說確實如此。但是,定時器比您可能認為的要重要得多,它不只用于計時程序,比如出現在工具列中的Windows時鐘和這一章中的兩個時鐘程序。下面是Windows定時器的其它應用,有些可能并不那么明顯:

多任務雖然Windows 98是一個優先權式的多任務環境,但有時候如果程序盡快將控制傳回給Windows效率會更高。如果一個程序必須進行大量的處理,那么它可以將作業分成小塊,每接收到一個WM_TIMER消息處理一塊(我將在第二十章中對此做更多的討論)。
  
維護更新過的狀態報告程序可以利用定時器來顯示持續變化信息的「實時」更新,比如關于系統資源的變化或某個任務的進展情況。
  
實作「自動儲存」功能定時器提示Windows程序在指定的時間過去后把使用者的工作儲存到磁盤上。
  
終止程序展示版本的執行一些程序的展示版本被設計成在其開始后,多長時間結束,比如說,30分鐘。如果時間已到,那么定時器就會通知應用程序。
  
步進移動游戲中的圖形對象或計算機輔助教學程序中的連續顯示,需要按指定的速率來處理。利用定時器可以消除由于微處理器速度不同而造成的不一致。
  
多媒體播放CD聲音、聲音或音樂的程序通常在背景播放聲音數據。一個程序可以使用定時器來周期性地檢查已播放了多少聲音數據,并據此協調屏幕上的視覺信息。
  
另一項應用可以保證程序在退出窗口消息處理程序后,能夠重新得到控制。在大多數時情況下,程序不能夠知道何時下一個消息會到來。

定時器入門


您可以通過呼叫SetTimer函數為您的Windows程序分配一個定時器。SetTimer有一個時間間隔范圍為1毫秒到4,294,967,295毫秒(將近50天)的整數型態參數,這個值指示Windows每隔多久時間給您的程序發送WM_TIMER消息。例如,如果間隔為1000毫秒,那么Windows將每秒給程序發送一個WM_TIMER消息。

當您的程序用完定時器時,它呼叫KillTimer函數來停止定時器消息。在處理WM_TIMER消息時,您可以通過呼叫KillTimer函數來編寫一個「限用一次」的定時器。KillTimer呼叫清除消息隊列中尚未被處理的WM_TIMER消息,從而使程序在呼叫KillTimer之后就不會再接收到WM_TIMER消息。

系統和定時器


Windows定時器是PC硬件和ROM BIOS架構下之定時器一種相對簡單的擴充。回到Windows以前的MS-DOS程序寫作環境下,應用程序能夠通過攔截者稱為timer tick的BIOS中斷來實作時鐘或定時器。一些為MS-DOS編寫的程序自己攔截這個硬件中斷以實作時鐘和定時器。這些中斷每54.915毫秒產生一次,或者大約每秒18.2次。這是原始的IBM PC的微處理器時脈值4.772720 MHz被218所除而得出的結果。

Windows應用程序不攔截BIOS中斷,相反地,Windows本身處理硬件中斷,這樣應用程序就不必進行處理。對于目前擁有定時器的每個程序,Windows儲存一個每次硬件timer tick減少的計數。當這個計數減到0時,Windows在應用程序消息隊列中放置一個WM_TIMER消息,并將計數重置為其最初值。

因為Windows應用程序從正常的消息隊列中取得WM_TIMER消息,所以您的程序在進行其它處理時不必擔心WM_TIMER消息會意外中斷了程序。在這方面,定時器類似于鍵盤和鼠標。驅動程序處理異步硬件中斷事件,Windows把這些事件翻譯為規律、結構化和順序化的消息。

在Windows 98中,定時器與其下的PC定時器一樣具有55毫秒的分辨率。在Microsoft Windows NT中,定時器的分辨率為10毫秒。

Windows應用程序不能以高于這些分辨率的頻率(在Windows 98下,每秒18.2次,在Windows NT下,每秒大約100次)接收WM_TIMER消息。在SetTimer呼叫中指定的時間間隔總是截尾后tick數的整數倍。例如,1000毫秒的間隔除以54.925毫秒,得到18.207個tick,截尾后是18個tick,它實際上是989毫秒。對每個小于55毫秒的間隔,每個tick都會產生一個WM_TIMER消息。

定時器消息不是異步的


因為定時器使用硬件定時器中斷,程序寫作者有時會誤解,認為他們的程序會異步地被中斷來處理WM_TIMER消息。

然而,WM_TIMER消息并不是異步的。WM_TIMER消息放在正常的消息隊列之中,和其它消息排列在一起,因此,如果在SetTimer呼叫中指定間隔為1000毫秒,那么不能保證程序每1000毫秒或者989毫秒就會收到一個WM_TIMER消息。如果其它程序的執行事件超過一秒,在此期間內,您的程序將收不到任何WM_TIMER消息。您可以使用本章的程序來展示這一點。事實上,Windows對WM_TIMER消息的處理非常類似于對WM_PAINT消息的處理,這兩個消息都是低優先級的,程序只有在消息隊列中沒有其它消息時才接收它們。

WM_TIMER還在另一方面和WM_PAINT相似:Windows不能持續向消息隊列中放入多個WM_TIMER消息,而是將多余的WM_TIMER消息組合成一個消息。因此,應用程序不會一次收到多個這樣的消息,盡管可能在短時間內得到兩個WM_TIMER消息。應用程序不能確定這種處理方式所導致的WM_TIMER消息「遺漏」的數目。

這樣,WM_TIMER消息僅僅在需要更新時才提示程序,程序本身不能經由統計WM_TIMER消息的數目來計時(在本章后面,我們將編寫兩個每秒更新一次的時鐘程序,并可以看到如何做到這一點)。

為了方便起見,下面在討論時鐘時,我將使用「每秒得到一次WM_TIMER消息」這樣的敘述,但是請記住,這些消息并非精確的tick中斷。

定時器的使用:三種方法


如果您需要在整個程序執行期間都使用定時器,那么您將得從WinMain函數中或者在處理WM_CREATE消息時呼叫SetTimer,并在退出WinMain或響應WM_DESTROY消息時呼叫KillTimer。根據呼叫SetTimer時使用的參數,可以下列三種方法之一使用定時器。

方法一


這是最方便的一種方法,它讓Windows把WM_TIMER消息發送到應用程序的正常窗口消息處理程序中,SetTimer呼叫如下所示:

SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
        
第一個參數是其窗口消息處理程序將接收WM_TIMER消息的窗口句柄。第二個參數是定時器ID,它是一個非0數值,在整個例子中假定為1。第三個參數是一個32位無正負號整數,以毫秒為單位指定一個時間間隔,一個60,000的值將使Windows每分鐘發送一次WM_TIMER消息。

您可以通過呼叫

KillTimer (hwnd, 1) ;
        
在任何時刻停止WM_TIMER消息(即使正在處理WM_TIMER消息)。此函數的第二個參數是SetTimer呼叫中所用的同一個定時器ID。在終止程序之前,您應該響應WM_DESTROY消息停止任何活動的定時器。

當您的窗口消息處理程序收到一個WM_TIMER消息時,wParam參數等于定時器的ID值(上述情形為1),lParam參數為0。如果需要設定多個定時器,那么對每個定時器都使用不同的定時器ID。wParam的值將隨傳遞到窗口消息處理程序的WM_TIMER消息的不同而不同。為了使程序更具有可讀性,您可以使用#define敘述定義不同的定時器ID:

#define TIMER_SEC 1
        
#define TIMER_MIN 2
        
然后您可以使用兩個SetTimer呼叫來設定兩個定時器:

SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
        
SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
        
WM_TIMER的處理如下所示:

caseWM_TIMER:
        
    switch (wParam)
        
    {
        
    case TIMER_SEC:
        
            //每秒一次的處理
        
                  break ;
        
    case TIMER_MIN:
        
            //每分鐘一次的處理
        
            break ;
        
    }
        
return 0 ;
        
如果您想將一個已經存在的定時器設定為不同的時間間隔,您可以簡單地用不同的時間值再次呼叫SetTimer。在時鐘程序里,如果顯示秒或不顯示秒是可以選擇的,您就可以這樣做,只需簡單地將時間間隔在1000毫秒和60 000毫秒間切換就可以了。

程序8-1顯示了一個使用定時器的簡單程序,名為BEEPER1,定時器的時間間隔設定為1秒。當它收到WM_TIMER消息時,它將顯示區域的顏色由藍色變為紅色或由紅色變為藍色,并通過呼叫MessageBeep函數發出響聲。(雖然MessageBeep通常用于MessageBox,但它確實是一個全功能的鳴叫函數。在有聲卡的PC機上,一般可以使用不同的MB_ICON參數作為MessageBeep的一個參數以用于MessageBox,來播放使用者在「控制臺」的「聲音」程序中選擇的不同聲音)。

BEEPER1在窗口消息處理程序處理WM_CREATE消息時設定定時器。在處理WM_TIMER消息處理期間,BEEPER1呼叫MessageBeep,翻轉bFlipFlop的值并使窗口無效以產生WM_PAINT消息。在處理WM_PAINT消息處理期間,BEEPER1通過呼叫GetClientRect獲得窗口大小的RECT結構,并通過呼叫FillRect改變窗口的顏色。

程序8-1 BEEPER1 
        
BEEPER1.C
        
/*-------------------------------------------------------------------------
        
    BEEPER1.C  -- Timer Demo Program No. 1
        
                                          (c) Charles Petzold, 1998
        
-------------------------------------------------------------------------*/
        
#include <windows.h>
        

#define ID_TIMER    1
        

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
        
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                                          PSTR szCmdLine, int iCmdShow)
        
{
        
    static TCHAR szAppName[] = TEXT ("Beeper1") ;
        
    HWND                          hwnd ;
        
    MSG                                  msg ;
        
    WNDCLASS                             wndclass ;
        
   
        
    wndclass.style                              = CS_HREDRAW | CS_VREDRAW ;
        
    wndclass.lpfnWndProc                         = WndProc ;
        
    wndclass.cbClsExtra                          = 0 ;
        
    wndclass.cbWndExtra                          = 0 ;
        
    wndclass.hInstance                           = hInstance ;
        
           wndclass.hIcon                       = LoadIcon (NULL, IDI_APPLICATION) ;
        
           wndclass.hCursor                     = LoadCursor (NULL, IDC_ARROW) ;
        
           wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName                = NULL ;
        
           wndclass.lpszClassName               = szAppName ;
        
   
        
           if (!RegisterClass (&wndclass))
        
    {
        
            MessageBox (  NULL, TEXT ("Program requires Windows NT!"),
        
                                                  szAppName, MB_ICONERROR) ;
        
            return 0 ;
        
           }
        
   
        
           hwnd = CreateWindow (szAppName, TEXT ("Beeper1 Timer Demo"),
        
                                  WS_OVERLAPPEDWINDOW,
        
                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                 CW_USEDEFAULT, CW_USEDEFAULT,
        
                          NULL, NULL, hInstance, NULL) ;
        
        
        
    ShowWindow (hwnd, iCmdShow) ;
        
    UpdateWindow (hwnd) ;
        

    while (GetMessage (&msg, NULL, 0, 0))
        
    {
        
                   TranslateMessage (&msg) ;
        
                   DispatchMessage (&msg) ;
        
    }
        
           return msg.wParam ;
        
}
        

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
        
{
        
    static BOOL   fFlipFlop = FALSE ;
        
    HBRUSH                hBrush ;
        
    HDC                           hdc ;
        
    PAINTSTRUCT ps ;
        
    RECT        rc ;
        
   
        
    switch (message)
        
    {
        
    case   WM_CREATE:
        
            SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
        
                  return 0 ;
        

           case   WM_TIMER :
        
                  MessageBeep (-1) ;        
        
                  fFlipFlop = !fFlipFlop ;
        
                  InvalidateRect (hwnd, NULL, FALSE) ;
        
                  return 0 ;
        
        
        
           case   WM_PAINT :
        
                  hdc = BeginPaint (hwnd, &ps) ;
        
        
        
                  GetClientRect (hwnd, &rc) ;
        
                  hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ;
        
                  FillRect (hdc, &rc, hBrush) ;
        

            EndPaint (hwnd, &ps) ;
        
           DeleteObject (hBrush) ;
        
                  return 0 ;
        
        
        
           case   WM_DESTROY :
        
                  KillTimer (hwnd, ID_TIMER) ;
        
                  PostQuitMessage (0) ;
        
           return 0 ;
        
           }
        
           return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}
        
因為BEEPER1每次收到WM_TIMER消息時,都用顏色的變換顯示出來,所以您可以通過呼叫BEEPER1來查看WM_TIMER消息的性質,并完成Windows內部的一些其它操作。

例如,首先呼叫控制臺的 顯示器程序,選擇效果,確定 拖曳時顯示窗口內容復選框沒有被選中。現在,試著移動或者縮放BEEPER1窗口,這將導致程序進入「模態消息循環」。Windows通過在內部消息而非您程序的消息循環中攔截所有消息,來禁止對移動或者縮放操作的任何干擾。通過此循環到達程序窗口的大多數消息都被丟棄,這就是BEEPER1停止蜂鳴的原因。當完成了移動與縮放之后,您將會注意到BEEPER1不能取得它所丟棄的所有WM_TIMER消息,盡管前兩個消息的間隔可能少于1秒。

在「拖曳時顯示窗口內容」復選框被選中時,Windows中,的模態消息循環會試圖給您的窗口消息處理程序傳遞一些丟失的消息。這樣做有時工作得很好,有時卻不行。

方法二


設定定時器的第一種方法是把WM_TIMER消息發送到通常的窗口消息處理程序,而第二種方法是讓Windows直接將定時器消息發送給您程序的另一個函數。

接收這些定時器消息的函數被稱為「callback」函數,這是一個在您的程序之中但是由Windows呼叫的函數。您先告訴Windows此函數的地址,然后Windows呼叫此函數。這看起來也很熟悉,因為程序的窗口消息處理程序實際上也是一種callback函數。當注冊窗口類別時,要將函數的地址告訴Windows,當發送消息給程序時,Windows會呼叫此函數。

SetTimer并非是唯一使用callback函數的Windows函數。CreateDialog和DialogBox函數(將在第十一章中介紹)使用callback函數處理對話框中的消息;有幾個Windows函數(EnumChildWindow、EnumFonts、EnumObjects、EnumProps和EnumWindow)把列舉信息傳遞給callback函數;還有幾個不那么常用的函數(GrayString、LineDDA和SetWindowHookEx)也要求callback函數。

像窗口消息處理程序一樣,callback函數也必須定義為CALLBACK,因為它是由Windows從程序的程序代碼段呼叫的。callback函數的參數和callback函數的傳回值取決于callback函數的目的。跟定時器有關的callback函數中,輸入參數與窗口消息處理程序的輸入參數一樣。定時器callback函數不向Windows傳回值。

我們把以下的callback函數稱為TimerProc(您能夠選擇與其它一些用語不會發生沖突的任何名稱),它只處理WM_TIMER消息:

VOID CALLBACK TimerProc (  HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
        
{
        
           處理WM_TIMER消息
        
}
        
TimerProc的參數hwnd是在呼叫SetTimer時指定的窗口句柄。Windows只把WM_TIMER消息送給TimerProc,因此消息參數總是等于WM_TIMER。iTimerID值是定時器ID,dwTimer值是與從GetTickCount函數的傳回值相容的值。這是自Windows啟動后所經過的毫秒數。

在BEEPER1中已經看到過,用第一種方法設定定時器時要求下面格式的SetTimer呼叫:

SetTimer (hwnd, iTimerID, iMsecInterval, NULL) ;
        
您使用callback函數處理WM_TIMER消息時,SetTimer的第四個參數由callback函數的地址取代,如下所示:

SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
        
我們來看看一些范例程序代碼,這樣您就會了解這些東西是如何組合在一起的。在功能上,除了Windows發送一個定時器消息給TimerProc而非WndProc之外,程序8-2所示的BEEPER2程序與BEEPER1是相同的。注意,TimerProc和WndProc一起被聲明在程序的開始處。

程序8-2  BEEPER2
        
BEEPER2.C
        
/*---------------------------------------------------------------------------
        
  BEEPER2.C -- Timer Demo Program No. 2
        
                                   (c) Charles Petzold, 1998
        
---------------------------------------------------------------------------*/
        
#include <windows.h>
        
#define ID_TIMER    1
        

LRESULT     CALLBACK              WndProc   (HWND, UINT, WPARAM, LPARAM) ;
        
VOID    CALLBACK   TimerProc (HWND, UINT, UINT,   DWORD ) ;
        

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                                                         PSTR szCmdLine, int iCmdShow)
        
{
        
   static char   szAppName[]           = "Beeper2" ;
        
           HWND                                 hwnd ;
        
           MSG                                  msg ;
        
           WNDCLASS                      wndclass ;
        
   
        
           wndclass.style                                       = CS_HREDRAW | CS_VREDRAW ;
        
           wndclass.lpfnWndProc                                 = WndProc ;
        
          wndclass.cbClsExtra                                  = 0 ;
        
           wndclass.cbWndExtra                                  = 0 ;
        
           wndclass.hInstance                                   = hInstance ;
        
           wndclass.hIcon                                       = LoadIcon (NULL, IDI_APPLICATION) ;
        
           wndclass.hCursor                                     = LoadCursor (NULL, IDC_ARROW) ;
        
          wndclass.hbrBackground                       = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName                        = NULL ;
        
           wndclass.lpszClassName                       = szAppName ;
        
   
        
           if (!RegisterClass (&wndclass))
        
           {
        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲动漫第一页| 国产精品一二三四| 免费精品视频在线| 大胆亚洲人体视频| 7777女厕盗摄久久久| 国产午夜精品一区二区| 一区二区三区四区不卡视频| 极品瑜伽女神91| 欧美性色aⅴ视频一区日韩精品| 久久欧美一区二区| 日韩高清中文字幕一区| 91小视频在线| 欧美精品一区二区在线播放| 亚洲aaa精品| 北条麻妃国产九九精品视频| 精品国产乱码久久久久久影片| 亚洲一区欧美一区| 成人爱爱电影网址| 久久影院电视剧免费观看| 亚洲成人福利片| 在线观看中文字幕不卡| 国产精品日日摸夜夜摸av| 经典三级在线一区| 日韩一区二区三区四区| 亚洲成av人片一区二区梦乃| 99在线热播精品免费| 日本一区二区免费在线观看视频 | 91老司机福利 在线| 国产日产欧美一区二区三区| 国产在线一区二区综合免费视频| 91精品欧美一区二区三区综合在 | 日本一区二区成人| 国产成人在线视频网址| 欧美精品一区视频| 久久国产夜色精品鲁鲁99| 日韩视频永久免费| 久久黄色级2电影| 日韩欧美高清dvd碟片| 看片的网站亚洲| 久久蜜臀精品av| 国产精品99久久久久久宅男| 国产女人aaa级久久久级 | 不卡区在线中文字幕| 国产精品视频一二三区| av成人老司机| 亚洲欧美一区二区三区极速播放 | 亚洲人成电影网站色mp4| 99re这里都是精品| 一区二区三区高清| 欧美日本国产一区| 久久99精品一区二区三区 | 国产精品人妖ts系列视频| 成人亚洲一区二区一| 中文字幕一区二区三区四区不卡| 日本乱人伦一区| 日日骚欧美日韩| 久久精品亚洲精品国产欧美 | 久久精品久久99精品久久| 精品电影一区二区| fc2成人免费人成在线观看播放| 亚洲精品写真福利| 欧美一区二区在线播放| 国产精品资源在线观看| 亚洲视频在线一区观看| 欧美日韩一二三| 国产一区二区不卡老阿姨| 椎名由奈av一区二区三区| 欧美另类videos死尸| 国产一区二区在线观看免费| 亚洲色图制服丝袜| 欧美一区2区视频在线观看| 国产福利精品一区二区| 亚洲综合免费观看高清完整版 | 免费观看在线综合| 国产精品久久久久久妇女6080| 在线看国产日韩| 国产呦萝稀缺另类资源| 一区二区三区在线免费观看| 久久久综合网站| 欧美视频中文字幕| 成人精品国产福利| 天天综合日日夜夜精品| 国产精品卡一卡二卡三| 精品日韩一区二区三区| 91久久国产综合久久| 国产一区不卡在线| 日本亚洲免费观看| 亚洲中国最大av网站| 欧美激情一区在线观看| 日韩欧美国产系列| 欧美日韩午夜影院| 91视频xxxx| 国产一区二区不卡在线| 图片区小说区国产精品视频| 中文字幕不卡一区| 日韩一区二区三区在线观看 | 91丝袜高跟美女视频| 亚洲观看高清完整版在线观看| 国产精品久久久爽爽爽麻豆色哟哟 | 91浏览器在线视频| 美腿丝袜在线亚洲一区| 亚洲精品精品亚洲| 精品国产一区二区三区忘忧草| 成人av免费在线| 久久精品国产在热久久| 悠悠色在线精品| 久久精品一区八戒影视| 欧美一区二区三区在线观看| 欧美在线观看视频一区二区 | 天天色综合成人网| 中文字幕不卡在线| 日韩免费视频一区二区| 日韩色在线观看| 欧美日韩精品一区二区三区 | 日韩西西人体444www| 色94色欧美sute亚洲线路二| 国产夫妻精品视频| 六月丁香婷婷久久| 日韩精品电影一区亚洲| 亚洲日本va在线观看| 亚洲欧洲精品一区二区三区不卡| 亚洲精品一区二区三区精华液 | 国产精品嫩草影院com| 日韩视频一区在线观看| 在线91免费看| 欧美日韩国产首页| 欧美日韩一级片在线观看| 在线视频一区二区三| 91蜜桃在线观看| 99re热视频精品| 成人一区二区三区在线观看| 国产999精品久久久久久 | 中文一区二区完整视频在线观看| 中文字幕免费不卡在线| 国产欧美一区二区精品忘忧草 | 色天天综合色天天久久| 99国产精品一区| 99精品视频在线免费观看| 99国产麻豆精品| 91浏览器在线视频| 91免费视频网| 欧美亚洲尤物久久| 欧美三级韩国三级日本一级| 欧美日韩亚洲综合在线 | 日韩视频一区二区| 精品久久久久久最新网址| 精品国产成人系列| 久久精品一区蜜桃臀影院| 久久亚洲一区二区三区四区| 亚洲欧洲韩国日本视频| 亚洲一区二区三区在线看| 亚洲国产精品天堂| 男男视频亚洲欧美| 国产精品一区二区三区网站| 国产精品18久久久| 91成人在线观看喷潮| 6080日韩午夜伦伦午夜伦| 2欧美一区二区三区在线观看视频| 久久久精品一品道一区| 中文字幕制服丝袜成人av| 亚洲国产裸拍裸体视频在线观看乱了| 日韩**一区毛片| 成人中文字幕电影| 在线观看免费亚洲| 日韩欧美一区二区视频| 国产丝袜在线精品| 亚洲精品国产a| 国产成人精品亚洲午夜麻豆| 成人黄色av网站在线| 91在线无精精品入口| 7878成人国产在线观看| 久久欧美中文字幕| 亚洲一区二区三区影院| 青青草成人在线观看| 色偷偷一区二区三区| 欧美一区二区免费视频| 国产精品你懂的在线| 偷拍一区二区三区| 激情综合五月天| 在线成人高清不卡| 国产精品乱码一区二三区小蝌蚪| 亚洲成人在线网站| 国产成人福利片| 在线综合亚洲欧美在线视频| 亚洲男同性视频| 国产精品亚洲专一区二区三区| 欧美日韩一卡二卡| 中国色在线观看另类| 日韩黄色一级片| 欧美性视频一区二区三区| 国产偷国产偷亚洲高清人白洁| 亚洲超碰97人人做人人爱| 风间由美一区二区三区在线观看| 欧美日韩在线三区| 久久久久综合网| 国产精品18久久久久久vr| 7777精品伊人久久久大香线蕉完整版 | 日韩精品一区二区三区视频| 污片在线观看一区二区| 在线视频你懂得一区|