2

我根本没有使用 Windows 编程的经验,但现在我有一个问题想在某个程序中解决。我需要将图像放置到 Windows 剪贴板,并且我有指向有效DIB(与设备无关的位图)的原始指针(在我的实验中,dib 标头版本是 3)。该程序使用具有延迟剪贴板渲染的模型,这意味着首先我们使用SetClipboardData(CF_DIB, NULL)然后在WM_RENDERFORMAT消息程序中将实际数据放置到剪贴板中SetClipboardData(format, dibDataPointer)。当我打开clipbrd.exe(在 windows xp 上)并选择DIB视图时,我可以毫无问题地看到图像。但在msdn写入系统可以自动渲染从CF_DIB格式CF_BITMAP。我认为这就是为什么当我查看时会clipbrd.exe看到 2 种格式:DIBBITMAP. 当我选择clipbrd.exebitmap我收到错误的格式。起初,当我查看代码时,我发现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并且DIB系统将自动转换。那么,如果我有数据,如何为来自系统的格式的WM_RENDERFORMAT消息放置适当的数据(通常,如果我可以使用系统功能转换为而不是手动创建会更好)?CF_BITMAPDIBDIBBITMAPBITMAPDIB

4

1 回答 1

2

更新:

所以我找到了解决问题的方法。首先需要注册延迟渲染with only。该格式将自动添加到可用的剪贴板类型中。然后,您需要传递带有第一个版本的标题的数据,该数据由(我有 v3 版本,我怀疑 v4 和 v5 标题是否可以工作)具有正(Y 坐标)的结构和所需的格式(系统赢了'不问你,因为你没有手动注册)。在这种特殊情况下,系统将自动转换为。我不知道这是否适用于位图数据的任何压缩方法,因为我只测试了CF_DIBSetClipboardData(CF_DIB, NULL)CF_BITMAPWindowsdibBITMAPINFOHEADERbiHeightWM_RENDERFORMATCF_DIBCF_BITMAPCF_DIBCF_BITMAPBI_RGB未压缩的图像。

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

最糟糕的是,所有这些标头标准都在microsoft文档中进行了描述。但。例如,Paint可以获取dib具有负高度值的信息 v3 标头,可以获取具有正高度值的clipbrd.exev3 标头。只需要具有正高度的wordpadv1 标头。并且 windows仅使用 v1 标题和正高度转换DIBro 。BITMAP这都是随应用程序一起分发的windowsclipbrd.exe在 Vista 或更高版本中没有)。这是一个可怕的地狱。Windows我希望在我的一生中不会再有任何编程。

于 2013-05-24T08:56:30.560 回答