• <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>

            積木

            No sub title

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            原諒轉(zhuǎn)載自http://tech.ddvip.com/2008-11/122662837992492.html

            Visual C++中提供的MFC類CtreeCtrl(樹型控件)用來顯示具有一定層次結(jié)構(gòu)的數(shù)據(jù)項(xiàng)時(shí)方便、直觀,所以它已經(jīng)被廣泛地應(yīng)用在各種軟件中,如資源管理器中的磁盤目錄就用的是樹型控件,我們?cè)诰幊讨幸矔?huì)經(jīng)常用到這個(gè)控件,但是這個(gè)控件也有缺陷,那就是它并不直接支持拖動(dòng)節(jié)點(diǎn)等高級(jí)特性,這使得程序員在編程時(shí)使用它受到了很大限制,同時(shí)又給軟件用戶帶來了一些不便。為此,本實(shí)例通過從 CTreeCtrl 中派生了一個(gè)類 CXTreeCtrl ,實(shí)現(xiàn)樹型控件中節(jié)點(diǎn)的拖動(dòng)。這個(gè)類具有如下的功能:⑴ 基本項(xiàng)目條拖動(dòng)的實(shí)現(xiàn);⑵ 處理項(xiàng)目條的無意拖動(dòng);⑶ 能處理項(xiàng)目條拖動(dòng)過程中的滾動(dòng)問題;⑷ 拖動(dòng)過程中節(jié)點(diǎn)會(huì)智能展開。程序編譯運(yùn)行后的效果如圖所示:

            570)?'570px':'auto'; }" src="http://img.ddvip.com/2008_11_14/1226628379_ddvip_9835.png">

              圖一:樹型控件節(jié)點(diǎn)拖動(dòng)示例

              一、實(shí)現(xiàn)方法

              我們針對(duì)上述自定義類的實(shí)現(xiàn)功能,介紹實(shí)現(xiàn)思路和方法。

              (1)基本項(xiàng)目條拖動(dòng)的實(shí)現(xiàn)

              當(dāng)我們要拖動(dòng)樹型控件的一個(gè)項(xiàng)目條時(shí),樹型控件會(huì)給它的父窗口發(fā)送一個(gè)TVN_BEGINDRAG通知消息,所以可以在此消息的響應(yīng)函數(shù)中,調(diào)用 CTreeCtrl ::CreateDragImage ()函數(shù)創(chuàng)建表示當(dāng)前項(xiàng)目條正處在拖動(dòng)操作中的圖象,該函數(shù)創(chuàng)建的圖象由項(xiàng)目條的圖象和標(biāo)簽文本組成。創(chuàng)建了拖動(dòng)圖象后,調(diào)用CImageList::BeginDrag()函數(shù)指定拖動(dòng)圖象的熱點(diǎn)位置,然后調(diào)用CImageList::DragEnter()函數(shù)顯示拖動(dòng)圖象。接下來處理 WM_MOUSEMOVE 消息用于更新拖動(dòng)圖象,我們想讓移動(dòng)中的圖象經(jīng)過某些項(xiàng)目時(shí)高亮度顯示,這可以調(diào)用 CTreeCtrl ::SelectDropTarget() 來實(shí)現(xiàn)。在調(diào)用 SelectDropTarget()函數(shù)之前,需要先調(diào)用CImageList::DragShowNolock ( false )函數(shù)來隱藏圖象列表,然后再調(diào)用CImageList::DragShowNolock ( true ) 函數(shù)來恢復(fù)圖象列表的顯示,這樣就不會(huì)在拖動(dòng)過程中留下難看的軌跡。最后我們處理 WM_LBUTTONUP 消息用于完成拖動(dòng)操作,在該消息響應(yīng)函數(shù)中,我們需要完成結(jié)束拖動(dòng)圖象的顯示、刪除拖動(dòng)圖象、釋放鼠標(biāo)、節(jié)點(diǎn)的拷貝/刪除等操作。在節(jié)點(diǎn)的拷貝/刪除操作中,如果是父節(jié)點(diǎn)拖到子節(jié)點(diǎn)上,我們可以先將父節(jié)點(diǎn)拷到根結(jié)點(diǎn)下的臨時(shí)節(jié)點(diǎn)中,再?gòu)呐R時(shí)結(jié)點(diǎn)處拷到子節(jié)點(diǎn),然后將根結(jié)點(diǎn)下的臨時(shí)節(jié)點(diǎn)刪除,這樣做的目的是防止產(chǎn)生異常。

              (2)處理項(xiàng)目條的無意拖動(dòng)

              牐犎綣在鼠標(biāo)按下時(shí)不小心移動(dòng)了鼠標(biāo),這時(shí)系統(tǒng)就認(rèn)為產(chǎn)生了一個(gè)移動(dòng)操作,這就產(chǎn)生了誤操作。解決這個(gè)問題的方法是設(shè)置時(shí)間延遲,也就是說當(dāng)用戶按下鼠標(biāo)后必須在原位置停留一段時(shí)間,才能激活拖動(dòng)操作。

              (3)處理拖動(dòng)過程中的滾動(dòng)問題

              當(dāng)我們拖動(dòng)樹型控件的項(xiàng)目條時(shí),如果目的節(jié)點(diǎn)不可見,則需要拖動(dòng)滾動(dòng)條或收攏其它一些節(jié)點(diǎn)以使得目的節(jié)點(diǎn)顯示出來,無疑,這會(huì)給我們帶來很大的不便。為此就要給樹型控件添加自動(dòng)滾動(dòng)支持。首先設(shè)置一個(gè)定時(shí)器,在 WM_TIMER 消息中檢測(cè)鼠標(biāo)的位置,如果靠近樹型控件的下邊緣,則使得控件向下滾動(dòng)。靠近上邊緣則向上滾動(dòng)。滾動(dòng)速度根據(jù)鼠標(biāo)的位置確定。

              (4)拖動(dòng)過程中節(jié)點(diǎn)的智能展開

              為了實(shí)現(xiàn)在拖動(dòng)過程中鼠標(biāo)停留在某個(gè)節(jié)點(diǎn)上一段時(shí)間后,該節(jié)點(diǎn)會(huì)自動(dòng)展開的功能。設(shè)置一個(gè)定時(shí)器,當(dāng)鼠標(biāo)在拖動(dòng)過程中停止在某個(gè)節(jié)點(diǎn)上時(shí),定時(shí)器被啟動(dòng),再設(shè)置一變量保存當(dāng)前的鼠標(biāo)位置。

              二、編程步驟

              1、 新建一對(duì)話框工程DragTree,編輯資源,在對(duì)話框中加入一樹型控件IDC_TREE ,屬性設(shè)置為:Has Buttons、Has Lines、Lines at root、Edit Labels、Border;

              2、 使用Class Wizard給該控件添加一個(gè)成員變量 m_wndTree ,在代碼部分將該控件的類型修改為CXTreeCtrl。

              3、 在對(duì)話框的OnInitDialog()函數(shù)中添加代碼,初始化樹型控件的項(xiàng)目條;

              4、 制作一個(gè)圖像資源(ID為IDB_TREEIMAGE),其中包含兩個(gè)小圖標(biāo),用來作為樹型控件項(xiàng)目條的顯示圖標(biāo);

              5、 添加代碼,編譯運(yùn)行程序。

              三、程序代碼

            // XTreeCtrl.h : header file 
            #if !defined(AFX_XTREECTRL_H__3EF12526_EF66_4FD9_A572_59476441D79A__INCLUDED_) 
            #define AFX_XTREECTRL_H__3EF12526_EF66_4FD9_A572_59476441D79A__INCLUDED_ 
            #if _MSC_VER > 1000 
            #pragma once 
            #endif // _MSC_VER > 1000 
            class CXTreeCtrl : public CTreeCtrl 

             
            // Construction 
             public
              CXTreeCtrl(); 
              
            // Attributes 
             public
              
            // Operations 
             public
              
            // Overrides 
              
            // ClassWizard generated virtual function overrides 
              
            //{{AFX_VIRTUAL(CXTreeCtrl) 
              
            //}}AFX_VIRTUAL 
              
            // Implementation 
             public
              
            virtual ~CXTreeCtrl(); 
              
            // Generated message map functions 
             protected
              UINT m_TimerTicks; 
            //處理滾動(dòng)的定時(shí)器所經(jīng)過的時(shí)間 
              UINT m_nScrollTimerID; //處理滾動(dòng)的定時(shí)器 
              CPoint m_HoverPoint; //鼠標(biāo)位置 
              UINT m_nHoverTimerID; //鼠標(biāo)敏感定時(shí)器 
              DWORD m_dwDragStart; //按下鼠標(biāo)左鍵那一刻的時(shí)間 
              BOOL m_bDragging; //標(biāo)識(shí)是否正在拖動(dòng)過程中 
              CImageList* m_pDragImage; //拖動(dòng)時(shí)顯示的圖象列表 
              HTREEITEM m_hItemDragS; //被拖動(dòng)的標(biāo)簽 
              HTREEITEM m_hItemDragD; //接受拖動(dòng)的標(biāo)簽 
              
            //{{AFX_MSG(CXTreeCtrl) 
               afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult); 
               afx_msg 
            void OnMouseMove(UINT nFlags, CPoint point); 
               afx_msg 
            void OnLButtonUp(UINT nFlags, CPoint point); 
               afx_msg 
            void OnLButtonDown(UINT nFlags, CPoint point); 
               afx_msg 
            void OnTimer(UINT nIDEvent); 
              
            //}}AFX_MSG 
              DECLARE_MESSAGE_MAP() 
             
            private
              HTREEITEM CopyBranch(HTREEITEM htiBranch,HTREEITEM htiNewParent,HTREEITEM htiAfter); 
              HTREEITEM CopyItem(HTREEITEM hItem,HTREEITEM htiNewParent,HTREEITEM htiAfter); 
            }; 
            #endif 
            //////////////////////////////////////////////////////////// CXTreeCtrl 
            #include "stdafx.h" 
            #include 
            "DragTree.h" 
            #include 
            "XTreeCtrl.h" 
            #ifdef _DEBUG 
            #define new DEBUG_NEW 
            #undef THIS_FILE 
            static char THIS_FILE[] = __FILE__; 
            #endif 
            #define DRAG_DELAY 60 
            CXTreeCtrl::CXTreeCtrl() 

             m_bDragging 
            = false

            CXTreeCtrl::
            ~CXTreeCtrl() 
            {} 
            BEGIN_MESSAGE_MAP(CXTreeCtrl, CTreeCtrl) 
            //{{AFX_MSG_MAP(CXTreeCtrl) 
             ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag) 
             ON_WM_MOUSEMOVE() 
             ON_WM_LBUTTONUP() 
             ON_WM_LBUTTONDOWN() 
             ON_WM_TIMER() 
            //}}AFX_MSG_MAP 
            END_MESSAGE_MAP() 
            void CXTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 

             NM_TREEVIEW
            * pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
             
            *pResult = 0
             
            //如果是無意拖曳,則放棄操作 
             if( (GetTickCount() - m_dwDragStart) < DRAG_DELAY ) 
              
            return
             m_hItemDragS 
            = pNMTreeView->itemNew.hItem; 
             m_hItemDragD 
            = NULL; 
             
            //得到用于拖動(dòng)時(shí)顯示的圖象列表 
             m_pDragImage = CreateDragImage( m_hItemDragS ); 
             
            if!m_pDragImage ) 
              
            return
             m_bDragging 
            = true
             m_pDragImage
            ->BeginDrag ( 0,CPoint(8,8) ); 
             CPoint pt 
            = pNMTreeView->ptDrag; 
             ClientToScreen( 
            &pt ); 
             m_pDragImage
            ->DragEnter ( this,pt ); //"this"將拖曳動(dòng)作限制在該窗口 
             SetCapture(); 
             m_nScrollTimerID 
            = SetTimer( 2,40,NULL ); 

            void CXTreeCtrl::OnMouseMove(UINT nFlags, CPoint point) 

             HTREEITEM hItem; 
             UINT flags; 
             
            //檢測(cè)鼠標(biāo)敏感定時(shí)器是否存在,如果存在則刪除,刪除后再定時(shí) 
             if( m_nHoverTimerID ) 
             { 
              KillTimer( m_nHoverTimerID ); 
              m_nHoverTimerID 
            = 0
             } 
             m_nHoverTimerID 
            = SetTimer( 1,800,NULL ); //定時(shí)為 0.8 秒則自動(dòng)展開 
             m_HoverPoint = point; 
             
            if( m_bDragging ) 
             { 
              CPoint pt 
            = point; 
              CImageList::DragMove( pt ); 
              
            //鼠標(biāo)經(jīng)過時(shí)高亮顯示 
              CImageList::DragShowNolock( false ); //避免鼠標(biāo)經(jīng)過時(shí)留下難看的痕跡 
              if( (hItem = HitTest(point,&flags)) != NULL ) 
              { 
               SelectDropTarget( hItem ); 
               m_hItemDragD 
            = hItem; 
              } 
              CImageList::DragShowNolock( 
            true ); 
              
            //當(dāng)條目被拖曳到左邊緣時(shí),將條目放在根下 
              CRect rect; 
              GetClientRect( 
            &rect ); 
              
            if( point.x < rect.left + 20 ) 
               m_hItemDragD 
            = NULL; 
             } 
             CTreeCtrl::OnMouseMove(nFlags, point); 

            void CXTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) 

             CTreeCtrl::OnLButtonUp(nFlags, point); 
             
            if( m_bDragging ) 
             { 
              m_bDragging 
            = FALSE; 
              CImageList::DragLeave( 
            this ); 
              CImageList::EndDrag(); 
              ReleaseCapture(); 
              delete m_pDragImage; 
              SelectDropTarget( NULL ); 
              
            if( m_hItemDragS == m_hItemDragD ) 
              { 
               KillTimer( m_nScrollTimerID ); 
               
            return
              } 
              Expand( m_hItemDragD,TVE_EXPAND ); 
              HTREEITEM htiParent 
            = m_hItemDragD; 
              
            while( (htiParent = GetParentItem(htiParent)) != NULL ) 
              { 
               
            if( htiParent == m_hItemDragS ) 
               { 
                HTREEITEM htiNewTemp 
            = CopyBranch( m_hItemDragS,NULL,TVI_LAST ); 
                HTREEITEM htiNew 
            = CopyBranch( htiNewTemp,m_hItemDragD,TVI_LAST ); 
                DeleteItem( htiNewTemp ); 
                SelectItem( htiNew ); 
                KillTimer( m_nScrollTimerID ); 
                
            return
               } 
              } 
              HTREEITEM htiNew 
            = CopyBranch( m_hItemDragS,m_hItemDragD,TVI_LAST ); 
              DeleteItem( m_hItemDragS ); 
              SelectItem( htiNew ); 
              KillTimer( m_nScrollTimerID ); 
             } 

            HTREEITEM CXTreeCtrl::CopyItem(HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter) 
            //拷貝條目 

             TV_INSERTSTRUCT tvstruct; 
             HTREEITEM hNewItem; 
             CString sText; 
             
            //得到源條目的信息 
             tvstruct.item.hItem = hItem; 
             tvstruct.item.mask
            =TVIF_CHILDREN|TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; 
             GetItem( 
            &tvstruct.item ); 
             sText 
            = GetItemText( hItem ); 
             tvstruct.item.cchTextMax 
            = sText.GetLength (); 
             tvstruct.item.pszText 
            = sText.LockBuffer (); 
             
            //將條目插入到合適的位置 
             tvstruct.hParent = htiNewParent; 
             tvstruct.hInsertAfter 
            = htiAfter; 
             tvstruct.item.mask 
            = TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; 
             hNewItem 
            = InsertItem( &tvstruct ); 
             sText.ReleaseBuffer (); 
             
            //限制拷貝條目數(shù)據(jù)和條目狀態(tài) 
             SetItemData( hNewItem,GetItemData(hItem) ); 
             SetItemState( hNewItem,GetItemState(hItem,TVIS_STATEIMAGEMASK),TVIS_STATEIMAGEMASK); 
             
            return hNewItem; 

            HTREEITEM CXTreeCtrl::CopyBranch(HTREEITEM htiBranch, HTREEITEM htiNewParent, HTREEITEM htiAfter) 
            //拷貝分支 

             HTREEITEM hChild; 
             HTREEITEM hNewItem 
            = CopyItem( htiBranch,htiNewParent,htiAfter ); 
             hChild 
            = GetChildItem( htiBranch ); 
             
            while( hChild != NULL ) 
             { 
              CopyBranch( hChild,hNewItem,htiAfter ); 
              hChild 
            = GetNextSiblingItem( hChild ); 
             } 
             
            return hNewItem; 

            void CXTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) //處理無意拖曳 

             m_dwDragStart 
            = GetTickCount(); 
             CTreeCtrl::OnLButtonDown(nFlags, point); 

            void CXTreeCtrl::OnTimer(UINT nIDEvent) 

             
            //鼠標(biāo)敏感節(jié)點(diǎn) 
             if( nIDEvent == m_nHoverTimerID ) 
             { 
              KillTimer( m_nHoverTimerID ); 
              m_nHoverTimerID 
            = 0
              HTREEITEM trItem 
            = 0
              UINT uFlag 
            = 0
              trItem 
            = HitTest( m_HoverPoint,&uFlag ); 
              
            if( trItem && m_bDragging ) 
              { 
               SelectItem( trItem ); 
               Expand( trItem,TVE_EXPAND ); 
              } 
             } 
             
            //處理拖曳過程中的滾動(dòng)問題 
             else if( nIDEvent == m_nScrollTimerID ) 
             { 
              m_TimerTicks
            ++
              CPoint pt; 
              GetCursorPos( 
            &pt ); 
              CRect rect; 
              GetClientRect( 
            &rect ); 
              ClientToScreen( 
            &rect ); 
              HTREEITEM hItem 
            = GetFirstVisibleItem(); 
              
            if( pt.y < rect.top +10 ) 
              { 
               
            //向上滾動(dòng) 
               int slowscroll = 6 - (rect.top + 10 - pt.y )/20
               
            if0 == (m_TimerTicks % ((slowscroll > 0? slowscroll : 1)) ) 
               { 
                CImageList::DragShowNolock ( 
            false ); 
                SendMessage( WM_VSCROLL,SB_LINEUP ); 
                SelectDropTarget( hItem ); 
                m_hItemDragD 
            = hItem; 
                CImageList::DragShowNolock ( 
            true ); 
               } 
              } 
              
            else if( pt.y > rect.bottom - 10 ) 
              { 
               
            //向下滾動(dòng) 
               int slowscroll = 6 - (pt.y - rect.bottom + 10)/20
               
            if0 == (m_TimerTicks % ((slowscroll > 0? slowscroll : 1)) ) 
               { 
                CImageList::DragShowNolock ( 
            false ); 
                SendMessage( WM_VSCROLL,SB_LINEDOWN ); 
                
            int nCount = GetVisibleCount(); 
                
            forint i=0 ; i<nCount-1 ; i++ ) 
                 hItem 
            = GetNextVisibleItem( hItem ); 
                 
            if( hItem ) 
                  SelectDropTarget( hItem ); 
                 m_hItemDragD 
            = hItem; 
                 CImageList::DragShowNolock ( 
            true ); 
               } 
              } 
             } 
             
            else
              CTreeCtrl::OnTimer(nIDEvent); 

            //////////////////////////////////////////////////////////// 
            BOOL CDragTreeDlg::OnInitDialog() 

             CDialog::OnInitDialog(); 
             …………………….
            //此處代碼省略 
             
            // TODO: Add extra initialization here 
             m_image.Create ( IDB_TREEIMAGE,16,1,RGB(255,255,255) ); 
             m_wndTree.SetImageList ( 
            &m_image,TVSIL_NORMAL ); 
             HTREEITEM hti1 
            = m_wndTree.InsertItem ( _T("唐詩(shī)"),0,1 ); 
             HTREEITEM hti2 
            = m_wndTree.InsertItem ( _T("宋詞"),0,1 ); 
             HTREEITEM hti3 
            = m_wndTree.InsertItem ( _T("元曲"),0,1 ); 
             HTREEITEM hti4 
            = m_wndTree.InsertItem ( _T("李白"),0,1,hti1 ); 
             m_wndTree.InsertItem ( _T(
            "靜夜思(床前明月光)"),0,1,hti4 ); 
             m_wndTree.InsertItem ( _T(
            "將進(jìn)酒(君不見黃河之水天上來)"),0,1,hti4 ); 
             m_wndTree.InsertItem ( _T(
            "望廬山瀑布(日照香爐生紫煙)"),0,1,hti4 ); 
             m_wndTree.InsertItem ( _T(
            "蜀道難(噫吁戲,危乎高哉)"),0,1,hti4 ); 
             HTREEITEM hti5 
            = m_wndTree.InsertItem ( _T("杜甫"),0,1,hti1 ); 
             m_wndTree.InsertItem ( _T(
            "蜀相(丞相祠堂何處尋)"),0,1,hti5 ); 
             m_wndTree.InsertItem ( _T(
            "春望(國(guó)破山河在)"),0,1,hti5 ); 
             m_wndTree.InsertItem ( _T(
            "茅屋為秋風(fēng)所破歌(八月秋高風(fēng)怒號(hào))"),0,1,hti5 ); 
             HTREEITEM hti6 
            = m_wndTree.InsertItem ( _T("白居易"),0,1,hti1 ); 
             m_wndTree.InsertItem ( _T(
            "長(zhǎng)恨歌(漢皇重色思傾國(guó))"),0,1,hti6 ); 
             m_wndTree.InsertItem ( _T(
            "琵琶行並序(潯陽(yáng)江頭夜送客)"),0,1,hti6 ); 
             m_wndTree.InsertItem ( _T(
            "李清照"),0,1,hti2 ); 
             m_wndTree.InsertItem ( _T(
            "柳永"),0,1,hti2 ); 
             
            return TRUE; // return TRUE unless you set the focus to a control 
            }

             

            posted on 2011-11-04 11:23 Jacc.Kim 閱讀(729) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC / C++
            日日狠狠久久偷偷色综合免费| 亚洲国产高清精品线久久| 亚洲va久久久噜噜噜久久天堂| 久久91精品综合国产首页| 伊人久久一区二区三区无码| 久久亚洲AV成人无码电影| 色综合久久88色综合天天| 思思久久好好热精品国产| 国产精品美女久久久久| 日韩十八禁一区二区久久| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久无码一区二区三区少妇 | 99久久精品免费看国产一区二区三区 | 无码任你躁久久久久久老妇| 色8久久人人97超碰香蕉987| 久久午夜福利电影| 成人妇女免费播放久久久| 久久99热这里只有精品国产| 亚洲国产二区三区久久| 久久精品无码一区二区无码| 伊人色综合久久天天人守人婷| 国产亚洲婷婷香蕉久久精品| 国产偷久久久精品专区| 久久久精品国产Sm最大网站| 亚洲国产天堂久久综合网站| 77777亚洲午夜久久多喷| 日韩人妻无码精品久久久不卡 | 精品无码久久久久久久动漫| 99久久精品毛片免费播放| 熟妇人妻久久中文字幕| 久久婷婷五月综合97色直播| 日韩欧美亚洲综合久久影院Ds| 久久伊人亚洲AV无码网站| 久久嫩草影院免费看夜色| 久久久久久av无码免费看大片| 狠狠人妻久久久久久综合蜜桃| 亚洲一区中文字幕久久| 久久综合综合久久97色| 91精品无码久久久久久五月天 | 久久久久久一区国产精品| 色播久久人人爽人人爽人人片aV|