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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
   關(guān)于系統(tǒng)托盤圖標(biāo)類,網(wǎng)上也有很多的代碼,但都不太簡潔靈活易用,為了這一目的,本人自行封裝了一個(gè)API版本的實(shí)現(xiàn)類,這個(gè)類的設(shè)計(jì)思想來源于觀察者模式,從而較好地解耦了托盤通知消息的發(fā)送、接收、處理這三者間的關(guān)系,使這三者可以是同一個(gè)對(duì)象,也可以是不同的對(duì)象,具體的情況可根據(jù)業(yè)務(wù)邏輯靈活選擇控制,主要包括以下幾方面的特點(diǎn):
1)對(duì)于托盤通知消息的接收處理,提供了一個(gè)默認(rèn)常用的實(shí)現(xiàn),也就是通知消息接收由托盤類對(duì)象本身接收,消息事件的處理也由托盤對(duì)象本身處理,雙擊圖標(biāo)顯示某個(gè)窗口,右鍵單擊圖標(biāo)顯示快捷菜單。
2)支持事件處理擴(kuò)展,有兩種方法,一是提供一個(gè)接口設(shè)置消息事件處理器,從而將處理邏輯轉(zhuǎn)到其它對(duì)象,這個(gè)對(duì)象要支持消息事件處理器接口約定;二是提供消息事件處理的虛函數(shù)回調(diào),可由派生類重寫定制。
3)托盤圖標(biāo)ID的管理,ID為UINT類型整數(shù),一個(gè)對(duì)象對(duì)應(yīng)一個(gè)ID,每當(dāng)對(duì)象創(chuàng)建時(shí),分配一個(gè),從1開始,為防止沖突造成托盤圖標(biāo)創(chuàng)建失敗,當(dāng)對(duì)象銷毀時(shí),并不遞減ID計(jì)數(shù),因此ID一直是遞增的,這也是最簡單的方案。
4)支持內(nèi)部或外部窗口來接收通知消息,這兩種模式可以隨時(shí)相互轉(zhuǎn)換,一個(gè)托盤對(duì)象只對(duì)應(yīng)一個(gè)窗口,多個(gè)托盤對(duì)象可以對(duì)應(yīng)同一個(gè)窗口。如果是內(nèi)部窗口,那么內(nèi)部窗口是全局的有且僅有一個(gè),由其窗口過程根據(jù)托盤ID將消息分發(fā)到對(duì)應(yīng)的托盤對(duì)象。如果是外部窗口,那么可以由外部窗口自己處理,也可以調(diào)用托盤類的方法轉(zhuǎn)到其它對(duì)象處理。

   下面來看下基本托盤圖標(biāo)類的接口定義:
 1#ifndef _BASIC_TRAYICON_H
 2#define _BASIC_TRAYICON_H
 3
 4#include "trayicon_msg_handler.h"
 5#include <shellapi.h>
 6#include <map>
 7
 8extern const UINT WM_TRAY_NOTIFY_MSG;
 9
10class CBasicTrayIcon : public CTrayMsgDefaultHandler
11{
12public:
13    CBasicTrayIcon();
14    virtual    ~CBasicTrayIcon();
15
16    bool Create(HWND hNotifyWnd=NULL);
17    void Destroy();
18
19    bool SetNotifyWnd(HWND hWnd);
20    void SetMsgHandler(ITrayMsgHandler* pMsgHandler);
21
22    bool SetIcon(HICON hIcon);
23    bool SetIcon(LPCTSTR lpIconName);
24    bool SetIcon(UINT uID);
25    bool SetTooltipText(LPCTSTR lpText);
26    bool SetTooltipText(UINT uID);
27
28    UINT GetID() const;
29    HICON GetIcon() const;
30    LPCTSTR GetTooltipText() const;
31
32    void Show();
33    void Hide();
34
35public:
36    static CBasicTrayIcon* FromID(UINT uID);
37    void OnNotify(UINT uEvent);
38    
39private:
40    static LRESULT CALLBACK NotifyWndProc(HWND, UINT, WPARAM, LPARAM);
41    static bool RegisterNotifyWndClass();
42    static bool CreateNotifyWindow();
43    static HWND s_hNotifyWnd;
44    static UINT s_uIDCount;
45    static std::map<UINT,CBasicTrayIcon*> s_trayicons;
46
47private:
48    NOTIFYICONDATA     m_tnd;
49    ITrayMsgHandler* m_pMsgHandler;
50}
;
51
52#endif
   從上可看出,CBasicTrayIcon從通知消息事件默認(rèn)處理器CTrayMsgDefaultHandler繼承,也就是說CBasicTrayIcon類已實(shí)現(xiàn)了消息事件的默認(rèn)處理。下面說明幾個(gè)重要的類方法
   1)Create---創(chuàng)建托盤圖標(biāo),請(qǐng)注意這里只是創(chuàng)建,沒有關(guān)聯(lián)圖標(biāo),因此在任務(wù)欄上并不會(huì)顯示,要顯示需要接著調(diào)用SetIcon系列方法,參數(shù)hWnd為托盤通知消息接收窗口,默認(rèn)為NULL,當(dāng)為NULL的時(shí)候,則會(huì)創(chuàng)建一個(gè)內(nèi)部隱藏的窗口來接收消息,否則由其指定的外部窗口來接收托盤通知消息。如果成功那么返回true,否則返回false。
   2)Destroy---銷毀托盤圖標(biāo)。
   3)SetNotifyWnd---設(shè)置通知消息接收窗口,當(dāng)參數(shù)hWnd為NULL時(shí),則轉(zhuǎn)移到內(nèi)部窗口接收通知消息,否則轉(zhuǎn)為其指定的外部窗口接收通知消息。因此,這個(gè)方法實(shí)現(xiàn)了特點(diǎn)4。
   4)SetMsgHandler---設(shè)置托盤通知消息處理器,參數(shù)pMsgHandler為ITrayMsgHandler指針類型,當(dāng)其為NULL時(shí),則處理為其指定的消息事件處理器,否則為托盤對(duì)象自己。因此,這個(gè)方法實(shí)現(xiàn)了特點(diǎn)2。
   5)SetIcon---設(shè)置托盤圖標(biāo),有3個(gè)重載形式,如果成功那么返回true,否則返回false。
   6)SetToolipText---設(shè)置提示文本,有2個(gè)重載形式,如果成功返回true,否則返回false。
   7)Show---顯示托盤圖標(biāo),具體的內(nèi)部實(shí)現(xiàn)根據(jù)_WIN_IE的版本而定,如果成功返回true,否則返回fasle。
   8)Hide---隱藏托盤圖標(biāo),具體的內(nèi)部實(shí)現(xiàn)根據(jù)_WIN_IE的版本而定,如果成功返回true,否則返回fasle。
   9)FromID---這是個(gè)靜態(tài)方法,從ID轉(zhuǎn)換為托盤對(duì)象,如果成功那么返回對(duì)應(yīng)的指針,否則返回NULL。
   10)OnNotify---通知消息事件分發(fā)處理。公開方法9和10,是為了支持由外部窗口接收通知消息時(shí)可以轉(zhuǎn)交給其它對(duì)象的靈活性(見特點(diǎn)4)。這個(gè)類默認(rèn)實(shí)現(xiàn)消息的處理者為托盤對(duì)象自己,即m_pMsgHandler在構(gòu)造時(shí)指向它自己。

   接下來,看下消息事件處理器的接口定義:
 1#ifndef _TRAYICON_MSG_HANDLER_H
 2#define _TRAYICON_MSG_HANDLER_H
 3
 4struct ITrayMsgHandler
 5{
 6    virtual ~ITrayMsgHandler() {}
 7    virtual void OnMouseMove() {}
 8    virtual void OnLButtonDown() {}
 9    virtual void OnLButtonDblclk() {}
10    virtual void OnRButtonUp() {}
11    virtual void OnRButtonDown() {}
12}
;
13
14class CTrayMsgDefaultHandler : public ITrayMsgHandler
15{
16public:
17    CTrayMsgDefaultHandler();
18    virtual ~CTrayMsgDefaultHandler();
19
20    bool SetMenu(UINT uID);
21    bool SetMenu(LPCTSTR lpName);
22    void SetMenuOwnWnd(HWND hWnd);
23
24protected:
25    virtual void OnLButtonDblclk();
26    virtual void OnRButtonUp();
27
28    bool ShowMenu();
29    void DestroyMenu();
30
31protected:
32    HWND  m_hOwnWnd;
33    HMENU m_hMenu;
34}
;
35
36#endif
nbsp;  從上可知,很顯然,托盤消息事件處理器接口ITrayMsgHandler為5種鼠標(biāo)事件提供了空實(shí)現(xiàn),而CTrayMsgDefaultHandler默認(rèn)處理器實(shí)現(xiàn)了鼠標(biāo)左鍵雙擊(顯示m_hOwnWnd指定的窗口)和右鍵單擊的行為(彈出上下文菜單),因此這個(gè)類實(shí)現(xiàn)了特點(diǎn)1,在使用時(shí)要先調(diào)用SetMenu方法來設(shè)置菜單ID或名稱以創(chuàng)建菜單,調(diào)用SetMenuOwnWnd方法來設(shè)置菜單擁有者窗口。如果需要特定的行為,那么依上文特點(diǎn)2所述,從CBasicTrayIcon或者ITrayMsgHandler派生子類實(shí)現(xiàn)那5種(或其中幾種)事件即可,對(duì)于后種方法,再調(diào)用CBasicTrayIcon::SetMsgHandler方法設(shè)置為新的特定消息事件處理器。

   最后,列出CBasicTrayIcon的源碼,如下所示
  1#include "stdafx.h"
  2#include "basic_trayicon.h"
  3using namespace std;
  4
  5HWND CBasicTrayIcon::s_hNotifyWnd = NULL;
  6UINT CBasicTrayIcon::s_uIDCount = 0;
  7map<UINT,CBasicTrayIcon*> CBasicTrayIcon::s_trayicons;
  8
  9const UINT WM_TRAY_NOTIFY_MSG = ::RegisterWindowMessage(_T("TrayNotifyMsg"));
 10
 11bool CBasicTrayIcon::RegisterNotifyWndClass()
 12{
 13    WNDCLASSEX wndclass;
 14
 15    wndclass.cbSize = sizeof(wndclass);    
 16    wndclass.style = CS_HREDRAW|CS_VREDRAW;    
 17    wndclass.lpfnWndProc = NotifyWndProc;    
 18    wndclass.cbClsExtra = 0;        
 19    wndclass.cbWndExtra = 0;        
 20    wndclass.hInstance = ::GetModuleHandle(NULL); 
 21    wndclass.hIcon = 0;
 22    wndclass.hCursor = 0;
 23    wndclass.hbrBackground = 0;
 24    wndclass.lpszMenuName = NULL;        
 25    wndclass.lpszClassName = _T("NotifyWndClass");
 26    wndclass.hIconSm = NULL;        
 27
 28    return 0!=::RegisterClassEx(&wndclass); 
 29}

 30
 31bool CBasicTrayIcon::CreateNotifyWindow()
 32{
 33    if (s_hNotifyWnd) return true;
 34
 35    if (!RegisterNotifyWndClass())
 36        return false;
 37
 38    s_hNotifyWnd = ::CreateWindowEx( 
 39        0,            
 40        _T("NotifyWndClass"),                
 41        _T(""),        
 42        WS_OVERLAPPEDWINDOW,        
 43        CW_USEDEFAULT,            
 44        CW_USEDEFAULT,                
 45        CW_USEDEFAULT,                
 46        CW_USEDEFAULT,                
 47        NULL,                        
 48        NULL,                
 49        ::GetModuleHandle(NULL),                
 50        NULL) ;            
 51    return NULL!=s_hNotifyWnd;
 52}

 53
 54CBasicTrayIcon* CBasicTrayIcon::FromID(UINT uID)
 55{
 56    map<UINT,CBasicTrayIcon*>::iterator iter = s_trayicons.find(uID);
 57    if (iter==s_trayicons.end()) 
 58        return NULL;
 59    return iter->second;
 60}

 61
 62void CBasicTrayIcon::OnNotify(UINT uEvent)
 63{
 64    switch(uEvent)
 65    
 66        case WM_LBUTTONDBLCLK: m_pMsgHandler->OnLButtonDblclk(); break;
 67        case WM_LBUTTONDOWN: m_pMsgHandler->OnLButtonDown(); break;
 68        case WM_RBUTTONDOWN: m_pMsgHandler->OnRButtonDown(); break;
 69        case WM_RBUTTONUP:   m_pMsgHandler->OnRButtonUp(); break;
 70        case WM_MOUSEMOVE:   m_pMsgHandler->OnMouseMove(); break;
 71    }

 72}

 73
 74LRESULT CALLBACK CBasicTrayIcon::NotifyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 75{
 76    if (uMsg==WM_TRAY_NOTIFY_MSG)
 77    {
 78        CBasicTrayIcon* p = CBasicTrayIcon::FromID(wParam);
 79        if (p) p->OnNotify(lParam);
 80        return 0;
 81    }

 82    return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
 83}

 84
 85CBasicTrayIcon::CBasicTrayIcon()
 86:m_pMsgHandler(this)
 87{
 88    m_tnd.uID = ++s_uIDCount;
 89    s_trayicons.insert(make_pair(m_tnd.uID,this));
 90}

 91
 92CBasicTrayIcon::~CBasicTrayIcon()
 93{
 94    s_trayicons.erase(m_tnd.uID);
 95    Destroy();
 96}

 97
 98bool CBasicTrayIcon::Create(HWND hNotifyWnd)
 99{
100    if (NULL==hNotifyWnd)
101    {
102        if (!CreateNotifyWindow())
103            return false;
104        hNotifyWnd = s_hNotifyWnd;
105    }

106    m_tnd.cbSize = sizeof(NOTIFYICONDATA);
107    m_tnd.hWnd = hNotifyWnd;
108    m_tnd.uCallbackMessage = WM_TRAY_NOTIFY_MSG;
109    m_tnd.uFlags = NIF_MESSAGE;
110    return Shell_NotifyIcon(NIM_ADD, &m_tnd);
111}

112
113void CBasicTrayIcon::Destroy()
114{
115    Shell_NotifyIcon(NIM_DELETE, &m_tnd);
116}

117
118bool CBasicTrayIcon::SetNotifyWnd(HWND hWnd)
119{
120    if (NULL==hWnd)
121    {
122        if (!CreateNotifyWindow())
123            return false;
124        hWnd = s_hNotifyWnd;
125    }

126    m_tnd.hWnd = hWnd;
127    m_tnd.uCallbackMessage = WM_TRAY_NOTIFY_MSG;
128    m_tnd.uFlags |= NIF_MESSAGE;
129    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
130}

131
132void CBasicTrayIcon::SetMsgHandler(ITrayMsgHandler* pMsgHandler)
133{
134    m_pMsgHandler = (pMsgHandler ? pMsgHandler : this);
135}

136
137bool CBasicTrayIcon::SetIcon(HICON hIcon)
138{
139    m_tnd.uFlags |= NIF_ICON;
140    m_tnd.hIcon = hIcon;
141    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
142}

143
144bool CBasicTrayIcon::SetIcon(LPCTSTR lpIconName)
145{
146    HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL),lpIconName);
147    return SetIcon(hIcon);
148}

149
150bool CBasicTrayIcon::SetIcon(UINT uID)
151{
152    HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(uID));
153    return SetIcon(hIcon);
154}

155
156bool CBasicTrayIcon::SetTooltipText(LPCTSTR lpText)
157{
158    m_tnd.uFlags |= NIF_TIP;
159    size_t min = std::min<size_t>(sizeof(m_tnd.szTip)/sizeof(TCHAR)-1,_tcslen(lpText));
160    _tcsncpy(m_tnd.szTip,lpText,min);
161    m_tnd.szTip[min] = _T('\0');
162    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
163}

164
165bool CBasicTrayIcon::SetTooltipText(UINT uID)
166{
167    TCHAR szBuf[sizeof(m_tnd.szTip)/sizeof(TCHAR)];
168    ::LoadString(GetModuleHandle(NULL),uID,szBuf,sizeof(szBuf)/sizeof(szBuf));
169    return SetTooltipText(szBuf);
170}

171
172UINT CBasicTrayIcon::GetID() const
173{
174    return m_tnd.uID;
175}

176
177HICON CBasicTrayIcon::GetIcon() const
178{
179    assert(m_tnd.uFlags&NIF_ICON);
180    return m_tnd.hIcon;
181}

182
183LPCTSTR CBasicTrayIcon::GetTooltipText() const
184{
185    assert(m_tnd.uFlags&NIF_TIP);
186    return m_tnd.szTip;
187}

188
189void CBasicTrayIcon::Show()
190{
191    DWORD dwFlag;
192#if (_WIN32_IE >= 0x0500)
193    m_tnd.uFlags |= NIF_STATE;
194    m_tnd.dwState = 0;
195    m_tnd.dwStateMask = NIS_HIDDEN;
196    dwFlag = NIM_MODIFY;
197#else
198    dwFlag = NIM_ADD;
199#endif
200    Shell_NotifyIcon(dwFlag,&m_tnd);
201}

202
203void CBasicTrayIcon::Hide()
204{
205    DWORD dwFlag;
206#if (_WIN32_IE >= 0x0500)
207    m_tnd.uFlags |= NIF_STATE;
208    m_tnd.dwState = NIS_HIDDEN;
209    m_tnd.dwStateMask = NIS_HIDDEN;
210    dwFlag = NIM_MODIFY;
211#else
212    dwFlag = NIM_DELETE;
213#endif
214    Shell_NotifyIcon(dwFlag,&m_tnd);
215}
   CTrayMsgDefaultHandler的源碼,如下所示
 1#include "stdafx.h"
 2#include "trayicon_msg_handler.h"
 3
 4CTrayMsgDefaultHandler::CTrayMsgDefaultHandler()
 5:m_hOwnWnd(NULL)
 6,m_hMenu(NULL)
 7{
 8}

 9
10CTrayMsgDefaultHandler::~CTrayMsgDefaultHandler()
11{
12    DestroyMenu();
13}

14
15bool CTrayMsgDefaultHandler::SetMenu(UINT uID)
16{
17    return SetMenu(MAKEINTRESOURCE(uID));
18}

19
20bool CTrayMsgDefaultHandler::SetMenu(LPCTSTR lpName)
21{
22    return m_hMenu=LoadMenu(GetModuleHandle(NULL),lpName);
23}

24
25void CTrayMsgDefaultHandler::SetMenuOwnWnd(HWND hWnd)
26{
27    m_hOwnWnd = hWnd;
28}

29
30bool CTrayMsgDefaultHandler::ShowMenu()
31{
32    assert(m_hMenu);
33    HMENU hSubMenu = GetSubMenu(m_hMenu,0);
34    if (NULL==hSubMenu) return false;
35
36    POINT pos;
37    GetCursorPos(&pos);
38    return ::TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_BOTTOMALIGN, pos.x, pos.y,0,m_hOwnWnd,NULL);
39}

40
41void CTrayMsgDefaultHandler::DestroyMenu()
42{
43    if (m_hMenu) ::DestroyMenu(m_hMenu);
44}

45
46void CTrayMsgDefaultHandler::OnLButtonDblclk()
47{
48    if (m_hOwnWnd&&::IsWindow(m_hOwnWnd))
49        ::ShowWindow(m_hOwnWnd,SW_RESTORE);
50}

51
52void CTrayMsgDefaultHandler::OnRButtonUp()
53{
54    ShowMenu();
55}

 

posted on 2011-12-04 03:15 春秋十二月 閱讀(1972) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            蜜臀99久久精品久久久久久软件| 国产午夜精品久久久久久久| 99精品免费| 欧美电影专区| 亚洲激情成人| 亚洲黄网站黄| 中日韩男男gay无套| 一区二区国产在线观看| 一本色道久久88亚洲综合88| 中文久久精品| 亚洲欧美在线免费观看| 久久精品二区三区| 欧美黄色免费| 国产精品捆绑调教| 黑人巨大精品欧美黑白配亚洲| 亚洲第一福利视频| 中文精品99久久国产香蕉| 欧美在线视频免费| 欧美成人午夜77777| 日韩视频不卡中文| 欧美在线一级va免费观看| 久久久视频精品| 欧美日韩大片| 国产在线国偷精品产拍免费yy| 亚洲国产日韩欧美在线图片| 亚洲素人在线| 老司机精品视频网站| 亚洲精品国产精品国自产观看| 亚洲欧美国产高清| 欧美国产一区二区| 国产亚洲一级高清| 亚洲一区二区毛片| 亚洲第一精品夜夜躁人人爽 | 久久综合伊人| 亚洲精品一区二区三区婷婷月| 亚洲欧美日韩视频二区| 欧美激情精品久久久六区热门| 国产日韩高清一区二区三区在线| 亚洲免费高清| 免费不卡中文字幕视频| 亚洲欧美日韩高清| 国产精品v欧美精品∨日韩| 亚洲国产另类精品专区| 老牛国产精品一区的观看方式| 亚洲网站在线播放| 欧美特黄一级大片| 一区二区国产精品| 亚洲三级免费观看| 欧美激情综合亚洲一二区| 亚洲高清影视| 狂野欧美性猛交xxxx巴西| 欧美一区二区精品| 午夜视频一区在线观看| 国模私拍一区二区三区| 亚洲欧美日韩电影| 亚洲精品欧美极品| 老司机亚洲精品| 尤物九九久久国产精品的特点| 性欧美长视频| 午夜精品久久久久久久99樱桃| 国产精品家庭影院| 午夜精品一区二区三区在线播放 | 午夜影视日本亚洲欧洲精品| 国产精品草草| 亚洲欧美一区二区三区久久| 一区二区三区四区五区精品| 国产精品theporn| 亚洲一区日韩在线| 中文欧美字幕免费| 国产精品一区二区在线观看| 欧美一区激情| 久久国产免费| 亚洲日本成人网| 亚洲精品一区二| 国产精品剧情在线亚洲| 午夜久久久久| 久久国产欧美| 日韩一级免费| 亚洲校园激情| 精品不卡在线| 亚洲国产成人不卡| 欧美色图一区二区三区| 欧美一级淫片aaaaaaa视频| 欧美在线一级视频| 亚洲精一区二区三区| 亚洲视频在线看| 伊人久久亚洲影院| avtt综合网| 狠狠色狠色综合曰曰| 亚洲高清在线| 国产精品美女黄网| 老司机免费视频久久| 欧美日韩高清在线观看| 欧美在线视频免费观看| 欧美 日韩 国产精品免费观看| 亚洲一区欧美| 久久综合网hezyo| 亚洲在线免费| 欧美成人r级一区二区三区| 亚洲一区二区三区成人在线视频精品| 亚洲欧美日韩在线高清直播| 亚洲国内在线| 亚洲在线视频免费观看| 亚洲精品欧洲| 欧美一二三视频| 亚洲精品之草原avav久久| 香蕉久久夜色精品国产使用方法 | 久久综合久色欧美综合狠狠| 欧美猛交免费看| 久久综合色88| 国产乱码精品一区二区三区忘忧草| 亚洲第一区中文99精品| 国产亚洲观看| 亚洲精品日产精品乱码不卡| 欧美精品成人在线| 在线观看日韩www视频免费| 亚洲国产精品成人精品| 国产伦精品一区二区三区免费迷| 欧美成人一区二区在线| 国产色产综合色产在线视频| 亚洲精品国产精品乱码不99| 精品91免费| 亚欧美中日韩视频| 亚洲综合视频在线| 欧美激情网友自拍| 久久影视三级福利片| 国产精品香蕉在线观看| 99re热精品| 99在线精品视频| 欧美福利一区| 蜜桃精品一区二区三区| 国产一区二区三区免费观看| 亚洲一区综合| 亚洲影院一区| 欧美色图天堂网| 亚洲免费观看高清在线观看| 亚洲精品欧美在线| 欧美激情视频在线播放| 亚洲欧洲一二三| 亚洲美女毛片| 欧美日韩亚洲激情| 一二三四社区欧美黄| 在线亚洲电影| 欧美日韩成人综合| 99精品欧美一区二区三区综合在线| 亚洲精品亚洲人成人网| 欧美韩日视频| 亚洲色图在线视频| 亚洲欧美影院| 国产日韩欧美| 久久一区二区三区国产精品| 免费观看一级特黄欧美大片| 91久久夜色精品国产九色| 欧美第一黄网免费网站| 亚洲免费观看高清完整版在线观看熊 | 亚洲第一毛片| 一区二区三区免费观看| 国产精品久久久久久久久久免费看 | 亚洲在线视频免费观看| 国产精品久久久99| 亚洲欧美日韩综合一区| 久久美女性网| 亚洲激情国产| 欧美三日本三级三级在线播放| 夜夜爽www精品| 亚洲深夜福利网站| 国产欧美视频一区二区| 性欧美18~19sex高清播放| 欧美sm重口味系列视频在线观看| 亚洲精品孕妇| 国产亚洲一区在线| 欧美激情一区二区三区| 午夜精品久久| 亚洲精品黄色| 久久久久国产精品人| 一区二区不卡在线视频 午夜欧美不卡'| 国产精品成人一区二区艾草| 久久精品欧洲| 一本大道久久a久久综合婷婷 | 精品成人免费| 欧美日韩午夜| 久久久青草婷婷精品综合日韩 | 精品电影在线观看| 欧美日韩伦理在线免费| 久久久亚洲国产天美传媒修理工 | 国产精品视频久久| 欧美成人资源| 欧美亚洲免费电影| 亚洲精品视频免费观看| 免费h精品视频在线播放| 亚洲欧美日韩国产成人| 亚洲国产三级在线| 国产日韩欧美在线播放| 欧美精品精品一区| 久久综合色一综合色88| 欧美一区二区三区免费观看视频| 亚洲精品在线一区二区| 美国十次成人| 久久久精品性| 欧美制服丝袜|