将DIB复制到剪贴板
下載source files - 90 Kb
介紹
最近,我有理由保存一個(gè)DIB到剪貼板。在四周的時(shí)間里,我嘗試了許多方法,但都沒(méi)有成功
他們工作(非常感謝Chris Losinger和Christian Graus,感謝他們?cè)敢鈬L試并提供給我
指導(dǎo),答案,或兩者都有)。這篇文章描述了我是如何最終實(shí)現(xiàn)我的目標(biāo),但也正好屬于
分類它不漂亮,但它工作。
考驗(yàn)和磨難
因?yàn)槲倚枰@樣做的原因超出了本文的范圍,所以我只需要說(shuō)我的
起始點(diǎn)是一個(gè)BITMAPINFOHEADER結(jié)構(gòu)體和一個(gè)指向表示實(shí)際位圖的位數(shù)組的指針
數(shù)據(jù)。位圖為24位。
起初,我四處徘徊,試圖創(chuàng)建一個(gè)位圖句柄與我的信息。我確信我做得對(duì)
但是由于將位圖移動(dòng)到剪貼板的操作一次次失敗,我(自然)認(rèn)為我必須這樣做
我真的把它搞砸了,所以我去尋求幫助,最后使用了Chris Maunder的CDIBSectionLite類。
Chris的類包含將我捕獲的位圖轉(zhuǎn)換為DIBSection所需的所有代碼,但它缺少這些代碼
將DIB移動(dòng)到剪貼板。這是一個(gè)很好的開(kāi)始。然而,無(wú)論我怎樣努力,我還是做不到
無(wú)法將位圖導(dǎo)入剪貼板。
這一切是如何形成的
在花了一周的時(shí)間試圖從我的代碼(和CDIBSectionLite)中強(qiáng)制出所需的功能之后,我
打電話給微軟軟件開(kāi)發(fā)者熱線(使用我訂閱的MSDN上兩個(gè)可用的免費(fèi)事件之一)。
微軟的那個(gè)家伙帶我看了一個(gè)示例,顯然是wincap32編譯器附帶的。這個(gè)示例
程序?qū)⒉东@所選窗口的內(nèi)容并將其轉(zhuǎn)換為DIB,并將其存儲(chǔ)在剪貼板上。
完美的。
在更改了一個(gè)或兩個(gè)#include語(yǔ)句并更改了文件的名稱之后,我編譯了我的代碼,運(yùn)行了
結(jié)果程序,并bingo - DIB在剪貼板!
我所做的
我做的第一件事是將這個(gè)函數(shù)添加到CDIBSectionLite類中(記住,它不漂亮,但它很漂亮
工作原理:
隱藏,收縮,復(fù)制CodeHANDLE CDIBSectionLite::PutOnClipboard()
{
HANDLE hResult = NULL;
if (::OpenClipboard(NULL))
{
::EmptyClipboard();
::GdiFlush();
}
return hResult;
}
從微軟樣例應(yīng)用程序,我復(fù)制了以下文件到我的項(xiàng)目目錄:
隱藏,復(fù)制CodeDIBUTIL.C
DIBUTIL.H
DIBAPI.H
然后我將DIBUTIL.C文件重命名為DIBUTIL.CPP。在此之后,我必須在該文件中進(jìn)行以下更改
它會(huì)編譯。示例應(yīng)用程序是按原樣編譯的,但因?yàn)槲野藄tdafx。h,編譯器吐在某種類型上
不匹配,因此有以下變化:
隱藏,復(fù)制CodeLine 30: #include <windows.h>
to: #include “stdafx.h”
Line 381: lpbi = GlobalLock(hDIB);
to: lpbi = (LPSTR)GlobalLock(hDIB);
Line 524: lpDIBHdr = GlobalLock(hDIB);
to: lpDIBHdr = (LPSTR)GlobalLock(hDIB);
Line 608: hPal = GetStockObject(DEFAULT_PALETTE);
to: hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
最后,我使用了整個(gè)shebang如下:
隱藏,復(fù)制Code// I needed to construct the BITMAPINFO structure to be passed to the
// CDIBSectionLite object would be happy
HBITMAP hBitmap;
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(BITMAPINFO));
// use the BITMAPINFOHEADER structure that we captured
bmi.bmiHeader = cb.bih;
CDIBSectionLite dib;
// use the BITMAPINFO struct that we created above and the bits we captured
dib.SetBitmap(&bmi, cb.pBuffer);
dib.PutOnClipboard();
最后
它的工作原理。我并不是真的對(duì)從我從文件中挑選出我需要的東西感興趣
microsoftsample app,我打算把它都留在那里。這是我留給讀者的一個(gè)練習(xí)。
本文附帶的zip文件包含修改后的CDIBSectionLite類和修改后的示例應(yīng)用程序
文件,以及整個(gè)示例應(yīng)用程序源代碼的本機(jī)形式。需要注意的是,如果按原樣編譯,則
示例應(yīng)用程序項(xiàng)目創(chuàng)建(或提供)一個(gè)名為DIBAPI.DLL的DLL。這個(gè)DLL包含我鏈接的代碼
直接進(jìn)入我的程序(我不希望它在DLL形式)。
由于我捕獲的位圖的大小,我沒(méi)有為CDIBSectionLite配備保存位圖的能力
剪貼板除了DIB之外的任何東西。但是,請(qǐng)記住,有可能保存多個(gè)項(xiàng)
剪貼板,因此您可以同時(shí)(使用示例應(yīng)用程序代碼)在DIB中的剪貼板上放置位圖
格式,設(shè)備依賴格式,和元文件格式,如果那是絆你的觸發(fā)器。粘貼的任何應(yīng)用
剪貼板將/應(yīng)該拉出最適合它的要求的格式。
本文轉(zhuǎn)載于:http://www.diyabc.com/frontweb/news355.html
總結(jié)
以上是生活随笔為你收集整理的将DIB复制到剪贴板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 毁电脑的cmd命令
- 下一篇: DIB-R 可微分渲染器使用