将DIB复制到剪贴板
下載source files - 90 Kb
介紹
最近,我有理由保存一個DIB到剪貼板。在四周的時間里,我嘗試了許多方法,但都沒有成功
他們工作(非常感謝Chris Losinger和Christian Graus,感謝他們愿意嘗試并提供給我
指導,答案,或兩者都有)。這篇文章描述了我是如何最終實現我的目標,但也正好屬于
分類它不漂亮,但它工作。
考驗和磨難
因為我需要這樣做的原因超出了本文的范圍,所以我只需要說我的
起始點是一個BITMAPINFOHEADER結構體和一個指向表示實際位圖的位數組的指針
數據。位圖為24位。
起初,我四處徘徊,試圖創建一個位圖句柄與我的信息。我確信我做得對
但是由于將位圖移動到剪貼板的操作一次次失敗,我(自然)認為我必須這樣做
我真的把它搞砸了,所以我去尋求幫助,最后使用了Chris Maunder的CDIBSectionLite類。
Chris的類包含將我捕獲的位圖轉換為DIBSection所需的所有代碼,但它缺少這些代碼
將DIB移動到剪貼板。這是一個很好的開始。然而,無論我怎樣努力,我還是做不到
無法將位圖導入剪貼板。
這一切是如何形成的
在花了一周的時間試圖從我的代碼(和CDIBSectionLite)中強制出所需的功能之后,我
打電話給微軟軟件開發者熱線(使用我訂閱的MSDN上兩個可用的免費事件之一)。
微軟的那個家伙帶我看了一個示例,顯然是wincap32編譯器附帶的。這個示例
程序將捕獲所選窗口的內容并將其轉換為DIB,并將其存儲在剪貼板上。
完美的。
在更改了一個或兩個#include語句并更改了文件的名稱之后,我編譯了我的代碼,運行了
結果程序,并bingo - DIB在剪貼板!
我所做的
我做的第一件事是將這個函數添加到CDIBSectionLite類中(記住,它不漂亮,但它很漂亮
工作原理:
隱藏,收縮,復制CodeHANDLE CDIBSectionLite::PutOnClipboard()
{
HANDLE hResult = NULL;
if (::OpenClipboard(NULL))
{
::EmptyClipboard();
::GdiFlush();
}
return hResult;
}
從微軟樣例應用程序,我復制了以下文件到我的項目目錄:
隱藏,復制CodeDIBUTIL.C
DIBUTIL.H
DIBAPI.H
然后我將DIBUTIL.C文件重命名為DIBUTIL.CPP。在此之后,我必須在該文件中進行以下更改
它會編譯。示例應用程序是按原樣編譯的,但因為我包含了stdafx。h,編譯器吐在某種類型上
不匹配,因此有以下變化:
隱藏,復制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);
最后,我使用了整個shebang如下:
隱藏,復制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();
最后
它的工作原理。我并不是真的對從我從文件中挑選出我需要的東西感興趣
microsoftsample app,我打算把它都留在那里。這是我留給讀者的一個練習。
本文附帶的zip文件包含修改后的CDIBSectionLite類和修改后的示例應用程序
文件,以及整個示例應用程序源代碼的本機形式。需要注意的是,如果按原樣編譯,則
示例應用程序項目創建(或提供)一個名為DIBAPI.DLL的DLL。這個DLL包含我鏈接的代碼
直接進入我的程序(我不希望它在DLL形式)。
由于我捕獲的位圖的大小,我沒有為CDIBSectionLite配備保存位圖的能力
剪貼板除了DIB之外的任何東西。但是,請記住,有可能保存多個項
剪貼板,因此您可以同時(使用示例應用程序代碼)在DIB中的剪貼板上放置位圖
格式,設備依賴格式,和元文件格式,如果那是絆你的觸發器。粘貼的任何應用
剪貼板將/應該拉出最適合它的要求的格式。
本文轉載于:http://www.diyabc.com/frontweb/news355.html
總結
以上是生活随笔為你收集整理的将DIB复制到剪贴板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毁电脑的cmd命令
- 下一篇: DIB-R 可微分渲染器使用