wxWidgets的剪切板实现windows下优先使用OLE接口,但是在使用OLE接口的时候对剪切板里面的数据处理中对部分格式采取了默认处理,有可能造成数据转换的错误,这个时候我们自己要写代码重新从剪切板里面读取数据,采用正确的格式转换数据处理!
下面是一个示例函数:
bool GetOleClipboardData(wxDataObject& data)
{
#if wxUSE_OLE && !defined(__WXWINCE__)
IDataObject *pDataObject = NULL;
HRESULT hr = OleGetClipboard(&pDataObject);
if ( FAILED(hr) || !pDataObject )
{
wxLogSysError(hr, _("Failed to get data from the clipboard"));
return false;
}
// build the list of supported formats
size_t nFormats = data.GetFormatCount(wxDataObject::Set);
wxDataFormat format;
wxDataFormat *formats;
if ( nFormats == 1 )
{
// the most common case
formats = &format;
}
else
{
// bad luck, need to alloc mem
formats = new wxDataFormat[nFormats];
}
data.GetAllFormats(formats, wxDataObject::Set);
// get the data for the given formats
FORMATETC formatEtc;
CLIPFORMAT cf;
bool result = false;
// enumerate all explicit formats on the clipboard.
// note that this does not include implicit / synthetic (automatically
// converted) formats.
#ifdef __WXDEBUG__
// get the format enumerator
IEnumFORMATETC *pEnumFormatEtc = NULL;
hr = pDataObject->EnumFormatEtc(DATADIR_GET, &pEnumFormatEtc);
if ( FAILED(hr) || !pEnumFormatEtc )
{
wxLogSysError(hr,
_("Failed to retrieve the supported clipboard formats"));
}
else
{
// ask for the supported formats and see if there are any we support
for ( ;; )
{
ULONG nCount;
hr = pEnumFormatEtc->Next(1, &formatEtc, &nCount);
// don't use FAILED() because S_FALSE would pass it
if ( hr != S_OK )
{
// no more formats
break;
}
cf = formatEtc.cfFormat;
wxLogTrace(wxTRACE_OleCalls,
wxT("Object on the clipboard supports format %s."),
wxDataObject::GetFormatName(cf));
}
pEnumFormatEtc->Release();
}
#endif // Debug
STGMEDIUM medium;
// stop at the first valid format found on the clipboard
for ( size_t n = 0; !result && (n < nFormats); n++ )
{
// convert to NativeFormat Id
cf = formats[n].GetFormatId();
// if the format is not available, try the next one
// this test includes implicit / sythetic formats
if ( !::IsClipboardFormatAvailable(cf) )
continue;
formatEtc.cfFormat = cf;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
// use the appropriate tymed
switch ( formatEtc.cfFormat )
{
case CF_DIB://与位图一样处理
case CF_BITMAP:
formatEtc.tymed = TYMED_GDI;
break;
#ifndef __WXWINCE__
case CF_METAFILEPICT:
formatEtc.tymed = TYMED_MFPICT;
break;
case CF_ENHMETAFILE:
formatEtc.tymed = TYMED_ENHMF;
break;
#endif
default:
formatEtc.tymed = TYMED_HGLOBAL;
}
// try to get data
hr = pDataObject->GetData(&formatEtc, &medium);
if ( FAILED(hr) )
{
// try other tymed for GDI objects
if ( formatEtc.cfFormat == CF_BITMAP )
{
formatEtc.tymed = TYMED_HGLOBAL;
hr = pDataObject->GetData(&formatEtc, &medium);
}
}
if ( SUCCEEDED(hr) )
{
// pass the data to the data object
hr = data.GetInterface()->SetData(&formatEtc, &medium, true);
if ( FAILED(hr) )
{
wxLogDebug(wxT("Failed to set data in wxIDataObject"));
// IDataObject only takes the ownership of data if it
// successfully got it - which is not the case here
ReleaseStgMedium(&medium);
}
else
{
result = true;
}
}
//else: unsupported tymed?
}
if ( formats != &format )
{
delete [] formats;
}
//else: we didn't allocate any memory
// clean up and return
pDataObject->Release();
return result;
#else
return false;
#endif
}
转载于:https://my.oschina.net/u/2332347/blog/637819
分享到:
相关推荐
剪贴板数据获取是计算机编程中的一个常见任务,特别是在多应用程序交互或用户界面设计中。剪贴板提供了在不同程序间传递信息的便捷途径。在本文中,我们将深入探讨如何在不同的编程语言中获取剪贴板的数据,并了解...
例如,在Windows系统中,可以使用WinAPI函数`OpenClipboard`、`EmptyClipboard`、`GetClipboardData`等来获取和处理剪切板内容。对于跨平台的应用,可能还需要使用如Qt、wxWidgets等库提供的功能。 在开发这类应用...
2. **Windows API调用**:在Windows平台上,剪切板操作通常涉及到对系统API的调用,如`OpenClipboard`、`GetClipboardData`、`EmptyClipboard`等,来获取、设置和清空剪切板数据。 3. **数据类型处理**:剪切板不仅...
在本文中,我们将深入探讨如何使用Visual Studio 2019与wxWidgets 3.1.4进行项目配置。wxWidgets是一个开源的C++库,它允许开发人员创建跨平台的GUI应用程序,支持Windows、Linux、Mac OS X等多个操作系统。VS2019是...
在本项目中,我们将探讨如何在Visual Studio 2010环境下,利用wxWidgets框架来实现串口功能,具体是通过wxctb-0.9这个库进行操作。以下是对这些知识点的详细说明: **wxWidgets框架**: wxWidgets是一个开源的C++库...
第·1·章简要介绍了·wxWidgets·的发展历史和框架结构,第2章介绍了wxWidgets的程序框架及其实现,第3章深入剖析了wxWidgets的事件处理机制,第4~11章详细讲述了wxWidgets的图形用户界面、数据结构及wxWidgets在...
**wxWidgets 概述** wxWidgets 是一个开源的 C++ 库,它允许开发者使用标准的 C++ 编程语法创建跨平台的图形用户界面(GUI)应用程序。这个库提供了丰富的控件集和功能,使得开发者可以编写一次代码,就能在多个...
“wxWidgets中文教程”是为中文用户特别准备的学习资料,它涵盖了从基础到高级的各种主题,旨在帮助初学者快速掌握 wxWidgets 的使用。教程可能包含以下内容: 1. **安装与配置**:如何在不同的操作系统上安装 ...
同时,由于wxWidgets是开源的,它拥有活跃的社区支持,不断更新和优化,这意味着开发者可以获取到最新的功能和修复,以及来自全球开发者的帮助和支持。 总的来说,wxWidgets是一个强大的工具,对于进行嵌入式图像...
wxWidgets和MFC混合编程 wxWidgets和MFC混合编程是指在一个程序中同时使用wxWidgets和MFC这两种技术。wxWidgets是一个跨平台的GUI库,而MFC是微软公司提供的一种应用程序框架。虽然两者都可以用来开发图形用户界面...
对于API查询,开发者可以参考官方文档或使用在线资源,如wxWidgets的官方Wiki、论坛和Stack Overflow等社区,以获取详细信息和示例代码。 **三、深入学习wxWidgets** 深入学习wxWidgets需要掌握以下几个关键点: ...
点击“Copy and Flush”按钮时,除了复制文本到剪切板外,还会执行`wx.Clipboard.Flush()`确保数据被写入剪切板,并且会关闭当前窗口。 #### 四、总结 通过以上介绍和示例代码,我们可以看到,在wxPython中操作...
同时,利用CodeBlocks的版本控制功能,如Git,可以帮助你管理代码的不同版本,防止数据丢失。 总之,CodeBlocks 20.03与wxWidgets 3.14的结合提供了一个强大的C++ GUI开发平台,适用于初学者和经验丰富的开发者。...
【wxWidgets教程(中文)】是一份详细的指南,旨在帮助开发者理解和使用wxWidgets库进行跨平台的图形用户界面(GUI)编程。wxWidgets是开源的C++库,它提供了原生的GUI支持,允许程序员使用一种语言和API在多个操作...
- `wx-config.in` 和 `wx-config-inplace.in`:这些文件与`wx-config`工具相关,该工具用于获取编译和链接wxWidgets库所需的编译选项和路径。 - `setup.h.in` 和 `version-script.in`:`setup.h.in`用于生成包含预定...
1. **阅读基础书籍**:首先,应从《wxWidgets跨平台GUI编程》开始,理解wxWidgets的基本原理和使用方法。 2. **动手实践**:根据书中的示例编写小程序,逐步熟悉API和类库功能。 3. **查阅用户手册**:在遇到具体...
从wxWidgets官方网站获取源代码,并解压缩到合适的目录。 **2.4 配置和编译** 在MSYS2 shell中,导航到wxWidgets源码目录,使用以下命令配置和编译: ```bash ./configure --prefix=/mingw64 --enable-unicode --...
- **数据绑定**:wxWidgets 提供了数据绑定机制,可以直接将控件的数据与对象属性关联起来,简化了数据驱动的界面设计。 - **数据库接口**:wxWidgets 包含了对多种数据库系统的支持,如 ODBC 和 SQLite,可以方便地...
wxWidgets是一个跨平台的程序员的开发工具包,用来开发...本编程手册从浅入深的介绍wxWidgets,详细介绍了窗口、事件、控件、图像、剪贴析、数据结构、文件和流、内存管理、国际化程序、多线程、网络还有高级应用话题。