MFC给CRichEditCtrl添加图片的方法
最近上网查了查,发现这类博客大都是使用代码添加OLE对象,但在一些人(包括我)的电脑上有一个问题,那就是OleCreateStaticFromData函数返回E_OUTOFMEMORY,每次都是这样。为此,我也发了一个论坛,如果有解决方案,我会通知大家。后来,我想到了一个“偷懒”的办法,那就是使用系统自带的函数。首先,把用户选择的图像文件使用CImage类加载到内存里。然后,再把图片复制到剪贴板里(嘿嘿,是不是明白了什么)。最后,直接调用CRichEditCtrl的Paste函数粘贴就行了。
但是,这样也有一个bug,那就是这样插入图片会导致剪贴板内容更改,以前用户复制的内容被清除。有一个解决方案,那就是在把图片复制到剪贴板之前先把剪贴板以前的内容复制到内存里,粘贴完后再重新设置。但由于用户之前复制的内容不一定是什么类型的,所以该功能暂时没有实现。如果大家有什么好的思路,欢迎在评论区回复。
代码如下:
CFileDialog fd(TRUE);
fd.m_ofn.lpstrFilter =
L"所有格式\0*.bmp;*.jpg;*.png\0位图(*.bmp)\0*.bmp\0JPG文件\0*.jpg\0PNG文件\0*.png\0\0";
if (fd.DoModal() == IDOK)
{
if (OpenClipboard())
{
CImage image;
image.Load(fd.GetPathName());
EmptyClipboard();
SetClipboardData(CF_BITMAP, image);
CloseClipboard();
RichEdit.Paste();
}
else
MessageBoxW(L"插入失败!", L"Word", MB_OK | MB_ICONERROR);
}