日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将DIB复制到剪贴板

發布時間:2024/3/26 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将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();

// borrowed these variables from the sample appHDIB hDib = NULL;HBITMAP hBitmap = NULL;HPALETTE ghPal = NULL;if (m_hBitmap){// call the function that converts the bitmap to a DIBhDib = BitmapToDIB(m_hBitmap, ghPal);if (hDib){// ahhh, the sweet smell of successhResult = ::SetClipboardData(CF_DIB, hDib);if (hResult == NULL){_ShowLastError();}}else{MessageBeep(0);}}::CloseClipboard();

}
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复制到剪贴板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。