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

隨筆-162  評論-223  文章-30  trackbacks-0
   著名的千千靜聽音樂播放器,其界面簡潔優雅、美觀大方,特別是它那種幾個窗口像磁石般相互吸引,當拖動主窗口時,粘在一起的其它窗口會跟隨著一起移動,當拖動其它窗口時,又能脫離不粘在一起,這種窗口效果讓用戶操作方便,省心省力。為描述方便,本文稱這種效果為多窗口的組合分離,它的主要特點是僅用鼠標任意移動窗口,就可組合或分離,當組合在一起時,移動某窗口(如主窗口,暫稱為老板窗口)能整體移動,移動其口窗口(非老板窗口,暫稱為工人窗口)又能將自己脫離出來。近來由于工作需要實現了類似于此的窗口效果,經過幾天的測試,終于穩定。在開發過程中,考慮了以下幾個問題:
     (1)  組合分離的條件如何決定判斷。
     (2)  當窗口大小改變時,包括最小化,最大化,縮放窗口等,如何保證不影響組合分離,能正常整體移動。
     (3)  窗口個數是可變的,當新建或銷毀窗口時,如何保證不影響組合分離,能正常整體移動(千千靜聽窗口個數是有限的,而且可能只是隱藏窗口)。
     (4)  采用什么數據結構較好,如何維護任意兩個窗口間的距離關系(相交或相切視為組合,相離視為分離)。
     (5)  當拖動老板窗口時,如何拖動與其組合的所有窗口,關鍵是如何得到所有與其組合的窗口列表。
     (6)  如何針對這種效果設計一個通用的組件類,只需調用幾個方法便可搞定。
   
   針對以上問題,主要思路是視屏幕上任意多個窗口為頂點,以其窗口矩形中心點來看待這個窗口,如果任意兩個窗口間關系為組合,則視這兩個頂點間是相通的,即兩個頂點存在邊。如果為分離,則視兩頂點間是不通的,即兩頂點不存邊。因此可以用無向圖來存儲窗口和關系,為簡單起見,我用的是鄰接矩陣,問題(4)得以解決。既然用鄰接矩陣來存儲,那么如何得到所有與老板窗口相關的組合窗口呢?由于實際多個窗口在移動過程中,會改變其組合分離關系,這就會得到多個無向圖的連通分量,而我們需要的是包含老板窗口的那一個連通分量,因此可以用DFS深度搜索遍歷這個無向圖連通分量,起始頂點是老板窗口,遍歷完后就會得所有與其組合的窗口列表,問題(5)得以解決。現在討論問題(1),這里有個細節問題就是組合分離的條件判斷有兩種情況,一是當移動窗口時的條件,稱為條件1,因為實際向一個窗口A移入另一個窗口B時,要達到還沒有接近窗口A時便一下子靠近A就像被A吸引的效果,當移出B時還沒完全移到A窗口外面時便一下子遠離就像被A排斥的效果。二是當大小改變時的條件,稱為條件2,這個不同于條件1,因為它不需要那種吸引排斥的效果,也沒必要,這個條件2就是簡單的判斷A和B矩形是否相交,API函數IntersectRect即可完成這一判斷。條件1的判斷如下圖所示:
                                                           
   在B向A移入過程中,當B的中心點在矩形left,top,right,bottom范圍內,可認為是發生組合,實現吸引效果;當在center矩形內,認為是已經組合了;同理,B向A移出過程中,當B的中心點在矩形left,top,right,bottom范圍內,可認為是發生分離,實現排斥效果。當都不在left,top,right,bottom,center矩形范圍時,認為是已經分離了。至此,問題(1)得到解決。當窗口大小改變時,需要更新鄰接矩陣反映窗口間關系的變化,而后更新組合窗口列表,組合窗口列表的計算依賴于鄰接矩陣,運用DFS算法來更新,這在WM_SIZE消息事件處理內完成,問題(2)得到解決。當新建窗口時,需要向無向圖中增加(窗口)頂點,擴充鄰接矩陣以備存儲與其它窗口的關系;當銷毀窗口時,需要從無向圖中刪除對應的頂點,而后從鄰接矩陣中刪除對應的關系,問題(3)得到解決。
   上述問題(1)--(5)都已分析并得到解決,總的來說,就是以數據結構中無向圖的觀點和算法來建模解決這些問題的,特別是運用到了DFS搜索算法來重建已組合的所有窗口列表,只有這樣,在移動老板窗口過程中,才能保證其它窗口跟隨著一起移動。接下來就是最后一個問題,也就是怎么封裝設計組件類,以達到方便應用的目的,綜上所述,設計接口方法與以下窗口4種消息相關:
   1) 創建窗口發生的消息,如WM_CREATE,WM_INITDIALOG等。
   2) 關閉或銷毀窗口發生的消息,如WM_CLOSE,WM_DESTROY等。
   3) 窗口大小改變后消息,WM_SIZE。
   4) 窗口移動中消息,WM_MOVING。
   
   另外提供一個設置獲取老板窗口的方法,在應用程序中,只需在窗口4種消息處理內調用以上對應4個方法即可實現多窗口組合分離的效果,注意該類沒有考慮多線程,因此是非安全的,適用于多窗口屬于同一線程內的情況。類聲明如下 
 1class CWndMagnet
 2{
 3public:
 4    CWndMagnet();
 5  virtual ~CWndMagnet();
 6
 7public:
 8    void SetLeadWindow(HWND hWnd) { m_hLead = hWnd; }
 9    HWND GetLeadWindow() const return m_hLead; }
10    
11    void AddMagnetWnd(HWND hWnd);
12    void RemoveMagnetWnd(HWND hWnd);
13    void OnLButtonDown(HWND hWnd);
14    void OnNcLButtonDown(HWND hWnd);
15    void OnMoving(HWND hWnd, LPRECT lpRect);
16    void OnSize(HWND hWnd, UINT uType);
17
18protected:
19    void MoveLeadWndSet(HWND hWnd, LPCRECT lpRect);
20    void UpdateLeadWndSet(HWND hWnd, LPCRECT lpRect = 0);
21    void DeleteMagWnd(HWND hWnd);
22    void Add2DMatrix();
23    void Delete2DMatrix(HWND hWnd);
24    void Update2DMatrix(HWND hWnd, LPRECT lpRect = 0);
25
26private:
27    int GetFirstNeighbor(int v);
28    int GetNextNeighbor(int v, int w);
29    void DFS(int v, std::vector<bool>& vecVisited, std::vector<int>& vecNeighbor);
30
31private:
32    static const int      s_c_iThreshold = 10///< 偏移閥值
33    HWND                  m_hLead;        ///< 老板窗口
34    std::map<HWND,POINT>      m_map_leadWnd;  ///< 粘合窗口列表
35    std::map<HWND,int>        m_map_magWnd;   ///< 需要組合分離的窗口列表
36    std::vector<std::vector<bool> > m_vec_2DMatrix; ///< 表示任意兩個窗口間相交或相切的鄰接矩陣
37    

38}
;
posted on 2011-07-04 11:14 春秋十二月 閱讀(2837) 評論(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久久精品国产91性色| 欧美巨乳波霸| 欧美在线不卡视频| 久久精品道一区二区三区| 91久久国产综合久久91精品网站| 亚洲免费观看| 国产一区二区| 亚洲自拍偷拍一区| 欧美一区不卡| 亚洲麻豆av| 午夜久久久久久| 亚洲日本aⅴ片在线观看香蕉| 亚洲免费电影在线| 在线观看欧美日韩| 亚洲色图在线视频| 亚洲大片免费看| 亚洲无玛一区| 亚洲精品1区| 午夜亚洲一区| 亚洲午夜久久久| 久久久噜噜噜久久中文字免| 亚洲午夜国产成人av电影男同| 欧美主播一区二区三区美女 久久精品人 | 久久香蕉精品| 欧美日韩久久不卡| 久久字幕精品一区| 国产精品视频免费| 亚洲欧洲精品天堂一级| 国产亚洲一区二区在线观看 | 欧美一区久久| 欧美日韩蜜桃| 亚洲黄色精品| 影音欧美亚洲| 小黄鸭精品aⅴ导航网站入口| 99视频一区二区| 久久网站免费| 久久蜜桃精品| 国产深夜精品| 亚洲一区日韩在线| 亚洲一区二区三区视频| 欧美日本不卡| 亚洲激情第一区| 亚洲电影激情视频网站| 欧美一区三区二区在线观看| 香蕉久久一区二区不卡无毒影院| 欧美日韩国产首页| 亚洲精品国精品久久99热| 午夜在线精品| 香蕉久久一区二区不卡无毒影院 | 亚洲一二三区精品| 亚洲宅男天堂在线观看无病毒| 欧美人成在线视频| 亚洲精品日韩久久| 日韩午夜视频在线观看| 欧美成人资源网| 欧美激情视频给我| 91久久精品美女| 蜜桃av一区二区三区| 男女激情久久| 亚洲欧洲日本专区| 欧美电影电视剧在线观看| 亚洲高清在线精品| 99re6这里只有精品| 欧美日韩一区二区三区在线看 | 亚洲午夜激情| 久久精品国产亚洲aⅴ| 国产日韩欧美一区二区三区在线观看 | 悠悠资源网久久精品| 久久一二三四| 亚洲精品国产精品国产自| 亚洲精品一区在线观看| 欧美日韩的一区二区| 在线视频亚洲欧美| 久久人人超碰| 亚洲精品日韩在线观看| 欧美亚洲第一区| 性伦欧美刺激片在线观看| 久久字幕精品一区| 亚洲人成在线观看一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲视频欧美在线| 欧美77777| 久久国产精品久久久久久久久久 | 亚洲午夜精品久久| 美国十次成人| 一区二区欧美亚洲| 国产日韩亚洲欧美精品| 欧美jjzz| 亚洲一区二区视频| 男人的天堂亚洲| 亚洲一区二区高清| 在线观看亚洲a| 欧美日韩伊人| 久久精品国产99精品国产亚洲性色 | 在线成人av| 久久精品九九| 亚洲国产一区二区三区在线播 | 中文日韩在线| 麻豆亚洲精品| 亚洲欧美日韩天堂| 亚洲激情综合| 国产拍揄自揄精品视频麻豆| 欧美a级一区| 午夜精品在线看| 亚洲日本视频| 麻豆精品精华液| 欧美日韩精品免费观看视频| 亚洲国产精彩中文乱码av在线播放| 久久精品99无色码中文字幕| 亚洲网站在线| 亚洲三级电影在线观看| 美女露胸一区二区三区| 亚洲精品美女在线观看播放| 国产精品日本一区二区| 欧美激情按摩| 亚洲欧美日韩精品久久| 99热在这里有精品免费| 亚洲成人在线视频播放| 久久精品欧美日韩| 亚洲国产精品嫩草影院| 国产日韩在线一区| 国产精品h在线观看| 欧美精品一区在线发布| 裸体丰满少妇做受久久99精品| 欧美在线观看视频| 亚洲靠逼com| 亚洲精品视频在线观看网站| 亚洲黄色成人| 亚洲三级影片| 亚洲精品久久久久久久久| 亚洲激情婷婷| 亚洲激情国产精品| 亚洲人午夜精品免费| 亚洲国产影院| 亚洲人午夜精品| 亚洲黄色影片| 夜夜夜精品看看| 亚洲午夜精品久久久久久浪潮 | 久久亚洲捆绑美女| 久久综合色天天久久综合图片| 久久久久综合| 美女视频黄a大片欧美| 欧美成人在线免费观看| 欧美~级网站不卡| 亚洲黄页视频免费观看| 亚洲精品中文字幕在线| 正在播放日韩| 午夜精品久久久久久99热软件| 欧美在线观看一区二区| 另类av导航| 欧美日韩精品免费在线观看视频| 欧美视频四区| 娇妻被交换粗又大又硬视频欧美| 亚洲第一网站免费视频| 99人久久精品视频最新地址| 亚洲综合大片69999| 久久精品夜色噜噜亚洲a∨| 免费国产自线拍一欧美视频| 最新热久久免费视频| 亚洲图片你懂的| 久久亚洲一区二区| 欧美色区777第一页| 国产欧美高清| 亚洲日本在线观看| 欧美一区二区视频免费观看| 久久综合久久综合久久综合| 亚洲精品免费网站| 午夜在线一区| 欧美肥婆在线| 狠狠久久亚洲欧美| 国产欧美日韩综合| 亚洲品质自拍| 香蕉成人伊视频在线观看| 免费日韩av片| 亚洲视频高清| 久久夜精品va视频免费观看| 国产精品av久久久久久麻豆网| 韩曰欧美视频免费观看| 亚洲自拍偷拍色片视频| 亚洲国产日韩欧美综合久久| 欧美一区二区三区在线免费观看| 欧美激情中文字幕乱码免费| 国产在线观看91精品一区|