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

隨筆-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>
            亚洲国产另类久久精品| 玖玖在线精品| 91久久久久久久久久久久久| 欧美涩涩网站| 欧美激情在线观看| 欧美午夜一区二区三区免费大片 | 在线激情影院一区| 国产精品腿扒开做爽爽爽挤奶网站| 欧美成ee人免费视频| 久久久久久久一区二区三区| 欧美在线免费一级片| 久久国产婷婷国产香蕉| 久久亚裔精品欧美| 欧美理论电影在线观看| 欧美久久久久久久久| 欧美日韩国产色综合一二三四| 久久中文字幕一区| 久久综合伊人77777| 欧美不卡视频一区| 国产精品一区二区在线观看网站 | 国产欧美在线观看| 亚洲国产成人午夜在线一区| 亚洲精品美女在线观看播放| 亚洲在线网站| 亚洲国产裸拍裸体视频在线观看乱了| 欧美激情视频一区二区三区在线播放 | 欧美亚洲三级| 欧美刺激性大交免费视频| 国产精品视频免费在线观看| 亚洲国产欧美一区| 午夜欧美大片免费观看| 久久精品国产99精品国产亚洲性色 | 久久综合精品一区| 亚洲图片欧洲图片av| 欧美黄色免费网站| 国产亚洲综合精品| 亚洲欧美另类久久久精品2019| 老司机免费视频一区二区三区| 日韩午夜激情| 亚洲第一在线综合在线| 国产午夜亚洲精品理论片色戒| 亚洲国产精品成人一区二区| 亚洲国产综合在线| 欧美成人久久| 久久综合久色欧美综合狠狠| 狠狠入ady亚洲精品| 久久久久久久久久久久久9999| 亚洲在线网站| 韩国av一区二区| 久久亚洲色图| 欧美精品日韩一区| 亚洲午夜精品视频| 日韩天堂av| 欧美日韩中文字幕在线| 亚洲男人影院| 久久亚洲私人国产精品va媚药| 在线成人h网| 99视频有精品| 伊人久久久大香线蕉综合直播 | 国产日韩一区二区三区在线播放 | 亚洲欧美亚洲| 国产综合18久久久久久| 亚洲电影在线播放| 欧美日韩免费看| 久久精品一区二区三区四区| 久久婷婷久久一区二区三区| 一本色道久久综合亚洲91| 亚洲影院一区| 亚洲淫性视频| 欧美激情一区二区三区全黄| 亚洲欧美日韩中文播放| 欧美激情视频一区二区三区免费 | 亚洲精品视频一区| 久久精品电影| 久久精品免费电影| 国产精品一区二区三区成人| 亚洲精品在线一区二区| 亚洲韩国日本中文字幕| 欧美伊人影院| 美女久久一区| 在线视频国产日韩| 欧美一区二区三区免费在线看 | 国产人成精品一区二区三| 蜜臀av一级做a爰片久久| 国产麻豆综合| 久久精品亚洲乱码伦伦中文| 久久久精彩视频| 亚洲天堂成人| 午夜精品免费视频| 国产一区二区日韩精品欧美精品| 亚洲一区二区精品视频| 欧美在线观看天堂一区二区三区| 国产精品一二三| 欧美在线亚洲在线| 欧美国产日韩a欧美在线观看| 亚洲乱码视频| 国产日本亚洲高清| 欧美电影电视剧在线观看| 亚洲免费观看在线观看| 久久成人免费日本黄色| 在线免费观看日韩欧美| 欧美日韩国产一级片| 亚洲影院在线| 一本久道久久综合婷婷鲸鱼| 欧美一级黄色录像| 亚洲伦理中文字幕| 国产午夜精品一区二区三区欧美| 久久综合亚洲社区| 一本色道久久加勒比精品| 久久亚洲欧美国产精品乐播| 亚洲一区二区免费| 亚洲久色影视| 91久久精品www人人做人人爽| 国产精品免费看| 美女国产一区| 久久久人成影片一区二区三区| 一本色道久久88精品综合| 男男成人高潮片免费网站| 久久久久久综合网天天| 久久国产手机看片| 久久精品视频播放| 久久精品30| 欧美成人精品在线视频| 亚洲高清123| 欧美jjzz| 99热精品在线观看| 亚洲免费影视第一页| 久久av一区二区| 午夜精品一区二区在线观看| 亚洲嫩草精品久久| 久久资源在线| 一区二区三区视频在线看| 亚洲在线成人| 欧美国产日产韩国视频| 欧美性事在线| 精品成人a区在线观看| 最近中文字幕日韩精品 | 韩日成人av| 亚洲国产91| 亚洲免费视频成人| 欧美黄色一级视频| 午夜在线电影亚洲一区| 欧美不卡一区| 欧美日韩综合在线免费观看| 国产日韩一区在线| 亚洲视频999| 欧美激情亚洲国产| 午夜精品久久| 国产精品v欧美精品v日本精品动漫| 狠狠色丁香久久婷婷综合丁香| 亚洲人午夜精品免费| 久久久福利视频| 午夜精品一区二区三区四区| 欧美激情一区二区三区| 亚洲第一综合天堂另类专| 久久精品二区三区| 一区二区三区视频在线| 国产精品久久久久久久电影| 99xxxx成人网| 亚洲精品国产精品国自产观看浪潮| 亚洲欧美日韩国产成人| 欧美日韩亚洲综合一区| 一本色道久久88综合日韩精品| 欧美激情第1页| 欧美精品videossex性护士| 亚洲国产综合在线| 亚洲综合色噜噜狠狠| 久久精品视频99| 亚洲欧洲中文日韩久久av乱码| 久久综合伊人| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲国产成人精品女人久久久| 久久在线91| 欧美极品色图| 欧美一区二区啪啪| 裸体丰满少妇做受久久99精品| 99精品国产一区二区青青牛奶| 夜夜嗨av一区二区三区中文字幕| 国产精品久久久久久亚洲毛片| 久久精品理论片| 欧美成人xxx| 亚洲亚洲精品在线观看| 亚洲欧美99| 在线一区二区三区做爰视频网站 | 亚洲视频在线视频| 亚洲福利视频网| 性18欧美另类| 亚洲美女免费视频| 性色一区二区三区| 久久国产成人| 国产日韩精品一区观看| 一本久道久久综合狠狠爱| 亚洲高清在线视频| 久久青草久久| 免费看亚洲片| 亚洲第一福利社区| 美女黄网久久| 黄色一区二区三区四区| 亚洲精选91| 亚洲制服丝袜在线|