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

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    查了MSDN,發(fā)現(xiàn)Windows支持Drag and Drop的方法是四個(gè)COM:IEnumFORMATETC、IDataObject、IDropSource和IDropTarget。為了讓自己做的一個(gè)代碼編輯文本框里面的代碼可以被拖出去拖進(jìn)來(lái),無(wú)奈之下只好實(shí)現(xiàn)了這四個(gè)東西。

    實(shí)現(xiàn)了之后,程序剛開始需要調(diào)用OldInitialize(NULL);,結(jié)束的時(shí)候調(diào)用OnUninitialize();,控件創(chuàng)建的時(shí)候調(diào)用RegisterDragDrop,控件結(jié)束的時(shí)候調(diào)用RevokeDragDrop。然后就可以通過(guò)這些COM來(lái)做Drag and Drop了。下面是接口的實(shí)現(xiàn):

    頭文件:
 1 /*******************************************************************************
 2 Vczh Library++ 2.0
 3 Vczh Coder::文本拖曳
 4 開發(fā)者:陳梓瀚
 5 
 6 接口:
 7 類:
 8   TextProvider                        :文本拖曳處理器
 9 函數(shù):
10 *******************************************************************************/
11 #ifndef VCZHCODER_TEXTPROVIDER
12 #define VCZHCODER_TEXTPROVIDER
13 
14 #include <objidl.h>
15 #include "..\..\..\..\VL++\Library\Data\Data\VL_Data_String.h"
16 
17 using namespace vl;
18 
19 class TextProvider : public IEnumFORMATETC , public IDataObject , public IDropSource , public IDropTarget
20 {
21 protected:
22     VBool                FEnumeratorReaded;
23     FORMATETC            FAvailableFormat;
24     HGLOBAL                FGlobal;
25 
26     virtual VBool        OnDragDropGetData(VUnicodeString& String)=0;
27     virtual void        OnDragOver(VInt X , VInt Y)=0;
28     virtual void        OnDragEnter()=0;
29     virtual void        OnDragLeave()=0;
30     virtual void        OnDrop(VUnicodeString String , VInt X , VInt Y)=0;
31 public:
32     TextProvider();
33     ~TextProvider();
34 
35     VBool                Drag();
36 
37     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid , __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject);
38     ULONG STDMETHODCALLTYPE AddRef();
39     ULONG STDMETHODCALLTYPE Release();
40 
41     HRESULT STDMETHODCALLTYPE Next(ULONG celt , FORMATETC *rgelt , ULONG *pceltFetched);
42     HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
43     HRESULT STDMETHODCALLTYPE Reset();
44     HRESULT STDMETHODCALLTYPE Clone(__RPC__deref_out_opt IEnumFORMATETC **ppenum);
45 
46     HRESULT STDMETHODCALLTYPE GetData(FORMATETC *pformatetcIn ,STGMEDIUM *pmedium);
47     HRESULT STDMETHODCALLTYPE GetDataHere(FORMATETC *pformatetc , STGMEDIUM *pmedium);
48     HRESULT STDMETHODCALLTYPE QueryGetData(__RPC__in_opt FORMATETC *pformatetc);
49     HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(__RPC__in_opt FORMATETC *pformatectIn , __RPC__out FORMATETC *pformatetcOut);
50     HRESULT STDMETHODCALLTYPE SetData(FORMATETC *pformatetc , STGMEDIUM *pmedium , BOOL fRelease);
51     HRESULT STDMETHODCALLTYPE EnumFormatEtc(DWORD dwDirection , __RPC__deref_out_opt IEnumFORMATETC **ppenumFormatEtc);
52     HRESULT STDMETHODCALLTYPE DAdvise(__RPC__in FORMATETC *pformatetc , DWORD advf , __RPC__in_opt IAdviseSink *pAdvSink , __RPC__out DWORD *pdwConnection);
53     HRESULT STDMETHODCALLTYPE DUnadvise(DWORD dwConnection);
54     HRESULT STDMETHODCALLTYPE EnumDAdvise(__RPC__deref_out_opt IEnumSTATDATA **ppenumAdvise);
55 
56     HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed , DWORD grfKeyState);
57     HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect);
58     
59     HRESULT STDMETHODCALLTYPE DragEnter(__RPC__in_opt IDataObject *pDataObj , DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect);
60     HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect);
61     HRESULT STDMETHODCALLTYPE DragLeave();
62     HRESULT STDMETHODCALLTYPE Drop(__RPC__in_opt IDataObject *pDataObj , DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect);
63 };
64 
65 #endif

    代碼文件:
  1 #include <windows.h>
  2 #include "TextProvider.h"
  3 #include "..\..\..\..\VL++\Library\Windows\VL_WinMain.h"
  4 
  5 using namespace vl::windows;
  6 
  7 TextProvider::TextProvider()
  8 {
  9     FEnumeratorReaded=false;
 10     FAvailableFormat.cfFormat=CF_TEXT;
 11     FAvailableFormat.ptd=0;
 12     FAvailableFormat.dwAspect=DVASPECT_ICON;
 13     FAvailableFormat.lindex=-1;
 14     FAvailableFormat.tymed=TYMED_HGLOBAL;
 15     FGlobal=0;
 16 }
 17 
 18 TextProvider::~TextProvider()
 19 {
 20 }
 21 
 22 VBool TextProvider::Drag()
 23 {
 24     VUnicodeString String;
 25     if(!OnDragDropGetData(String))
 26     {
 27         return false;
 28     }
 29 
 30     FGlobal=GlobalAlloc(GMEM_FIXED,(String.Length()+1)*sizeof(VWChar));
 31     VMbcsString Mbcs=ToMbcs(String);
 32     memcpy((VPointer)FGlobal,Mbcs.Buffer(),Mbcs.Length()+1);
 33 
 34     DWORD Effect=DROPEFFECT_MOVE|DROPEFFECT_COPY;
 35     DWORD Result=0;
 36     if(DoDragDrop(this,this,Effect,&Result)==DRAGDROP_S_DROP)
 37     {
 38         switch(Result)
 39         {
 40         case DROPEFFECT_MOVE:
 41             return true;
 42         case DROPEFFECT_COPY:
 43             return false;
 44         default:
 45             if(FGlobal)
 46             {
 47                 GlobalFree(FGlobal);
 48                 FGlobal=0;
 49             }
 50             return false;
 51         }
 52     }
 53     else
 54     {
 55         if(FGlobal)
 56         {
 57             GlobalFree(FGlobal);
 58             FGlobal=0;
 59         }
 60         return false;
 61     }
 62 }
 63 
 64 HRESULT STDMETHODCALLTYPE TextProvider::QueryInterface(REFIID riid , __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
 65 {
 66     if(riid==IID_IUnknown)
 67     {
 68         *ppvObject=static_cast<IUnknown*>(static_cast<IDataObject*>(this));
 69     }
 70     else if(riid==IID_IEnumFORMATETC)
 71     {
 72         IEnumFORMATETC* Object=this;
 73         *ppvObject=Object;
 74     }
 75     else if(riid==IID_IDataObject)
 76     {
 77         IDataObject* Object=this;
 78         *ppvObject=Object;
 79     }
 80     else if(riid==IID_IDropSource)
 81     {
 82         IDropSource* Object=this;
 83         *ppvObject=Object;
 84     }
 85     else if(riid==IID_IDropTarget)
 86     {
 87         IDropTarget* Object=this;
 88         *ppvObject=Object;
 89     }
 90     else
 91     {
 92         *ppvObject=NULL;
 93         return E_NOINTERFACE;
 94     }
 95     return S_OK;
 96 }
 97 
 98 ULONG STDMETHODCALLTYPE TextProvider::AddRef()
 99 {
100     return 1;
101 }
102 
103 ULONG STDMETHODCALLTYPE TextProvider::Release()
104 {
105     return 1;
106 }
107 
108 HRESULT STDMETHODCALLTYPE TextProvider::Next(ULONG celt , FORMATETC *rgelt , ULONG *pceltFetched)
109 {
110     if(FEnumeratorReaded)
111     {
112         if(pceltFetched)
113         {
114             *pceltFetched=0;
115         }
116         return S_FALSE;
117     }
118     else
119     {
120         FEnumeratorReaded=true;
121         if(celt)
122         {
123             if(pceltFetched)
124             {
125                 *pceltFetched=1;
126             }
127             if(rgelt)
128             {
129                 *rgelt=FAvailableFormat;
130             }
131         }
132         return celt==1?S_OK:S_FALSE;
133     }
134 }
135 
136 HRESULT STDMETHODCALLTYPE TextProvider::Skip(ULONG celt)
137 {
138     return S_FALSE;
139 }
140 
141 HRESULT STDMETHODCALLTYPE TextProvider::Reset()
142 {
143     FEnumeratorReaded=false;
144     return S_OK;
145 }
146 
147 HRESULT STDMETHODCALLTYPE TextProvider::Clone(__RPC__deref_out_opt IEnumFORMATETC **ppenum)
148 {
149     *ppenum=static_cast<IEnumFORMATETC*>(this);
150     return S_OK;
151 }
152 
153 HRESULT STDMETHODCALLTYPE TextProvider::GetData(FORMATETC *pformatetcIn ,STGMEDIUM *pmedium)
154 {
155     if(pformatetcIn->cfFormat!=CF_TEXT || pformatetcIn->tymed!=TYMED_HGLOBAL)
156     {
157         return DV_E_FORMATETC;
158     }
159     pmedium->tymed=TYMED_HGLOBAL;
160     pmedium->hGlobal=FGlobal;
161     pmedium->pUnkForRelease=NULL;
162     FGlobal=0;
163     return S_OK;
164 }
165 
166 HRESULT STDMETHODCALLTYPE TextProvider::GetDataHere(FORMATETC *pformatetc , STGMEDIUM *pmedium)
167 {
168     return DV_E_TYMED;
169 }
170 
171 HRESULT STDMETHODCALLTYPE TextProvider::QueryGetData(__RPC__in_opt FORMATETC *pformatetc)
172 {
173     if(pformatetc->cfFormat!=CF_TEXT || pformatetc->tymed!=TYMED_HGLOBAL)
174     {
175         return DV_E_FORMATETC;
176     }
177     else
178     {
179         return S_OK;
180     }
181 }
182 
183 HRESULT STDMETHODCALLTYPE TextProvider::GetCanonicalFormatEtc(__RPC__in_opt FORMATETC *pformatectIn , __RPC__out FORMATETC *pformatetcOut)
184 {
185     *pformatetcOut=FAvailableFormat;
186     return DATA_S_SAMEFORMATETC;
187 }
188 
189 HRESULT STDMETHODCALLTYPE TextProvider::SetData(FORMATETC *pformatetc , STGMEDIUM *pmedium , BOOL fRelease)
190 {
191     return E_NOTIMPL;
192 }
193 
194 HRESULT STDMETHODCALLTYPE TextProvider::EnumFormatEtc(DWORD dwDirection , __RPC__deref_out_opt IEnumFORMATETC **ppenumFormatEtc)
195 {
196     Reset();
197     *ppenumFormatEtc=static_cast<IEnumFORMATETC*>(this);
198     return S_OK;
199 }
200 
201 HRESULT STDMETHODCALLTYPE TextProvider::DAdvise(__RPC__in FORMATETC *pformatetc , DWORD advf , __RPC__in_opt IAdviseSink *pAdvSink , __RPC__out DWORD *pdwConnection)
202 {
203     return OLE_E_ADVISENOTSUPPORTED;
204 }
205 
206 HRESULT STDMETHODCALLTYPE TextProvider::DUnadvise(DWORD dwConnection)
207 {
208     return OLE_E_ADVISENOTSUPPORTED;
209 }
210 
211 HRESULT STDMETHODCALLTYPE TextProvider::EnumDAdvise(__RPC__deref_out_opt IEnumSTATDATA **ppenumAdvise)
212 {
213     return OLE_E_ADVISENOTSUPPORTED;
214 }
215 
216 HRESULT STDMETHODCALLTYPE TextProvider::QueryContinueDrag(BOOL fEscapePressed , DWORD grfKeyState)
217 {
218     if(fEscapePressed==TRUE)
219     {
220         return DRAGDROP_S_CANCEL;
221     }
222     else if(grfKeyState&MK_LBUTTON)
223     {
224         return S_OK;
225     }
226     else
227     {
228         return DRAGDROP_S_DROP;
229     }
230 }
231 
232 HRESULT STDMETHODCALLTYPE TextProvider::GiveFeedback(DWORD dwEffect)
233 {
234     return DRAGDROP_S_USEDEFAULTCURSORS;
235 }
236 
237 HRESULT STDMETHODCALLTYPE TextProvider::DragEnter(__RPC__in_opt IDataObject *pDataObj , DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect)
238 {
239     IEnumFORMATETC* Enumerator=0;
240     VBool Found=false;
241     if(pDataObj->EnumFormatEtc(DATADIR_GET,&Enumerator)!=S_OK)return E_UNEXPECTED;
242     FORMATETC Format;
243     ULONG Fetched=0;
244     while(true)
245     {
246         Enumerator->Next(1,&Format,&Fetched);
247         if(Fetched==0)
248         {
249             break;
250         }
251         if(Format.cfFormat==CF_TEXT && Format.tymed==TYMED_HGLOBAL)
252         {
253             if(pDataObj->QueryGetData(&Format)==S_OK)
254             {
255                 Found=true;
256             }
257         }
258     }
259     Enumerator->Release();
260     if(Found)
261     {
262         *pdwEffect=grfKeyState&MK_CONTROL?DROPEFFECT_COPY:DROPEFFECT_MOVE;
263         OnDragEnter();
264     }
265     else
266     {
267         *pdwEffect=DROPEFFECT_NONE;
268     }
269     return S_OK;
270 }
271 
272 HRESULT STDMETHODCALLTYPE TextProvider::DragOver(DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect)
273 {
274     if(*pdwEffect&DROPEFFECT_COPY || *pdwEffect&DROPEFFECT_MOVE)
275     {
276         *pdwEffect=grfKeyState&MK_CONTROL?DROPEFFECT_COPY:DROPEFFECT_MOVE;
277         OnDragOver(pt.x,pt.y);
278     }
279     else
280     {
281         *pdwEffect=DROPEFFECT_NONE;
282     }
283     return S_OK;
284 }
285 
286 HRESULT STDMETHODCALLTYPE TextProvider::DragLeave()
287 {
288     OnDragLeave();
289     return S_OK;
290 }
291 
292 HRESULT STDMETHODCALLTYPE TextProvider::Drop(__RPC__in_opt IDataObject *pDataObj , DWORD grfKeyState , POINTL pt , __RPC__inout DWORD *pdwEffect)
293 {
294     STGMEDIUM Medium;
295     if(!pDataObj->GetData(&FAvailableFormat,&Medium)==S_OK)
296     {
297         ShowMessage(GetApplication()->GetMainForm(),L"拖放源不支持將數(shù)據(jù)轉(zhuǎn)換成字符串,拖放失敗。",GetApplication()->GetMainForm()->GetText());
298         return E_UNEXPECTED;
299     }
300     if(Medium.tymed!=TYMED_HGLOBAL)
301     {
302         ReleaseStgMedium(&Medium);
303         ShowMessage(GetApplication()->GetMainForm(),L"拖放源不支持將數(shù)據(jù)使用HGLOBAL傳送,拖放失敗。",GetApplication()->GetMainForm()->GetText());
304         return E_UNEXPECTED;
305     }
306     PCChar Buffer=(PCChar)GlobalLock(Medium.hGlobal);
307     VUnicodeString String=ToUnicode(Buffer);
308     GlobalUnlock(Medium.hGlobal);
309     ReleaseStgMedium(&Medium);
310     OnDrop(String,pt.x,pt.y);
311     *pdwEffect=grfKeyState&MK_CONTROL?DROPEFFECT_COPY:DROPEFFECT_MOVE;
312     return S_OK;
313 }

    寫了一整天。
posted on 2009-05-29 21:17 陳梓瀚(vczh) 閱讀(3064) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C++

評(píng)論:
# re: 使用COM實(shí)現(xiàn)控件內(nèi)容的Drag and Drop 2009-05-29 22:36 | 沈臻豪(foxtail)
做了什么東東啊 截圖秀秀  回復(fù)  更多評(píng)論
  
# re: 使用COM實(shí)現(xiàn)控件內(nèi)容的Drag and Drop 2009-05-30 17:00 | 東方CJ
收藏一下,正需要這個(gè)  回復(fù)  更多評(píng)論
  
# re: 使用COM實(shí)現(xiàn)控件內(nèi)容的Drag and Drop 2009-06-03 20:42 | SOS
罕見的發(fā)現(xiàn)你寫了個(gè)具體技術(shù)的日志,另外OldInitialize是啥--,舊式初始化>_<  回復(fù)  更多評(píng)論
  
# re: 使用COM實(shí)現(xiàn)控件內(nèi)容的Drag and Drop 2009-06-04 19:02 | 飄飄白云
@SOS

樓主筆誤了,應(yīng)是:

OleInitialize()
OleUninitialize()
  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产一区二区欧美日韩| 蜜臀a∨国产成人精品| 久久米奇亚洲| 欧美在线不卡视频| 久久久久国产精品一区| 免费人成精品欧美精品| 亚洲国产婷婷香蕉久久久久久| 久久午夜精品| 久久永久免费| 欧美日韩三级视频| 国产免费一区二区三区香蕉精| 一区二区冒白浆视频| 一区二区三区四区在线| 久久成人国产| 美女尤物久久精品| 欧美日韩亚洲高清| 国产无遮挡一区二区三区毛片日本| 能在线观看的日韩av| 欧美精品久久久久a| 国产精品丝袜xxxxxxx| 揄拍成人国产精品视频| 亚洲久色影视| 久久久久久免费| 亚洲激情网址| 小黄鸭精品密入口导航| 欧美成人午夜激情视频| 国产女优一区| 一本久道久久久| 久久久久国产一区二区三区四区| 亚洲一级黄色| 麻豆精品91| 亚洲五月六月| 欧美福利一区二区三区| 国产欧美日韩综合一区在线观看| 欧美激情按摩在线| 国产欧美日韩激情| 亚洲视频免费看| 另类亚洲自拍| 国产精品美腿一区在线看| 亚洲精品一二| 久久午夜羞羞影院免费观看| 欧美日韩免费观看一区二区三区| 久久久久成人精品免费播放动漫| 夜夜夜精品看看| 久久综合久久综合久久| 国产一区二区三区日韩欧美| av不卡在线观看| 美女免费视频一区| 欧美一区久久| 国产麻豆精品久久一二三| 亚洲小说春色综合另类电影| 亚洲国产精品一区二区www| 久久久噜噜噜久久| 樱桃视频在线观看一区| 久久午夜视频| 久久精品国语| 在线欧美日韩国产| 葵司免费一区二区三区四区五区| 久久免费精品视频| 亚洲视频一区二区在线观看| 欧美色综合天天久久综合精品| 国产精品视频999| 国产精品99久久99久久久二8| 一本色道久久精品| 女人色偷偷aa久久天堂| 久久精品观看| 亚洲电影观看| 欧美激情在线狂野欧美精品| 久久综合国产精品| 亚洲黄色一区二区三区| 亚洲高清自拍| 欧美剧在线免费观看网站| 一本一道久久综合狠狠老精东影业| 一本色道久久综合狠狠躁篇的优点| 一本色道久久综合狠狠躁的推荐| 国产精品99久久久久久宅男 | 欧美在线亚洲一区| 亚洲综合成人在线| 经典三级久久| 欧美成人免费视频| 欧美精品久久久久久久免费观看| 国产日韩精品一区二区三区在线| 一区二区在线视频| 久久香蕉国产线看观看av| 久久久噜噜噜久久中文字幕色伊伊 | 久久久精彩视频| 国产一区二区精品久久91| 久久综合给合| 欧美三级视频在线| 久久久久**毛片大全| 噜噜噜噜噜久久久久久91| 一区二区精品在线| 亚洲精品欧美在线| 亚洲图片在线| 久久成人18免费网站| 欧美一区二区三区精品| 一区在线视频观看| 亚洲精品国产精品国自产观看| 一本一道久久综合狠狠老精东影业| 亚洲欧美精品在线观看| 韩国三级在线一区| 日韩亚洲在线观看| 在线播放中文一区| 最新高清无码专区| 猛男gaygay欧美视频| 亚洲乱码日产精品bd| 亚洲一区日韩| 亚洲视频精品| 午夜精品久久久久久久| 亚洲国产精品女人久久久| 美女免费视频一区| 国产精品视频一二三| 亚洲经典自拍| 国产一区深夜福利| 亚洲网站在线看| 亚洲精品日韩精品| 久久先锋影音| 欧美在线啊v一区| 欧美日韩免费观看一区二区三区| 亚洲第一成人在线| 亚洲天天影视| 一本久道综合久久精品| 欧美一区二区三区在线视频| 亚洲欧美www| 欧美日韩调教| 亚洲韩国精品一区| 亚洲人成在线免费观看| 久久婷婷国产综合尤物精品| 久久久久国内| 国内精品嫩模av私拍在线观看| 美日韩精品视频| 欧美日韩在线一二三| 亚洲理论在线| 99re热精品| 欧美精品1区2区| 91久久精品日日躁夜夜躁国产| 亚洲精品免费看| 激情六月婷婷综合| 欧美高清视频| 久久精品国产亚洲高清剧情介绍| 狠狠爱www人成狠狠爱综合网| 99视频精品在线| 欧美精品在线一区二区| 欧美精品免费看| 一区二区三区国产| 久久午夜羞羞影院免费观看| 久久精品视频在线播放| 国产欧美日韩激情| 欧美一区二区在线观看| 久久久久久久网| 在线不卡亚洲| 欧美暴力喷水在线| 亚洲精品免费网站| 亚洲一二三四久久| 国产精品揄拍500视频| 亚洲欧美日韩一区二区在线| 久久久久.com| 在线观看成人av| 欧美激情亚洲一区| 亚洲视频中文字幕| 六十路精品视频| 日韩一级视频免费观看在线| 欧美色中文字幕| 欧美一区二区三区啪啪| 国产日韩欧美一区| 午夜日韩av| 久久成人羞羞网站| 在线日本欧美| 欧美日韩91| 午夜日韩av| 亚洲片在线资源| 欧美中文字幕视频在线观看| 在线观看日韩| 国产精品国色综合久久| 久久www成人_看片免费不卡| 91久久精品美女| 久久久人人人| 亚洲一区二区三区视频| 黑人一区二区| 欧美日韩精品免费在线观看视频| 午夜性色一区二区三区免费视频| 久久精品99久久香蕉国产色戒| 一区二区三区高清| 亚洲韩国日本中文字幕| 久久狠狠亚洲综合| 美女国内精品自产拍在线播放| 玖玖在线精品| 亚洲国产精品www| 国产精品欧美日韩一区二区| 欧美一区二区精品在线| 亚洲激情电影中文字幕| 欧美中文在线字幕| 一区二区三区视频在线观看| 国内精品一区二区三区| 欧美极品一区| 久久亚洲综合网| 欧美一级大片在线免费观看| 亚洲精品婷婷| 欧美激情a∨在线视频播放| 久久精品三级|