VC++ 图片复制到粘贴板

经常会用到在本地硬盘里面复制一个图片文件(静态、动态),然后粘贴到QQ聊天窗口,图片就直接显示出来了。到底是怎么实现的呢?首先复制文件,通过程序读取粘贴板内容分析,发现格式如下:

Version:0.9
StartHTML:00000097
EndHTML:00000224
StartFragment:00000111
EndFragment:00000188
<html><body>
<!--StartFragment -->
<img src="file:///C:\Users\HiWin81\Desktop\3.gif" />
<!--EndFragment-->
</body>
</html>

于是实现了这样一个接口:

void CopyToClipboard(char* lpszFile) 
{
// Version:0.9
// StartHTML:0000000105
// EndHTML:0000000229
// StartFragment:0000000141
// EndFragment:0000000193
// <html>
// <body>
// <!--StartFragment--><img src="file:///C:/Users/HiWin81/Desktop/2.gif" /><!--EndFragment-->
// </body>
// </html>

// Version:0.9
// StartHTML:00000097
// EndHTML:00000224
// StartFragment:00000111
// EndFragment:00000188
// <html><body>
// <!--StartFragment -->
// <img src="file:///C:\Users\HiWin81\Desktop\3.gif" />
// <!--EndFragment-->
// </body>
// </html>  
    
    char *buf = new char [400 + strlen(lpszFile)];
    if(!buf) return;

    static int cfid = 0;
    if(!cfid) cfid = RegisterClipboardFormat("HTML Format");

    strcpy(buf,
        "Version:0.9\r\n"
        "StartHTML:00000000\r\n"
        "EndHTML:00000000\r\n"
        "StartFragment:00000000\r\n"
        "EndFragment:00000000\r\n"
        "<html>\r\n<body>\r\n"
        "<!--StartFragment-->");
    strcat(buf, "<img src=\"file:///");//C:/Users/HiWin81/Desktop/2.gif"
    strcat(buf, lpszFile);
    strcat(buf, "\" />");
    strcat(buf,
        "<!--EndFragment-->\r\n"
        "</body>\r\n"
        "</html>");

    char *ptr = strstr(buf, "StartHTML");
    wsprintf(ptr+10, "%08u", strstr(buf, "<html>") - buf);
    *(ptr+10+8) = '\r';

    ptr = strstr(buf, "EndHTML");
    wsprintf(ptr+8, "%08u", strlen(buf));
    *(ptr+8+8) = '\r';

    ptr = strstr(buf, "StartFragment");
    wsprintf(ptr+14, "%08u", strstr(buf, "<!--StartFrag") - buf);
    *(ptr+14+8) = '\r';

    ptr = strstr(buf, "EndFragment");
    wsprintf(ptr+12, "%08u", strstr(buf, "<!--EndFrag") - buf);
    *(ptr+12+8) = '\r';

    if(OpenClipboard(0)) {
        EmptyClipboard();
        HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);
        char *ptr = (char *)GlobalLock(hText);
        strcpy(ptr, buf);
        GlobalUnlock(hText);

        ::SetClipboardData(cfid, hText);

        CloseClipboard();
        GlobalFree(hText);

    }

    delete [] buf;
} 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值