欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
WIN32匯編: 27.工具提示控件

第27課 工具提示控件


我們將學(xué)習工具提示控件:它是什么如何創(chuàng )建和使用.下載例子

理論:

工具提示是當鼠標在某特定區域上停留時(shí)顯示的一個(gè)矩形窗口.工具提示窗口包含一些編程者想要顯示的文本.在這點(diǎn)上,工具提示同狀態(tài)欄的作用是一樣的,所不同的是工具提示當單擊或者遠離指定區域的時(shí)候就會(huì )消逝,你可能熟悉與工具欄相關(guān)聯(lián)的工具提示,那些"提示"是工具欄控件提供的便利.如果你想要在其它窗口、控件中顯示工具提示的話(huà),就不得不自己創(chuàng )建他們.

既然已經(jīng)了解了什么是工具提示,就讓我們來(lái)看看如何創(chuàng )建他們.大致步驟如下:

  1. 用CreateWindowEx函數創(chuàng )建工具提示控件.
  2. 定義一個(gè)工具提示控件將要監視鼠標移動(dòng)的區域.
  3. 將區域傳遞給工具提示控件
  4. 將傳遞區域的鼠標消息轉送給工具提示控件.(這步或許更早,具體依據轉播消息的方法)
下面我們就來(lái)詳細的討論每一步.

工具提示控件的創(chuàng )建

工具提示控件是一種通用控件.同樣,要在源代碼某處調用InitCommonControls以便MASM能夠將你的程序和comctl32.dll連接. 用CreateWindowEx創(chuàng )建工具提示控件,典型代碼如下:
.data
TooltipClassName db "Tooltips_class32",0
.code
.....
invoke InitCommonControls
invoke CreateWindowEx, NULL, addr TooltipClassName, NULL, TIS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL
注意窗口風(fēng)格:TIS_ALWAYSTIP指定了工具提示不管包含指定區域的窗口狀態(tài)如何,當鼠標移過(guò)指定區域的時(shí)候,工具提示總是顯示.簡(jiǎn)單的說(shuō)就是,即使窗口處于非激活狀態(tài),鼠標移過(guò)工具提示指定區域的時(shí)候,工具提示也會(huì )出現.
你不必在CreateWindowEx中包括WS_POPUPWS_EX_TOOLWINDOW風(fēng)格,因為工具提示處理過(guò)程會(huì )自動(dòng)加上,你也不必指定工具提示窗口的坐標和寬高,控件會(huì )依據要顯示的文字自動(dòng)調節.四個(gè)參數,均使用CW_USEDEFAULT ,其余的參數都不太重要.

指定工具

工具提示控件創(chuàng )建了但還沒(méi)有顯示,我們想要當鼠標指針在某個(gè)區域之上時(shí)顯示工具提示窗口.現在需要指定這個(gè)區域.我們稱(chēng)這樣的區域為"工具",“工具”就是工具提示控件監視鼠標指針是否移過(guò)的位于窗口客戶(hù)區的一個(gè)方形區域.如果鼠標指針移過(guò)"工具",工具提示窗口就顯示."工具"可覆蓋整個(gè)客戶(hù)區或者僅僅是它的一部分.因此我們把"工具"分成兩種類(lèi)型,一種是作為一個(gè)窗口,另一種則是某窗口客戶(hù)區的一部分.兩種各有所用.覆蓋整個(gè)客戶(hù)區的"工具"通常用于按鈕、編輯控件等,你不必指定焦點(diǎn)域的坐標和大小:它被假定為窗口的整個(gè)客戶(hù)區.僅覆蓋窗口客戶(hù)區一部分的"工具"在你想把窗口客戶(hù)區分成幾個(gè)部分但又不想使用子窗口時(shí)特別有用,但需要指定左上角的坐標和寬高.

使用如下的 TOOLINFO 結構定義"工具":

TOOLINFO STRUCT
  cbSize             DWORD      ?
  uFlags             DWORD      ?
  hWnd               DWORD      ?
  uId                DWORD      ?
  rect               RECT      <>
  hInst              DWORD      ?
  lpszText           DWORD      ?
  lParam             LPARAM     ?
TOOLINFO ENDS
域名說(shuō)明
cbSizeTOOLINFO結構的大小.必須填充, 如果這個(gè)區域不被正確填充Windows并不會(huì )報錯,但你會(huì )得到不可預料的奇怪結果.
uFlags指定焦點(diǎn)域的屬性,可以是如下標志的聯(lián)合:
  • TTF_IDISHWND  "ID is hWnd".如果你指定了這個(gè)標志,就意味著(zhù)你要使用覆蓋整個(gè)客戶(hù)區的"工具" (上面第一種"工具"). 如果你使用了這個(gè)標志,你必須用你要使用的窗口句柄填充uId成員,如果你不指定這個(gè)成員,就意味著(zhù)你要使用第二種"工具"、客戶(hù)區窗口的一方形區域.在這種情況下,你就必須以方形區域的大小填充rect成員.
  • TTF_CENTERTIP  通常工具提示窗口顯示在鼠標的右下方,如果你指定了這個(gè)標志,不管鼠標的位置如何,工具提示總顯示在焦點(diǎn)域總的中下方.
  • TTF_RTLREADING  .如果你的程序不是為阿拉伯或者希伯來(lái)語(yǔ)系統設計的,你完全可以不理它,它使得提示文本以從右至左的順序顯示,在其它系統中無(wú)效.
  • TTF_SUBCLASS  如果你使用了這個(gè)標志,工具提示控件將子類(lèi)化"工具"所在窗口以便截取發(fā)送給它的的鼠標消息,這個(gè)標志非常有用,否則你將不得不做更多的工作來(lái)向工具提示控件轉發(fā)消息.
hWnd包含"工具"的窗口句柄,如果你指定了TTF_IDISHWND標志,Windows將忽略該值,而使用uId成員的值作為窗口句柄.你需要填充這個(gè)域域如果:
  • 你不使用 TTF_IDISHWND標志 (換句話(huà)說(shuō),你使用局部"工具")
  • 你在 lpszText 成員中指定了LPSTR_TEXTCALLBACK .這個(gè)值告訴工具提示控件當需要顯示提示窗口時(shí),必須向包含"工具"的窗口查詢(xún)應該顯示什么. 這是一種實(shí)時(shí)的控件文本更新.如果你需要動(dòng)態(tài)改變提示文本,你應當在 lpszText成員中指定LPSTR_TEXTCALLBACK值,控件就會(huì )向hWnd指定的窗口發(fā)送TTN_NEEDTEXT 消息.
uId這個(gè)域的值可能有兩種含義,依 uFlags 是否包含TTF_IDISHWND.
  • 如果TTF_IDISHWND標志沒(méi)有被指定就代表應用程序定義的"工具"ID,由于這意味著(zhù)你使用僅覆蓋客戶(hù)區一部分的"工具",邏輯的推出一個(gè)客戶(hù)區可能存在多個(gè)同樣的焦點(diǎn)域(不存在交迭),Hwnd成員的一個(gè)窗口句柄就不夠了,應用程序定義ID以區分他們因此而顯得必要,只要唯一ID可以是任何值.
  • 如果TTF_IDISHWND標志被指定就表示整個(gè)客戶(hù)區都作為焦點(diǎn)域的窗口句柄,你或許會(huì )奇怪為什么不用上面提到的hWnd成員的值來(lái)儲存窗口句柄.答案是:如果lpszText指定為LPSTR_TEXTCALLBACK,Hwnd 可能已經(jīng)被填充了.還有提供提示文本的窗口和包含"工具"的窗口可能不是同一個(gè)!(你可以設計一個(gè)提供兩種服務(wù)的窗口程序,但太嚴格了,在這點(diǎn)上,微軟為我們提供了更大的自由,歡呼吧!)
rect指定"工具"大小的rect結構.這個(gè)結構定義了一個(gè)以hWnd指定窗口客戶(hù)區左上角為基點(diǎn)的方形大小,簡(jiǎn)言之,如果你想指定客戶(hù)區的一部分作為"工具"就得填充這個(gè)結構,如果你指定了TTF_IDISHWND標志 ,控件就會(huì )忽略這個(gè)值.(你已經(jīng)選擇整個(gè)客戶(hù)區作為"工具")
hInst如果lpszText指定了字符串資源的標識,包含將作為工具提文本字符串資源的實(shí)例句柄.聽(tīng)起來(lái)有點(diǎn)費解,閱讀一下lpszText的說(shuō)明就可以明白這個(gè)域是干什么用的了.若lpszText不包含字符串資源標識,控件會(huì )忽略這個(gè)域.
lpszText這個(gè)域可以有如下幾個(gè)值:
  • 如果指定為LPSTR_TEXTCALLBACK, 工具提示控件就會(huì )向HWnd窗口發(fā)送TTN_NEEDTEXT消息以獲得將要顯示的字符串.提示文本的動(dòng)態(tài)更新方法:每次顯示提示窗口都改變提示文本.
  • 如果在這個(gè)域中指定字符串資源標識,當控件要在提示窗口中顯示提示文本時(shí),就搜索hInst成員標識的實(shí)例的字符串資源列表.由于字符串資源列表標識總是16位值,這個(gè)域的高字節將永遠為0,這種方法在你想移植程序時(shí)非常有用,由于字符串資源以腳本形式定義,你不必修改源代碼.只需要修改字符串列表提示文本就會(huì )相應改變,而不必擔心引進(jìn)bugs.
  • 如果這個(gè)域的值不是LPSTR_TEXTCALLBACK并且高字節不為零, 控件截取這個(gè)值作為提示文本的指針,這是最簡(jiǎn)單的方法但也最不穩定.通過(guò)檢查高字節區分字符串資源標識.

總言之,你需要將TOOLINFO結構傳遞給工具提示控件之前填充填充好,它描述了你期望的"工具"屬性.

向工具提示控件注冊"工具"

填充完TOOLINFO結構后, 必須將其傳遞給控件 . 一個(gè)工具提示控件可以控制很多"工具",因此不必為一個(gè)窗口創(chuàng )建很多控件,為了注冊"工具",向控件發(fā)送TTM_ADDTOOL消息 wParam不使用,lParam必須包含要注冊的TOOLINFO結構的指針
.data?
ti TOOLINFO <>
.......
.code
.......
<fill the TOOLINFO structure>
.......
invoke SendMessage, hwndTooltip, TTM_ADDTOOL, NULL, addr ti
成功返回 TRUE,否則返回 FALSE.
發(fā)送 TTM_DELTOOL消息取消注冊.

向工具提示控件轉發(fā)鼠標消息

以上步驟完畢之后,控件知道了應當監視那一塊區域和應該在提示窗口顯示什么.唯一缺乏的就是激發(fā)機制. 想想看:"工具"指定的其它窗口的客戶(hù)區的區域.控件如何截取發(fā)送向該窗口的消息呢?實(shí)際中需要截取消息以便了解鼠標停留了多長(cháng)時(shí)間,當指定時(shí)間流逝以后,控件顯示提示窗口.有兩種方法: 一種需要包含"工具"窗口的合作,另一種則不需要.
  • 包含"工具"的窗口必須向控件發(fā)送 TTM_RELAYEVENT 以轉發(fā)消息. lParam是指向要轉發(fā)消息MSG的指針 控件僅處理如下鼠標消息 :
    • WM_LBUTTONDOWN
    • WM_MOUSEMOVE
    • WM_LBUTTONUP
    • WM_RBUTTONDOWN
    • WM_MBUTTONDOWN
    • WM_RBUTTONUP
    • WM_MBUTTONUP
    其它消息全被忽略,因此包含"工具"的窗口的處理過(guò)程必須包含像這樣的選擇:

    WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    .......
        if uMsg==WM_CREATE
            .............
        elseif uMsg==WM_LBUTTONDOWN || uMsg==WM_MOUSEMOVE || uMsg==WM_LBUTTONUP || uMsg==WM_RBUTTONDOWN || uMsg==WM_MBUTTONDOWN || uMsg==WM_RBUTTONUP || uMsg==WM_MBUTTONUP
            invoke SendMessage, hwndTooltip, TTM_RELAYEVENT, NULL, addr msg
            ..........

  • .你可以在TOOLINFO結構的uFlags成員指定 TTF_SUBCLASS標志。此標志告訴控件子類(lèi)化包含"工具"的窗口以便無(wú)需窗口的協(xié)作便可捕獲鼠標消息。由于除了控件自己處理截獲的鼠標消息和指定TTF_SUBCLASS標志之外不用編寫(xiě)多余的代碼,因此很易于使用。
就是這些了,到這步為止,控件已經(jīng)全功能了.還有幾個(gè)你應當知道的相關(guān)消息.
  • TTM_ACTIVATE.如果你想動(dòng)態(tài)的允許或者禁止工具提示控件,這個(gè)小消息就是為你而備.wParam值為TRUE,允許控件.若為FALSE,禁止控件.控件初始創(chuàng )建的時(shí)候無(wú)需發(fā)送消息激活他,便被自動(dòng)設為允許狀態(tài).
  • TTM_GETTOOLINFO and TTM_SETTOOLINFO. 如果你想在把TOOLINFO結構傳遞給控件之后獲得或者改變其值,使用此消息.你需要用正確的uId and hWnd值指定要改變的"工具".如果你只想改變r(jià)ect成員的值,使用TTM_NEWTOOLRECT 消息,如果僅想改變提示文本,使用TTM_UPDATETIPTEXT消息.
  • TTM_SETDELAYTIME. 使用此消息指定控件顯示提示文本時(shí)的時(shí)間延遲.

例子:

例子是一個(gè)有兩個(gè)按鈕的對話(huà)框,對話(huà)框的客戶(hù)區分為4部分:左上、右上、左下、右下.每個(gè)區域都指定為有自己提示文本的"工具",兩個(gè)按鈕也有自己的提示文本.

.386
.model flat,stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include /masm32/include/comctl32.inc
includelib /masm32/lib/comctl32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
EnumChild proto :DWORD,:DWORD
SetDlgToolArea proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.const
IDD_MAINDIALOG equ 101
.data
ToolTipsClassName db "Tooltips_class32",0
MainDialogText1 db "This is the upper left area of the dialog",0
MainDialogText2 db "This is the upper right area of the dialog",0
MainDialogText3 db "This is the lower left area of the dialog",0
MainDialogText4 db "This is the lower right area of the dialog",0
.data?
hwndTool dd ?
hInstance dd ?
.code
start:
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,IDD_MAINDIALOG,NULL,addr DlgProc,NULL
    invoke ExitProcess,eax

DlgProc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    LOCAL ti:TOOLINFO
    LOCAL id:DWORD
    LOCAL rect:RECT
    .if uMsg==WM_INITDIALOG
        invoke InitCommonControls
        invoke CreateWindowEx,NULL,ADDR ToolTipsClassName,NULL,/
            TTS_ALWAYSTIP,CW_USEDEFAULT,/
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,/
            hInstance,NULL
        mov hwndTool,eax
        mov id,0
        mov ti.cbSize,sizeof TOOLINFO
        mov ti.uFlags,TTF_SUBCLASS
        push hDlg
        pop ti.hWnd
        invoke GetWindowRect,hDlg,addr rect
        invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText1,id,addr rect
        inc id
        invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText2,id,addr rect
        inc id
        invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText3,id,addr rect
        inc id
        invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText4,id,addr rect
        invoke EnumChildWindows,hDlg,addr EnumChild,addr ti


    .elseif uMsg==WM_CLOSE
        invoke EndDialog,hDlg,NULL
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
DlgProc endp

EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD
    LOCAL buffer[256]:BYTE
    mov edi,lParam
    assume edi:ptr TOOLINFO
    push hwndChild
    pop [edi].uId
    or [edi].uFlags,TTF_IDISHWND
    invoke GetWindowText,hwndChild,addr buffer,255
    lea eax,buffer
    mov [edi].lpszText,eax
    invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,edi
    assume edi:nothing
    ret
EnumChild endp

SetDlgToolArea proc uses edi esi hDlg:DWORD,lpti:DWORD,lpText:DWORD,id:DWORD,lprect:DWORD
    mov edi,lpti
    mov esi,lprect
    assume esi:ptr RECT
    assume edi:ptr TOOLINFO
    .if id==0
        mov [edi].rect.left,0
        mov [edi].rect.top,0
        mov eax,[esi].right
        sub eax,[esi].left
        shr eax,1
        mov [edi].rect.right,eax
        mov eax,[esi].bottom
        sub eax,[esi].top
        shr eax,1
        mov [edi].rect.bottom,eax
    .elseif id==1
        mov eax,[esi].right
        sub eax,[esi].left
        shr eax,1
        inc eax
        mov [edi].rect.left,eax
        mov [edi].rect.top,0
        mov eax,[esi].right
        sub eax,[esi].left
        mov [edi].rect.right,eax
        mov eax,[esi].bottom
        sub eax,[esi].top
        mov [edi].rect.bottom,eax
    .elseif id==2
        mov [edi].rect.left,0
        mov eax,[esi].bottom
        sub eax,[esi].top
        shr eax,1
        inc eax
        mov [edi].rect.top,eax
        mov eax,[esi].right
        sub eax,[esi].left
        shr eax,1
        mov [edi].rect.right,eax
        mov eax,[esi].bottom
        sub eax,[esi].top
        mov [edi].rect.bottom,eax
    .else
        mov eax,[esi].right
        sub eax,[esi].left
        shr eax,1
        inc eax
        mov [edi].rect.left,eax
        mov eax,[esi].bottom
        sub eax,[esi].top
        shr eax,1
        inc eax
        mov [edi].rect.top,eax
        mov eax,[esi].right
        sub eax,[esi].left
        mov [edi].rect.right,eax
        mov eax,[esi].bottom
        sub eax,[esi].top
        mov [edi].rect.bottom,eax
    .endif
    push lpText
    pop [edi].lpszText
    invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,lpti
    assume edi:nothing
    assume esi:nothing
    ret
SetDlgToolArea endp


end start

分析:

創(chuàng )建主對話(huà)框窗口之后,使用CreateWindowEx創(chuàng )建工具提示控件.

invoke InitCommonControls
invoke CreateWindowEx,NULL,ADDR ToolTipsClassName,NULL,/
       TTS_ALWAYSTIP,CW_USEDEFAULT,/
       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,/
       hInstance,NULL
mov hwndTool,eax
  

之后,我們繼續定義對話(huà)框四個(gè)角作為焦點(diǎn)域.

mov id,0        ; 焦點(diǎn)域ID
    mov ti.cbSize,sizeof TOOLINFO
    mov ti.uFlags,TTF_SUBCLASS    ; 告訴控件子類(lèi)化窗口.
    push hDlg
    pop ti.hWnd    ; 包含焦點(diǎn)域的窗口句柄
    invoke GetWindowRect,hDlg,addr rect    ; 獲得客戶(hù)區的大小
    invoke SetDlgToolArea,hDlg,addr ti,addr MainDialogText1,id,addr rect

我們初始化TOOLINFO結構. 注意我們要把客戶(hù)區分成4個(gè)焦點(diǎn)域,因此我們需要知道客戶(hù)區的大小,所以調用GetWindowRect.因為我們不想自己向控件轉發(fā)消息,因此指定TIF_SUBCLASS 標志.
SetDlgToolArea 是計算焦點(diǎn)域矩形范圍的并向控件注冊的函數,我不詳細解釋計算過(guò)程.只說(shuō)明它把對話(huà)框分成4個(gè)焦點(diǎn)域.然后向控件發(fā)送TTM_ADDTOOL 消息, 在lParam參數中傳遞TOOLINFO結構的地址.

    invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,lpti

在四個(gè)控件注冊之后,我們來(lái)看看對話(huà)框的按鈕,我們可以用ID來(lái)處理每個(gè)按鈕,但是實(shí)在太乏味了.我們使用EnumChildWindows函數列舉對話(huà)框上的所有控件并把他們注冊給控件,EnumChildWindows原型如下:

EnumChildWindows proto hWnd:DWORD, lpEnumFunc:DWORD, lParam:DWORD

hWnd 是父窗口句柄.

lpEnumFunc 是每個(gè)控件將調用的EnumChildProc函數地址.lParam 是應用程序定義的要傳給EnumChildProc 函數的值. EnumChildProc 函數定義如下:

EnumChildProc proto hwndChild:DWORD, lParam:DWORD
hwndChild是EnumChildWindows函數枚舉的句柄. lParam 就是你傳遞給EnumChildWindows函數的同一個(gè)lParam.
在例子中.我們如此調用 EnumChildWindows 函數:
invoke EnumChildWindows,hDlg,addr EnumChild,addr ti
我們把TOOLINFO結構的地址放在lParam參數中傳遞,是因為我們要在EnumChild函數中注冊每個(gè)子控件.如果我們不使用這種方法,就需要將ti聲明為全局變量,但這可能會(huì )引入很多bug.
當我們調用 EnumChildWindows時(shí), Windows會(huì )枚舉出對話(huà)框上所有的子控件并為每個(gè)子控件調用一次EnumChild f函數. 這樣如果我們的對話(huà)框有兩個(gè)控件,EnumChild將被調用兩次.
EnumChild 函數填充TOOLINFO 結構的相應成員并向控件注冊.
EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD
    LOCAL buffer[256]:BYTE
    mov edi,lParam
    assume edi:ptr TOOLINFO
    push hwndChild
    pop [edi].uId    ; we use the whole client area of the control as the tool
    or [edi].uFlags,TTF_IDISHWND
    invoke GetWindowText,hwndChild,addr buffer,255
    lea eax,buffer    ; use the window text as the tooltip text
    mov [edi].lpszText,eax
    invoke SendMessage,hwndTool,TTM_ADDTOOL,NULL,edi
    assume edi:nothing
    ret
EnumChild endp
注意在例子中,我們使用了一種不同"工具":覆蓋整個(gè)客戶(hù)區的"工具",因此我們需要用包含"工具"窗口的句柄來(lái)填充uID成員,也必須在uFlags 成員中指定TTF_IDISHWND標志.                    
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
WIN32匯編: 31.列表視圖控件
RichEdit 控件:語(yǔ)法高亮顯示
PE教程6: Import Table(引入表)
把我的第一個(gè)匯編程序(QQ自動(dòng)群發(fā)器)源碼與和我一樣初級的編程愛(ài)好者共享
PE文件格式--------------基本結構信息
【新提醒】獲取并顯示當前內存使用情況(支持4G以上內存),Win32匯編語(yǔ)言案例解析,典型案例解析(VIP免費),魚(yú)C論壇
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久