gpt4 book ai didi

Windows CF_DIB 到剪贴板中的 CF_BITMAP

转载 作者:可可西里 更新时间:2023-11-01 10:26:17 26 4
gpt4 key购买 nike

我完全没有使用过 Windows 编程,但现在我有一个问题想在某个程序中修复。我需要将图像放置到 Windows 剪贴板,并且我有指向有效 DIB(设备独立位图)的原始指针(在我的实验中,dib header 版本为 3)。该程序使用具有延迟剪贴板渲染的模型,这意味着首先我们使用 SetClipboardData(CF_DIB, NULL) 然后在 WM_RENDERFORMAT 消息上程序将实际数据放入剪贴板使用 SetClipboardData(format, dibDataPointer)。当我打开 clipbrd.exe(在 windows xp 上)并选择 DIB View 时,我可以毫无问题地看到图像。但是在msdn中写到系统可以自动从CF_DIB渲染成CF_BITMAP格式。我认为这就是为什么当我查看 clipbrd.exe 时我看到两种格式:DIBBITMAP。当我在 clipbrd.exe 中选择 bitmap 格式时,出现错误。起初,当我查看代码时,我发现系统消息处理函数中没有 CF_BITMAP 的情况,因此当系统要求呈现 CF_BITMAP 时,剪贴板中没有任何有效内容,所以我添加了这样的内容:

switch(format){
case CF_DIB:
case CF_BITMAP: //new code

if(format == CF_BITMAP)//new cOde
format = CF_DIB;// new code
....
SetClipboardData(format, dibDataPointer);
....

并希望(实际上,我知道这行不通,但尝试了这种方式)系统会识别出我将作为对 CF_BITMAP 的响应 code>DIB数据,系统会自动转换进来。那么,如果我有一个 DIB 数据(通常情况下,如果我可以使用系统功能将 DIB 转换为 BITMAP 而不是手动从 DIB 创建 BITMAP)?

最佳答案

更新:

所以我找到了解决问题的方法。首先,需要使用 SetClipboardData(CF_DIB, NULL)only CF_DIB 注册延迟渲染。 CF_BITMAP 格式将由 Windows 自动添加到可用的剪贴板类型。然后你需要传递 dib 数据和第一个版本的 header ,它由 BITMAPINFOHEADER 描述(我有 v3 版本,我怀疑 v4 和 v5 header 是否有效) 在 WM_RENDERFORMAT 上具有正 biHeight(Y 坐标)的结构,需要 CF_DIB 格式(系统不会要求您提供 CF_BITMAP 因为你没有手动注册它)。在这种特殊情况下,系统会自动将 CF_DIB 转换为 CF_BITMAP。我不知道这是否适用于位图数据的任何压缩方法,因为我只测试了 BI_RGB 未压缩图像。

所有其他版本的 bitmapinfo dib header 都与 BITMAPINFOHEADER 反向兼容,并且可以使用 memcpy 成功复制.但是不要忘记将 biSize 设置为 sizeof(BITMAPINFOHEADER)。第二部分是设置正 Y 坐标。 (我真的希望带有压缩数据的 DIB 格式应该始终具有正高度。)但是对于未压缩的位图 biHeight 可以小于零,并且应该设为正值.这将导致图像颠倒,因此需要反转图像行。应该提到的是,行按 4 个字节对齐。

最糟糕的是,所有这些 header 标准都在 microsoft 文档中进行了描述。但。例如,Paint 可以获得负高度值的dib 信息v3 header ,clipbrd.exe 可以获得正高度的v3 header 。 写字板 只需要具有正高度的 v1 header 。并且 Windows 将 DIB 转换为 BITMAP 仅具有 v1 header 和正高度。这些都是随 windows 一起分发的应用程序(在 Vista 或更高版本中没有 clipbrd.exe)。这是一个可怕的 hell 。我希望这辈子不再为 Windows 编程。

关于Windows CF_DIB 到剪贴板中的 CF_BITMAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16711600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com