64位C++Builder剪贴板报错:Unsupported clipboard problem求助
解决64位C++Builder剪贴板"Unsupported clipboard problem"报错问题
问题原因
64位VCL的Clipboard()->Assign()方法对剪贴板中的部分位图格式(如带Alpha通道的DIBV5、非标准位图格式)兼容性不如32位版本,直接赋值时会触发格式不支持错误。
解决方案
1. 先校验格式再处理
先判断剪贴板是否包含CF_BITMAP或CF_DIB等标准位图格式,绕开Assign()的自动转换逻辑:
// 检查剪贴板是否包含标准位图格式 if (Clipboard()->HasFormat(CF_BITMAP)) { TBitmap *BMP = new TBitmap(); // 通过句柄直接赋值,避免格式转换问题 BMP->Handle = reinterpret_cast<HBITMAP>(Clipboard()->GetAsHandle(CF_BITMAP)); Image1->Width = BMP->Width; ImageVue->Height = BMP->Height; Image1->Picture->Bitmap->Assign(BMP); delete BMP; } else if (Clipboard()->HasFormat(CF_DIB)) { // 处理DIB格式的剪贴板数据 HANDLE hDIB = Clipboard()->GetAsHandle(CF_DIB); if (hDIB) { TBitmap *BMP = new TBitmap(); BMP->LoadFromResourceHandle(0, reinterpret_cast<int>(hDIB)); Image1->Width = BMP->Width; ImageVue->Height = BMP->Height; Image1->Picture->Bitmap->Assign(BMP); delete BMP; } } else { ShowMessage("剪贴板中无可用的位图数据"); }
2. 检查版本兼容性
若使用的是C++Builder XE系列早期版本,64位VCL剪贴板模块存在已知bug,建议升级到10.4 Sydney及以后版本,或安装对应版本的官方补丁。
3. 处理带Alpha通道的位图(可选)
如果剪贴板中的是带透明通道的PNG/32位位图,可直接用TPngImage处理:
#include <Vcl.Imaging.pngimage.hpp> if (Clipboard()->HasFormat(CF_PNG)) { TPngImage *PNG = new TPngImage(); PNG->Assign(Clipboard()); Image1->Width = PNG->Width; ImageVue->Height = PNG->Height; Image1->Picture->Assign(PNG); delete PNG; }
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

