Windows如何实现剪贴板格式转换



我正在Windows上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板的行为。现在,除了格式转换部分,所有的工作都很好,我可以为CF_TEXT/UNICODETEXT/OEMTEXT做这件事,但还有其他我不熟悉的格式,比如DIB。有任何示例代码说明Windows是如何做到这一点的吗?

CF_DIB与其他剪贴板格式的区别在于它包含BITMAPINFO结构的内存对象和位图位。

msdn文档提供了一个非常详细的例子:

HINSTANCE hinst; 
UINT uFormat = (UINT)(-1); 
BOOL fAuto = TRUE; 

LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) 
HWND hwnd; 
UINT uMsg; 
WPARAM wParam; 
LPARAM lParam; 
{ 
static HWND hwndNextViewer; 

HDC hdc; 
HDC hdcMem; 
PAINTSTRUCT ps; 
LPPAINTSTRUCT lpps; 
RECT rc; 
LPRECT lprc; 
HGLOBAL hglb; 
LPSTR lpstr; 
HBITMAP hbm; 
HENHMETAFILE hemf; 
HWND hwndOwner; 

switch (uMsg) 
{ 
case WM_PAINT: 
hdc = BeginPaint(hwnd, &ps); 

// Branch depending on the clipboard format. 

switch (uFormat) 
{ 
case CF_OWNERDISPLAY: 
...

case CF_BITMAP: 
hdcMem = CreateCompatibleDC(hdc); 
if (hdcMem != NULL) 
{ 
if (OpenClipboard(hwnd)) 
{ 
hbm = (HBITMAP) 
GetClipboardData(uFormat); 
SelectObject(hdcMem, hbm); 
GetClientRect(hwnd, &rc); 

BitBlt(hdc, 0, 0, rc.right, rc.bottom, 
hdcMem, 0, 0, SRCCOPY); 
CloseClipboard(); 
} 
DeleteDC(hdcMem); 
} 
break; 
...

如果需要将获得的位图对象保存为文件,则必须严格按照BITMAPINFOHEADER结构进行赋值。

MSDN代码示例:存储图像

最新更新