如何解决Windows如何实现剪贴板格式转换?
我正在Windows上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板行为。现在,除了格式转换部分之外,其他所有功能都可以正常工作,我可以针对CF_TEXT / UNICODETEXT / OEMTEXT进行操作,但是还有其他一些我不熟悉的格式,例如DIB。是否有任何示例代码说明Windows如何做到这一点?
解决方法
CF_DIB
和其他剪贴板格式之间的区别在于,它包含BITMAPINFO
结构的存储对象和位图位。
msdn document提供了一个非常详细的示例:
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,rc.right,rc.bottom,hdcMem,SRCCOPY);
CloseClipboard();
}
DeleteDC(hdcMem);
}
break;
...
如果需要将获取的位图对象另存为文件,则必须严格遵循BITMAPINFOHEADER structure来分配值。
MSDN代码示例:Storing an Image
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。