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

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

    實現(xiàn)了之后,程序剛開始需要調(diào)用OldInitialize(NULL);,結(jié)束的時候調(diào)用OnUninitialize();,控件創(chuàng)建的時候調(diào)用RegisterDragDrop,控件結(jié)束的時候調(diào)用RevokeDragDrop。然后就可以通過這些COM來做Drag and Drop了。下面是接口的實現(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) 評論(4)  編輯 收藏 引用 所屬分類: C++

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

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

OleInitialize()
OleUninitialize()
  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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资源在线看亚洲| 亚洲精品少妇30p| 欧美激情中文字幕一区二区 | 亚洲第一中文字幕| 久久九九99| 久久亚洲视频| 亚洲精品国产日韩| 亚洲视频一区二区| 先锋a资源在线看亚洲| 久热精品在线| 欧美丝袜第一区| 国产精品白丝jk黑袜喷水| 欧美性色综合| 韩日精品在线| 亚洲一区二区三区在线观看视频 | 在线午夜精品自拍| 亚洲男同1069视频| 美国十次了思思久久精品导航| 久久国产精品网站| 亚洲经典视频在线观看| 亚洲欧美韩国| 欧美激情成人在线| 国产欧美精品一区| 亚洲国产岛国毛片在线| 欧美性色视频在线| 在线看欧美日韩| 午夜精品区一区二区三| 亚洲电影第1页| 欧美怡红院视频| 国产精品久久久久久模特| 亚洲精品在线观看视频| 久久狠狠亚洲综合| 亚洲神马久久| 国产精品theporn88| 免费观看一区| 国产精品视频自拍| 午夜在线观看免费一区| 最新中文字幕一区二区三区| 亚洲图色在线| 99视频在线观看一区三区| 麻豆精品在线视频| 亚洲国产美女| 欧美黄色免费| 麻豆九一精品爱看视频在线观看免费| 国产日韩欧美黄色| 久久一区中文字幕| 久久夜色撩人精品| 99视频日韩| 亚洲视频中文字幕| 国产欧美一区二区色老头| 老司机一区二区三区| 久久婷婷影院| 午夜亚洲性色视频| 蜜乳av另类精品一区二区| 日韩一区二区福利| 亚洲你懂的在线视频| 国产精品婷婷| 亚洲精品国产精品乱码不99按摩| 国产精品国产三级国产aⅴ浪潮| 欧美日韩一视频区二区| 欧美大片在线影院| 欧美亚洲三区| 欧美视频国产精品| 亚洲黄色一区| 91久久在线视频| 久久久久久欧美| 久久久噜噜噜久久中文字幕色伊伊| 久久免费偷拍视频| 久久精品中文字幕免费mv| 夜夜爽夜夜爽精品视频| 久久av老司机精品网站导航| 亚洲一区中文字幕在线观看| 美女精品视频一区| 久久精品国产亚洲一区二区| 久久九九久精品国产免费直播| 亚洲精品免费在线播放| 久久久久国产免费免费| 亚洲欧美在线免费| 欧美激情一区二区三级高清视频| 性久久久久久久久| 国产欧美在线| 亚洲视频二区| 99国产精品久久久久久久| 欧美gay视频| 欧美jizz19性欧美| 亚洲国产精品久久久久秋霞影院| 久久免费视频观看| 亚洲精品日韩激情在线电影| 在线性视频日韩欧美| 国产精品拍天天在线| 欧美一级成年大片在线观看| 久久在线免费| 亚洲欧美日韩一区二区三区在线观看 | 裸体歌舞表演一区二区| 亚洲激情午夜| 欧美中文字幕在线观看| 亚洲人成网站精品片在线观看| 欧美高清自拍一区| 日韩视频一区二区三区在线播放免费观看 | 久久黄色级2电影| 久久久最新网址| 亚洲国产成人午夜在线一区| 久久成人免费网| 亚洲电影免费在线| 欧美专区福利在线| 亚洲一区一卡| 一区二区三区免费在线观看| 激情婷婷亚洲| 国产日韩在线一区| 国产精品丝袜xxxxxxx| 国产精品www网站| 欧美极品在线观看| 欧美肥婆在线| 欧美精品一区在线| 欧美激情一级片一区二区| 欧美成人一品| 欧美激情综合色| 欧美性大战久久久久久久| 欧美精品1区| 欧美日韩成人免费| 国产精品高潮呻吟久久av无限| 欧美精品v国产精品v日韩精品| 蜜臀av一级做a爰片久久| 毛片基地黄久久久久久天堂| 欧美亚洲一区二区在线| 欧美日韩激情网| 久久狠狠亚洲综合| 99在线|亚洲一区二区| 国产精品试看| 亚洲激情欧美| 黄色精品免费| 日韩视频在线永久播放| 午夜亚洲视频| 欧美一区二区三区在线观看| 欧美日韩视频在线观看一区二区三区| 欧美77777| 亚洲第一视频网站| 久久一区二区三区四区五区| 久久久成人精品| 国产日韩精品视频一区| 亚洲欧美色一区| 亚洲综合日本| 欧美视频免费看| 欧美电影在线| 亚洲乱码国产乱码精品精天堂| 你懂的网址国产 欧美| 欧美激情女人20p| 亚洲另类一区二区| 欧美成年人网站| 最新国产成人在线观看| 一区二区av| 国产精品成人午夜| 亚洲欧美日韩国产综合精品二区| 欧美一区亚洲| 亚洲电影免费在线| 欧美激情综合网| 亚洲午夜高清视频| 久久久久久综合| 亚洲第一福利在线观看| 欧美国产精品va在线观看| 日韩午夜中文字幕| 欧美一区二区三区视频免费| 国产精品系列在线| 久久国内精品视频| 亚洲日本一区二区三区| 国产精品99久久久久久宅男 | 国产老女人精品毛片久久| 亚洲一区激情| 欧美精品二区| 亚洲欧洲av一区二区| 亚洲小说区图片区| 亚洲一级高清| 亚洲免费高清| 久久久一区二区| 一区二区日韩| 久久九九免费| 亚洲欧美文学| 欧美日韩综合在线| 欧美国产丝袜视频| 国产一区视频在线观看免费| 久久婷婷激情| 西瓜成人精品人成网站| 欧美精品v国产精品v日韩精品| 欧美中文字幕在线视频| 欧美日韩精品在线播放| 亚洲福利视频在线| 亚洲自拍偷拍色片视频| 久久一区二区三区四区| 91久久中文| 国产精品jvid在线观看蜜臀| 黄色小说综合网站| 欧美视频在线观看免费网址| 久久久久www|