
介绍
从Window2000开始内核揭示了帮手COM对象(helper COM-objects),它允许应用指定图象在drag&drop操作时被显示的。这个图象将阿尔法自动地被混和适合当前OS的look&feel。 那是开发商的了不起的新闻。 坏消息是它不与MFC OLE数据来源的缺省实现一起使用。
背景
内核 (version 5 or higher) 给出了DragSourceHelper 对象
(CLSID_DragDropHelper) 具有接口 IDragSourceHelper.
HRESULT InitializeFromBitmap(
LPSHDRAGIMAGE pshdi,
IDataObject *pDataObject
);
HRESULT InitializeFromWindow(
HWND hwnd,
POINT *ppt,
IDataObject *pDataObject
);
此对象的目的是在drag&drop操作时给出视觉反馈。 在发布之前::DoDragDrop调用,当对象被扯拽时您需要事例化对象和转移您希望看的位图。 那是全部。 在MFC中做法就是这样:
数据源
事例并初始化一个数据源:
COleDataSource source;
(帮助对象)
使用标准COM技术,例示帮手对象。 得到位图柄并且初始化SHDRAGIMAGE结构。 现在初始化 位图和数据对象的帮手。请注意:这个代码也工作没有暴露(helper object)帮手对象的系统(Windows 95,98,我和NT),它不显示drag图象。
Collapse
CComPtr<IDragSourceHelper> pHelper;
HRESULT hr = CoCreateInstance(CLSID_DragDropHelper,NULL,
CLSCTX_ALL,IID_IDragSourceHelper,(LPVOID*)&pHelper);
if SUCCEEDED(hr) {
CBitmap bmp;
GetBitmap(bmp);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
SHDRAGIMAGE info;
info.sizeDragImage.cx = bmpInfo.bmWidth;
info.sizeDragImage.cy = bmpInfo.bmHeight;
info.ptOffset.x = 0;
info.ptOffset.y = 0;
info.hbmpDragImage = (HBITMAP)bmp.Detach();
info.crColorKey = GetSysColor(COLOR_WINDOW);
hr = pHelper->InitializeFromBitmap(
&info,
(IDataObject*)source.GetInterface(&IID_IDataObject)
);
if FAILED(hr)
DeleteObject(info.hbmpDragImage);
}
开始 Drag&Drop 操作
source.DoDragDrop();
问题
不幸由于IDataObject接口的COleDataSource的实现的局限,这个代码部分不工作。 原因是帮助对象在调用InitializeFromBitmap时,IDataObject ::SetData具有一个定制得剪贴板格式指针在数据对象之内。
数据对象必须满足这个调用。缺省实现COleDataSource不接受未知的剪贴板格式,因此我们需要重载IDataObject ::SetData方法。
解决方案
如果我们重载 IDataObject::SetData 允许一个任意格式被存储在数据对象中, 那么它将是好用的。
Class COleDataSourceEx : public COleDataSource
{
public:
DECLARE_INTERFACE_MAP() 本文章更多内容:1 - 2 - 下一页>> |