欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng)的制作方法

文檔序號(hào):6337886閱讀:260來(lái)源:國(guó)知局
專利名稱:基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng)。
背景技術(shù)
Microsoft開(kāi)發(fā)的Windows (視窗)是目前世界上用戶最多、且兼容性最強(qiáng)的操作系統(tǒng)。Windows操作系統(tǒng)具有友好的操作界面,以其拖拽機(jī)制實(shí)現(xiàn)了基于Windows系統(tǒng)統(tǒng)一的交互。所謂拖拽,是指通過(guò)鼠標(biāo)點(diǎn)擊,持續(xù)不放手,將需要操作的文件移動(dòng)到固定位置,完成某種功能的操作。各應(yīng)用程序?qū)τ谕献У膶?shí)現(xiàn)各有不同。例如,當(dāng)前比較流行的圖片管理工具有可牛影像、Picasa和微軟圖片管理器等。其中,可牛影像支持圖片內(nèi)部瀏覽窗口的拖動(dòng),支持外部圖片拖入其中,但不支持圖片從應(yīng)用程序中拖動(dòng)出去;Picasa同可牛影像支持的拖動(dòng)操作類似,它支持內(nèi)部拖動(dòng),支持內(nèi)部瀏覽圖片界面到文件夾的拖動(dòng),同樣只支持外部拖動(dòng)到內(nèi)部,不支持內(nèi)部拖動(dòng)到外部;微軟圖片管理器,因?yàn)橥俏④洰a(chǎn)品,它支持圖片內(nèi)部外部的相互拖動(dòng),可是不支持圖片在應(yīng)用程序內(nèi)的拖動(dòng),沒(méi)有交互。發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下缺陷目前在Windows上開(kāi)發(fā)的應(yīng)用程序,少有對(duì)應(yīng)用程序內(nèi)部與外部的拖拽進(jìn)行結(jié)合,即,當(dāng)前應(yīng)用程序(除了微軟的應(yīng)用程序),都沒(méi)有很好的將Windows系統(tǒng)的拖拽機(jī)制和本應(yīng)用程序的拖拽機(jī)制結(jié)合起來(lái),以致操作不靈活,給用戶操作體驗(yàn)帶來(lái)一定的麻煩,用戶感受差。

發(fā)明內(nèi)容
本發(fā)明實(shí)施例的目的在于提供一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng),用以將應(yīng)用程序的拖拽機(jī)制與Windows系統(tǒng)的拖拽機(jī)制相結(jié)合,提高操作靈活性,為此,本發(fā)明采用如下技術(shù)方案一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法,應(yīng)用于使用未基于Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序,該方法包括以下步驟在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,所述第一對(duì)象為Windows CWnd,所述第二對(duì)象為非Windows標(biāo)準(zhǔn)對(duì)象,所述第一對(duì)象和所述第二對(duì)象中定義有指向鼠標(biāo)事件處理函數(shù)的鼠標(biāo)事件入口函數(shù);在拖拽過(guò)程中,當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行時(shí),向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其
4他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)系統(tǒng),應(yīng)用于使用未基于Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序,所述系統(tǒng)包括注冊(cè)模塊,用于在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,所述第一對(duì)象為Windows CWnd,所述第二對(duì)象為非 Windows標(biāo)準(zhǔn)對(duì)象,所述第一對(duì)象和所述第二對(duì)象中定義有指向鼠標(biāo)事件處理函數(shù)的鼠標(biāo)事件入口函數(shù);判斷模塊,用于在拖拽過(guò)程中,根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行,還是從所述應(yīng)用程序到其他應(yīng)用程序;處理模塊,用于當(dāng)所述判斷模塊判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行時(shí),向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;當(dāng)所述判斷模塊判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。本發(fā)明的上述實(shí)施例,通過(guò)在所述應(yīng)用程序的底層窗口綁定Windows CWnd對(duì)象, 在該應(yīng)用程序中各可接受拖拽的窗口綁定自定義的對(duì)象,在拖拽過(guò)程中,根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行還是從該應(yīng)用程序到其他應(yīng)用程序,并根據(jù)不同的判斷結(jié)果進(jìn)行不同的處理;其中,對(duì)于內(nèi)部拖拽,向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;對(duì)于從內(nèi)部到外部的拖拽,停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理,從而將應(yīng)用程序的拖拽機(jī)制與Windows系統(tǒng)的拖拽機(jī)制相結(jié)合,提高了拖拽操作靈活性。


圖1為現(xiàn)有技術(shù)中的Windows拖拽模型示意圖;圖2為現(xiàn)有技術(shù)中的Windows拖拽流程示意圖;圖3為本發(fā)明實(shí)施例中QQ影像應(yīng)用程序拖拽相關(guān)的對(duì)象結(jié)構(gòu)示意圖;圖4為本發(fā)明實(shí)施例中QQ影像應(yīng)用程序內(nèi)部外部拖拽示意圖;圖5為本發(fā)明實(shí)施例中的應(yīng)用程序內(nèi)部、外部拖拽流程示意圖;圖6為本發(fā)明實(shí)施例中基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)系統(tǒng)的結(jié)構(gòu)示意圖。
具體實(shí)施例方式支持文件拖拽的技術(shù),包括了 OLE (Object Linking and Embedding,對(duì)象連接與嵌入)的技術(shù)以及WM_DR0PFILE技術(shù)。OLE不僅是桌面應(yīng)用程序的集成,而且還定義和實(shí)現(xiàn)了一種允許應(yīng)用程序作為“對(duì)象”(數(shù)據(jù)集合和操作數(shù)據(jù)的函數(shù))彼此進(jìn)行“連接”的機(jī)制,這種連接機(jī)制和協(xié)議稱為組件對(duì)象模型(COM)。OLE是在客戶應(yīng)用程序間傳輸和共享信息的一組綜合標(biāo)準(zhǔn),允許創(chuàng)建帶有指向應(yīng)用程序的鏈接的混合文檔以使用戶修改時(shí)不必在應(yīng)用程序間切換的協(xié)議。利用OLE技術(shù)來(lái)接受拖拽,可以在“窗口”注冊(cè)COleDropTarget對(duì)象,這樣就可以接受來(lái)自其他“窗口”發(fā)來(lái)的拖拽消息。“窗口 ”,在Windows中是一個(gè)廣義的概念,它泛指一切可見(jiàn)的窗口和控件,包括窗口、按鈕、圖片等等這些可見(jiàn)的有效地部件,都可認(rèn)為是Windows的“窗口”。從技術(shù)層面上看,每一個(gè)窗體(或窗口)都對(duì)應(yīng)于一個(gè)CWnd類的對(duì)象,這個(gè)CWnd類的對(duì)象,包含了當(dāng)前窗口的絕大多數(shù)的屬性、位置信息、大小、縮放甚至當(dāng)前描述的拖拽信息。由于Windows的UI (User hterface,用戶界面),都是基于“窗口”進(jìn)行展示的, Windows內(nèi)部的拖拽,也可以認(rèn)為是各個(gè)“窗口”之間進(jìn)行數(shù)據(jù)交換的一種形式。圖1描述了一個(gè)簡(jiǎn)單的Windows拖拽模型,該應(yīng)用程序完全架構(gòu)在Windows框架下,并使用微軟的標(biāo)準(zhǔn)控件,其拖拽流程如圖2所示,包括步驟201,拖拽源向全局發(fā)送拖拽消息,并將傳送的數(shù)據(jù)放置在剪貼板中。其中,拖拽源是發(fā)起拖拽的窗口,它可通過(guò)消息機(jī)制向全局發(fā)送拖拽消息。步驟202,用戶拖動(dòng)鼠標(biāo)移動(dòng)拖拽對(duì)象的過(guò)程中,每次移動(dòng)鼠標(biāo),都能夠根據(jù)鼠標(biāo)的位置以及窗口的位置,計(jì)算出當(dāng)前鼠標(biāo)所屬的窗口(即目標(biāo)窗口),并向目標(biāo)窗口發(fā)送拖拽消息。其中,可能經(jīng)歷若干個(gè)可接受拖拽的目標(biāo)窗口 l,2...,n,如果在當(dāng)前目標(biāo)窗口用戶沒(méi)有放下鼠標(biāo),那么可接受拖拽的窗口只是根據(jù)當(dāng)前剪貼板中的內(nèi)容進(jìn)行相應(yīng)的繪制。步驟203,當(dāng)用戶在某一個(gè)可以接受拖拽的目標(biāo)窗口發(fā)下鼠標(biāo)時(shí),當(dāng)前目標(biāo)窗口處理這個(gè)拖拽消息,從剪貼板中獲取數(shù)據(jù)并進(jìn)行處理。Windows中,所有的“窗口”都是基于CWnd的對(duì)象。由于OLE可以綁定在CWnd對(duì)象上,所以所有窗口都可以設(shè)計(jì)成為可以接受拖拽的模式。OLE處理機(jī)制的基本原理主要是如果要作為拖拽目標(biāo),需要注冊(cè)拖拽入口(Co IeDropTarget對(duì)象),該入口定義有各種鼠標(biāo)操作處理的入口函數(shù),當(dāng)應(yīng)用程序窗口接收到拖拽消息后,可以根據(jù) ColeDropTarget對(duì)象調(diào)用相應(yīng)的拖拽操作函數(shù),從而實(shí)現(xiàn)對(duì)象的拖拽效果;如果要作為源發(fā)起拖拽,在注冊(cè)了拖拽入口以后,可通過(guò)重寫(xiě)ColeDropSource的OnBeginDragO函數(shù)來(lái)發(fā)起一個(gè)拖拽動(dòng)作。在ColeDropTarget類中,包括以下幾種虛函數(shù)virtual DR0PEFFECT OnDragEnter (Cffnd* pffnd, COleDataObject*pData0bject, DWORD dwKeyState, CPoint point);virtual DR0PEFFECT OnDragOver (Cffnd* pffnd, COleDataObject*pData0bject, DWORD dwKeyState, CPoint point);virtual B00L OnDrop(Cffnd* pffnd, COleDataObject* pDataObject, DR0PEFFECT dropEffect, CPoint point);virtual void OnDragLeave(Cffnd* pffnd);其中,CWnd是ColeDropTarget綁定的窗口。可以通過(guò)派生ColeDropTarget的類的子類來(lái)重寫(xiě)上述4個(gè)函數(shù),以實(shí)現(xiàn)自己的目標(biāo)(如被拖拽對(duì)象的現(xiàn)實(shí)效果)。
6
OnDragEnter在鼠標(biāo)在拖拽狀態(tài)下,進(jìn)入窗口是激活,其中pDataObject包含了拖拽的數(shù)據(jù),dwKeyState可以用來(lái)判斷當(dāng)前按鍵的狀態(tài)(包括Ctrl,shift,alt) ,Point指向進(jìn)入程序的鼠標(biāo)位置。它會(huì)返回一個(gè)DR0PEFFECT,用于指向整個(gè)拖拽過(guò)程中鼠標(biāo)的樣式,其中,DR0PEFFECT的返回值可包括DR0PEFFECT_C0PY 拷貝;DR0PEFFECT_M0VE 剪貼;DROPEFFECT_LINK 快捷方式打開(kāi);DR0PEFFECT_N0NE 不響應(yīng)。OnDragOver在鼠標(biāo)在窗口拖拽的過(guò)程中進(jìn)行響應(yīng),參數(shù)說(shuō)明和DragEnter類似;OnDrop指在窗口中,放開(kāi)鼠標(biāo)左鍵,相應(yīng)拖拽結(jié)束的Drop命令,是主要的程序處理函數(shù)入口;OnDragLeave在拖拽過(guò)程中鼠標(biāo)離開(kāi)窗口時(shí)響應(yīng)。通過(guò)注冊(cè)拖拽入口并處理以上4個(gè)函數(shù),就可以充當(dāng)一個(gè)拖拽目標(biāo)角色,接受拖拽消息。本發(fā)明的實(shí)施例,根據(jù)上述現(xiàn)有技術(shù)中完全在Windows架構(gòu)下的應(yīng)用程序的拖拽實(shí)現(xiàn)機(jī)制,提供了一種拖拽操作在應(yīng)用程序內(nèi)部外部的無(wú)縫連接的實(shí)現(xiàn)機(jī)制,解決了 Windows桌面應(yīng)用程序之間內(nèi)容相互拖拽的技術(shù)實(shí)現(xiàn),可以實(shí)現(xiàn)幾種同一類型應(yīng)用程序之間內(nèi)容的相互拖拽,方便了用戶的操作。本發(fā)明的以下實(shí)施例,以O(shè)LE技術(shù)為基礎(chǔ)、利用WM_ DR0PFILE消息為例,描述了基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng)。下面以QQ影像應(yīng)用程序?yàn)槔?,并結(jié)合附圖對(duì)本發(fā)明實(shí)施例進(jìn)行詳細(xì)描述。本發(fā)明實(shí)施例中,在QQ影像應(yīng)用程序內(nèi)部,拖拽是參照Windows的拖拽機(jī)制進(jìn)行的。即,作為QQ影像應(yīng)用程序的一個(gè)“窗口”(該“窗口”的定義類似Windows “窗口”的定義),它的拖拽實(shí)現(xiàn)與完全基于微軟控件的應(yīng)用程序的實(shí)現(xiàn)機(jī)制類似。具體的,對(duì)于QQ影像應(yīng)用程序的內(nèi)部窗口,如果需要接受或者發(fā)起拖拽,則需要注冊(cè)一個(gè)CQDragData對(duì)象()作為拖拽入口對(duì)象,綁定在該窗口上。CQDragData類中定義有各種拖拽操作(Drag)的函數(shù)入口信息,例如,CQDragData類的定義可以是
{CRect m_rcDragRect_LP ;// 用于顯示 Drag 的區(qū)域//Return ifBreak ;default = TRUE ;cbpfn_b_P_lm_OnStartDrag ;//Drag ) ]cbpfn_v_p_lm_OnDraging ;//Drag i2:^Tcbpfn_v_p_lm_OnStopDrag ;//Drag 結(jié)束}胃中,m_0nStartDrag, m_0nDragging 禾口 m_0nStopDrag ^v ^iJ ^ Drag B 云力牛、Drag 進(jìn)行事件和Drag結(jié)束事件的入口函數(shù),通過(guò)定義該三個(gè)事件的執(zhí)行方法可實(shí)現(xiàn)在QQ影像應(yīng)用程序內(nèi)部拖拽的發(fā)起(包括啟動(dòng)和接受)、拖拽在窗口中經(jīng)過(guò)時(shí)表現(xiàn)的狀態(tài)以及拖拽結(jié)束以后的處理。本發(fā)明實(shí)施例中,對(duì)于QQ影像應(yīng)用程序與外部應(yīng)用程序之間的拖拽實(shí)現(xiàn),可采用如下方式類似于QQ影像應(yīng)用程序這類沒(méi)有基于Windows標(biāo)準(zhǔn)控件進(jìn)行開(kāi)發(fā)的應(yīng)用程序,為了作為一個(gè)Windows的窗口展現(xiàn)本身,需要在底層綁定CWnd對(duì)象進(jìn)行處理,利用這個(gè)CWnd來(lái)捕獲windows的全局消息。具體的,可如圖3所示,QQ影像應(yīng)用程序在底層綁定了一個(gè)CWnd作為root,在上層不停地疊加窗口,來(lái)實(shí)現(xiàn)各色各樣的UI。底層的CWnd 可以獲取WM_M0USEM0VE、WM_LBUTT0NUP等類似的全局消息,然后由root向下派發(fā)來(lái)進(jìn)行多叉樹(shù)的后續(xù)遍歷,這樣進(jìn)行消息傳遞。當(dāng)根據(jù)鼠標(biāo)位置判斷當(dāng)前拖拽是從QQ影像應(yīng)用程序移動(dòng)到外部應(yīng)用程序時(shí),則觸發(fā)與QQ影像應(yīng)用程序底層綁定的對(duì)象(如圖中所示的 ColeDataTarget)所定義的鼠標(biāo)事件進(jìn)行處理。QQ影像應(yīng)用程序內(nèi)外部的鏈接機(jī)制,主要是基于對(duì)QQ影像應(yīng)用程序?qū)?yīng)的CWnd 的位置以及鼠標(biāo)位置進(jìn)行判斷實(shí)現(xiàn)的。具體的,如圖4所示,當(dāng)根據(jù)鼠標(biāo)位置和QQ影像應(yīng)用程序窗口位置判斷拖拽是從外部程序到QQ影像應(yīng)用程序內(nèi)部時(shí)(如從外目的窗口 1到 QQ影像系統(tǒng)),調(diào)用與QQ影像應(yīng)用程序內(nèi)部各窗口綁定的CQDragData對(duì)象中定義的鼠標(biāo)事件進(jìn)行處理,實(shí)現(xiàn)QQ影像應(yīng)用程序內(nèi)部的拖拽;當(dāng)根據(jù)鼠標(biāo)位置和QQ影像應(yīng)用程序窗口位置判斷拖拽是從QQ影像應(yīng)用程序到外部程序時(shí)(如QQ影像系統(tǒng)到外目的窗口 2),調(diào)用與QQ影像應(yīng)用程序底層綁定的Cwnd對(duì)象所定義的鼠標(biāo)事件進(jìn)行處理,實(shí)現(xiàn)從QQ影像應(yīng)用程序到外部的拖拽;當(dāng)根據(jù)鼠標(biāo)位置和QQ影像應(yīng)用程序窗口位置判斷拖拽是在QQ影像應(yīng)用程序內(nèi)部的各窗口進(jìn)行時(shí)(如從內(nèi)目的窗口 1到內(nèi)目的窗口 2),調(diào)用與QQ影像應(yīng)用程序內(nèi)部各窗口綁定的CQDragData對(duì)象中定義的鼠標(biāo)事件進(jìn)行處理,實(shí)現(xiàn)QQ影像應(yīng)用程序內(nèi)部的拖拽。參見(jiàn)圖5,為本發(fā)明實(shí)施例提供的基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)流程示意圖。 該流程的應(yīng)用場(chǎng)景是從QQ影像應(yīng)用程序內(nèi)部到外部的拖拽,即,用戶在QQ影像應(yīng)用程序中選擇一 QQ影像,將其從QQ影像應(yīng)用程序的區(qū)域拖拽出去,再將其拖拽回QQ影像應(yīng)用程序區(qū)域內(nèi)。其中,QQ影像應(yīng)用程序的底層窗口綁定了 Cwnd類對(duì)象ColeDataTarget,QQ影像應(yīng)用程序的各內(nèi)部窗口綁定了 CQDragData對(duì)象。ColeDataTarget對(duì)象和CQDragData對(duì)象的定義可如前所述。如圖5所示,本發(fā)明實(shí)施例提供的應(yīng)用程序拖拽流程,可包括步驟501,當(dāng)用戶在QQ影像應(yīng)用程序內(nèi)部點(diǎn)擊一 QQ影像準(zhǔn)備拖拽時(shí),根據(jù)鼠標(biāo)當(dāng)前位置和QQ影像應(yīng)用程序窗口位置判斷鼠標(biāo)操作是在QQ影像應(yīng)用程序內(nèi)部進(jìn)行,因此觸發(fā)CQDragData對(duì)象中的OMtartDrag事件入口函數(shù)執(zhí)行拖拽開(kāi)始方法。拖拽開(kāi)始方法的操作可包括將數(shù)據(jù)(如圖片數(shù)據(jù)或圖片路徑)放入剪貼板中。步驟502,在QQ影像應(yīng)用程序內(nèi)部拖拽過(guò)程中,針對(duì)QQ影像應(yīng)用程序內(nèi)部各個(gè)可以接受拖拽的窗口,由于根據(jù)鼠標(biāo)當(dāng)前位置和QQ影像應(yīng)用程序窗口位置判斷出當(dāng)前拖拽是在QQ影像應(yīng)用程序內(nèi)部進(jìn)行的,因此觸發(fā)CQDragData對(duì)象中的OnDragging事件入口函數(shù)執(zhí)行拖拽進(jìn)行方法。拖拽進(jìn)行方法的操作可包括根據(jù)剪貼板中保存的數(shù)據(jù)繪制拖拽效果。步驟503,如果內(nèi)部拖拽不結(jié)束(用戶沒(méi)有松開(kāi)鼠標(biāo)),并且隨著鼠標(biāo)拖拽逐步的移動(dòng),被拖拽對(duì)象離開(kāi)了當(dāng)前的客戶區(qū)(即離開(kāi)了 QQ影像應(yīng)用程序窗口區(qū)域),那么此時(shí)結(jié)束內(nèi)部的拖拽,也就是不再發(fā)起內(nèi)部拖拽消息,而是以當(dāng)前的QQ影像的CWnd對(duì)象作為發(fā)起源,觸發(fā)CWnd類對(duì)象ColeDataTarget所定義的鼠標(biāo)事件入口函數(shù)開(kāi)始執(zhí)行外部拖拽。其中,是否離開(kāi)QQ影像應(yīng)用程序窗口區(qū)域可根據(jù)鼠標(biāo)位置和QQ影像應(yīng)用程序窗口位置確定。 外部拖拽的流程可如圖2所示的方式實(shí)現(xiàn)。
其中,如果用戶在QQ影像應(yīng)用程序窗口外部按住鼠標(biāo)繼續(xù)移動(dòng),則鼠標(biāo)移動(dòng)過(guò)程中途徑的窗口接收到全局消息后,根據(jù)外部程序的拖拽入口對(duì)象觸發(fā)該外部程序的拖拽進(jìn)行事件(如OnDragOver)執(zhí)行拖拽進(jìn)行方法。該方法可包括根據(jù)剪貼板中存儲(chǔ)的數(shù)據(jù)繪制拖拽效果;如果用戶在QQ影像應(yīng)用程序窗口外部放開(kāi)鼠標(biāo),則該鼠標(biāo)操作的目標(biāo)窗口接收到全局消息后,根據(jù)外部程序的拖拽入口對(duì)象觸發(fā)該外部程序的拖拽結(jié)束事件(如 OnDrop)執(zhí)行拖拽結(jié)束方法。該方法可包括根據(jù)剪貼板中存儲(chǔ)的數(shù)據(jù)進(jìn)行相應(yīng)操作,如拷貝或剪貼等。步驟504,如果此時(shí)用戶再次將QQ影像拖動(dòng)回來(lái),那么直接關(guān)閉外部程序的拖拽 (包括停止發(fā)送全局拖拽消息),啟動(dòng)QQ影像應(yīng)用程序內(nèi)部拖拽(包括向QQ影視應(yīng)用程序的內(nèi)部窗口發(fā)送拖拽消息)。具體的,當(dāng)根據(jù)鼠標(biāo)位置和QQ影視應(yīng)用程序窗口位置判斷拖拽是從外部程序到QQ影像應(yīng)用程序內(nèi)部時(shí),停止發(fā)送全局拖拽消息,而是向QQ影像應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,并調(diào)用與目標(biāo)窗口綁定的CQDragData對(duì)象中定義的鼠標(biāo)事件進(jìn)行相應(yīng)處理。因?yàn)楸煌献?duì)象(QQ影像)的相關(guān)數(shù)據(jù)都在剪貼板中保存,因此可以實(shí)時(shí)的取出待顯示的數(shù)據(jù)生成拖拽效果。其內(nèi)部拖拽的實(shí)現(xiàn)與步驟502或步驟503相似, 在此不再贅述。其中,關(guān)于內(nèi)部拖拽源的選取,可創(chuàng)建一個(gè)虛擬的沒(méi)有大小的窗口作為源,來(lái)完成內(nèi)部的拖拽工作。由于對(duì)于不管是內(nèi)部還是外部的鼠標(biāo)事件,都需要有一個(gè)拖拽源,也就是發(fā)起拖拽的一方和一個(gè)拖拽的目標(biāo),而對(duì)于上述從外拖拽回來(lái)的數(shù)據(jù),因?yàn)橐呀?jīng)失去了原本內(nèi)部的拖拽源,因此需要給它建立一個(gè)虛擬的拖拽源,也就是一個(gè)虛擬窗口作為這一次拖拽的發(fā)起源。通過(guò)以上描述可以看出,通過(guò)在使用非Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序的底層窗口綁定Windows CWnd對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定自定義的對(duì)象;在拖拽過(guò)程中,根據(jù)鼠標(biāo)當(dāng)前位置和應(yīng)用程序的底層窗口位置,判斷拖拽是在該應(yīng)用程序內(nèi)部進(jìn)行還是從該應(yīng)用程序到其他應(yīng)用程序,并根據(jù)不同的判斷結(jié)果進(jìn)行不同的處理;其中, 對(duì)于內(nèi)部拖拽,向該應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的自定義對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;對(duì)于從內(nèi)部到外部的拖拽,停止向該應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與該應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使其他應(yīng)用程序根據(jù)拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理,從而將應(yīng)用程序的拖拽機(jī)制與Windows系統(tǒng)的拖拽機(jī)制相結(jié)合,提高了拖拽操作靈活性。基于相同的技術(shù)構(gòu)思,本發(fā)明實(shí)施例還提供了一種應(yīng)用于上述流程的基于 Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)系統(tǒng)。參見(jiàn)圖6,為本發(fā)明實(shí)施例中基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)系統(tǒng)的結(jié)構(gòu)示意圖,該系統(tǒng)可應(yīng)用于使用未基于Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序,該系統(tǒng)可包括注冊(cè)模塊601,用于在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,所述第一對(duì)象為Windows CWnd,所述第二對(duì)象為非 Windows標(biāo)準(zhǔn)對(duì)象,所述第一對(duì)象和所述第二對(duì)象中定義有指向鼠標(biāo)事件處理函數(shù)的鼠標(biāo)事件入口函數(shù);
判斷模塊602,用于在拖拽過(guò)程中,根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行,還是從所述應(yīng)用程序到其他應(yīng)用程序;處理模塊603,用于當(dāng)判斷模塊603判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行時(shí),向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;當(dāng)判斷模塊602判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。上述系統(tǒng)中,第二對(duì)象中定義有拖拽開(kāi)始事件入口函數(shù);相應(yīng)的,處理模塊603可當(dāng)所述目標(biāo)窗口在接收到表示拖拽開(kāi)始的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽開(kāi)始事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽開(kāi)始處理函數(shù),將被拖拽對(duì)象的數(shù)據(jù)存儲(chǔ)于剪貼板。上述系統(tǒng)中,第二對(duì)象中定義有拖拽進(jìn)行事件入口函數(shù);相應(yīng)的,處理模塊603可當(dāng)所述目標(biāo)窗口在接收到表示拖拽進(jìn)行的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽進(jìn)行事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽進(jìn)行處理函數(shù),使用剪貼板中存儲(chǔ)的數(shù)據(jù)繪制被拖拽對(duì)象。上述系統(tǒng)中,第二對(duì)象中還定義有拖拽結(jié)束事件入口函數(shù);相應(yīng)的,處理模塊603 可當(dāng)所述目標(biāo)窗口在接收到表示拖拽結(jié)束的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽結(jié)束事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽結(jié)束處理函數(shù)進(jìn)行相應(yīng)處理。上述系統(tǒng)中,處理模塊603還可當(dāng)所述判斷模塊根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從其他應(yīng)用程序到所述應(yīng)用程序時(shí),停止發(fā)送全局拖拽消息,向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使所述應(yīng)用程序內(nèi)部的目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。本領(lǐng)域技術(shù)人員可以理解實(shí)施例中的裝置中的模塊可以按照實(shí)施例描述進(jìn)行分布于實(shí)施例的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施例的一個(gè)或多個(gè)裝置中。上述實(shí)施例的模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn),當(dāng)然也可以通過(guò)硬件,但很多情況下前者是更佳的實(shí)施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)終端設(shè)備(可以是手機(jī),個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法,應(yīng)用于使用未基于Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序,其特征在于,包括以下步驟在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,所述第一對(duì)象為Windows CWnd,所述第二對(duì)象為非Windows標(biāo)準(zhǔn)對(duì)象,所述第一對(duì)象和所述第二對(duì)象中定義有指向鼠標(biāo)事件處理函數(shù)的鼠標(biāo)事件入口函數(shù);在拖拽過(guò)程中,當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行時(shí),向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。
2.如權(quán)利要求1所述的方法,其特征在于,所述第二對(duì)象中定義有拖拽開(kāi)始事件入口函數(shù);所述目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理, 包括所述目標(biāo)窗口在接收到表示拖拽開(kāi)始的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽開(kāi)始事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽開(kāi)始處理函數(shù),將被拖拽對(duì)象的數(shù)據(jù)存儲(chǔ)于剪貼板。
3.如權(quán)利要求1所述的方法,其特征在于,所述第二對(duì)象中定義有拖拽進(jìn)行事件入口函數(shù);所述目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理, 包括所述目標(biāo)窗口在接收到表示拖拽進(jìn)行的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽進(jìn)行事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽進(jìn)行處理函數(shù),使用剪貼板中存儲(chǔ)的數(shù)據(jù)繪制被拖拽對(duì)象。
4.如權(quán)利要求2或3所述的方法,其特征在于,所述第二對(duì)象中還定義有拖拽結(jié)束事件入口函數(shù);所述目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理, 包括所述目標(biāo)窗口在接收到表示拖拽結(jié)束的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽結(jié)束事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽結(jié)束處理函數(shù)進(jìn)行相應(yīng)處理。
5.如權(quán)利要求1所述的方法,其特征在于,該方法還包括當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從其他應(yīng)用程序到所述應(yīng)用程序時(shí),停止發(fā)送全局拖拽消息,向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息, 使所述應(yīng)用程序內(nèi)部的目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。
6.一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)系統(tǒng),應(yīng)用于使用未基于Windows標(biāo)準(zhǔn)控件實(shí)現(xiàn)的應(yīng)用程序,其特征在于,所述系統(tǒng)包括注冊(cè)模塊,用于在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,所述第一對(duì)象為Windows CWnd,所述第二對(duì)象為非 Windows標(biāo)準(zhǔn)對(duì)象,所述第一對(duì)象和所述第二對(duì)象中定義有指向鼠標(biāo)事件處理函數(shù)的鼠標(biāo)事件入口函數(shù);判斷模塊,用于在拖拽過(guò)程中,根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置,判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行,還是從所述應(yīng)用程序到其他應(yīng)用程序;處理模塊,用于當(dāng)所述判斷模塊判斷拖拽是在所述應(yīng)用程序內(nèi)部進(jìn)行時(shí),向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理;當(dāng)所述判斷模塊判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。
7.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述第二對(duì)象中定義有拖拽開(kāi)始事件入口函數(shù);所述處理模塊具體用于,當(dāng)所述目標(biāo)窗口在接收到表示拖拽開(kāi)始的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽開(kāi)始事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽開(kāi)始處理函數(shù),將被拖拽對(duì)象的數(shù)據(jù)存儲(chǔ)于剪貼板。
8.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述第二對(duì)象中定義有拖拽進(jìn)行事件入口函數(shù);所述處理模塊具體用于,當(dāng)所述目標(biāo)窗口在接收到表示拖拽進(jìn)行的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽進(jìn)行事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽進(jìn)行處理函數(shù),使用剪貼板中存儲(chǔ)的數(shù)據(jù)繪制被拖拽對(duì)象。
9.如權(quán)利要求7或8所述的系統(tǒng),其特征在于,所述第二對(duì)象中還定義有拖拽結(jié)束事件入口函數(shù);所述處理模塊還用于,當(dāng)所述目標(biāo)窗口在接收到表示拖拽結(jié)束的鼠標(biāo)消息時(shí),根據(jù)與其綁定的第二對(duì)象中定義的拖拽結(jié)束事件入口函數(shù),通過(guò)調(diào)用對(duì)應(yīng)的拖拽結(jié)束處理函數(shù)進(jìn)行相應(yīng)處理。
10.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述處理模塊還用于,當(dāng)所述判斷模塊根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從其他應(yīng)用程序到所述應(yīng)用程序時(shí),停止發(fā)送全局拖拽消息,向所述應(yīng)用程序內(nèi)部的目標(biāo)窗口發(fā)送拖拽消息,使所述應(yīng)用程序內(nèi)部的目標(biāo)窗口根據(jù)與其綁定的第二對(duì)象調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。
全文摘要
本發(fā)明公開(kāi)了一種基于Windows系統(tǒng)的對(duì)象拖拽實(shí)現(xiàn)方法及其系統(tǒng),該方法包括在所述應(yīng)用程序的底層窗口綁定第一對(duì)象,在該應(yīng)用程序中各可接受拖拽的窗口綁定第二對(duì)象;其中,第一對(duì)象為Windows CWnd對(duì)象;在拖拽過(guò)程中,當(dāng)根據(jù)鼠標(biāo)當(dāng)前位置和所述應(yīng)用程序的底層窗口位置判斷拖拽是從所述應(yīng)用程序到其他應(yīng)用程序時(shí),停止向所述應(yīng)用程序內(nèi)部各可接受拖拽的窗口發(fā)送拖拽消息,并以與所述應(yīng)用程序的底層窗口綁定的CWnd對(duì)象作為發(fā)起源,發(fā)送全局拖拽消息,以使所述其他應(yīng)用程序根據(jù)所述拖拽消息調(diào)用相應(yīng)的鼠標(biāo)事件處理函數(shù)進(jìn)行相應(yīng)處理。本發(fā)明可將應(yīng)用程序的拖拽機(jī)制與Windows系統(tǒng)的拖拽機(jī)制相結(jié)合,提高操作靈活性。
文檔編號(hào)G06F9/44GK102566983SQ20101057635
公開(kāi)日2012年7月11日 申請(qǐng)日期2010年12月7日 優(yōu)先權(quán)日2010年12月7日
發(fā)明者傅斌, 劉元芳, 楊洋, 黃飛躍 申請(qǐng)人:騰訊科技(深圳)有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
宾川县| 施甸县| 贵港市| 兰考县| 闽侯县| 洮南市| 富裕县| 青铜峡市| 区。| 怀远县| 南澳县| 大荔县| 轮台县| 鄂托克旗| 瑞安市| 隆化县| 买车| 呼伦贝尔市| 莒南县| 白山市| 嘉义市| 仪陇县| 肇东市| 阿克| 广东省| 乌拉特前旗| 宕昌县| 孝义市| 宁德市| 蕉岭县| 翁源县| 桐乡市| 凤阳县| 贺州市| 武宣县| 玛纳斯县| 徐水县| 沙洋县| 陕西省| 临西县| 新巴尔虎右旗|