麻烦给看一下:richedit控件中插入图片后,如何实现右键单击能够选中图片?

dvlinker
C/C++领域优质创作者
博客专家认证
2012-02-17 08:59:51
当前在开发im即时通讯的截图和图片发送功能,这过程中需要很多细节处理,其中一个是:
在richedit中插入图片后,需要实现右键菜单另存为的功能,即将图片保存到图片文件中。

现在的问题是:
在右键点击richedit中已插入的图片对象后,弹出右键菜单,菜单中有另存为的菜单项,但是图片对象并没有被选中,这样就需要先点击左键选中图片对象,然后再点击右键在显示的菜单中进行操作,对用户来说,是很不方便的。那么如何能实现右键点击就能选中图片呢。

另外,我观察了一下,QQ和RTX均实现了右键单击就能选中的功能。麻烦做过类似功能开发的朋友帮忙给看一下,谢谢!
...全文
439 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dvlinker 2013-12-23
  • 打赏
  • 举报
回复
引用 8 楼 u012532379 的回复:
我X,完全是同样的问题啊,楼主可否指点一下
相关响应不要放到WM_RBUTTONDOWN中处理,放到WM_RBUTTONUP中处理即可
鼻子ABC 2013-12-20
  • 打赏
  • 举报
回复
我X,完全是同样的问题啊,楼主可否指点一下
dvlinker 2013-02-22
  • 打赏
  • 举报
回复
呵呵,该问题已经解决
dvlinker 2012-02-23
  • 打赏
  • 举报
回复
哎...没办法了,看来还是得自己想办法来解决啊!
xingt006 2012-02-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenlycly 的回复:]

我这边先分享一下关于图片插入后如何另存为文件的代码,论坛里问的也比较多:
C/C++ code

// 下面找到选中图片对象对应的位图句柄,通过句柄将图片数据保存到文件中
// 注意:下面的代码只对位图有效,对于TrueLink自带的表情对象,则不起作
// 用(GetData接口会获取失败,故无法保存到文件中)
BOOL bS……
[/Quote]
谢谢分享,帮忙顶一个!
dvlinker 2012-02-20
  • 打赏
  • 举报
回复
麻烦做过相关开发的朋友给看一下,谢谢!
dvlinker 2012-02-17
  • 打赏
  • 举报
回复
相关问题的帖子有:http://topic.csdn.net/t/20041107/15/3529565.htmlhttp://topic.csdn.net/u/20090930/18/473a7b5a-0e24-43a6-bb1c-3eb1d63d05f7.htmlhttp://topic.csdn.net/u/20101024/16/23dec70b-a062-4e1d-95ac-d0e394eaa3f6.htmlhttp://topic.csdn.net/u/20101009/21/a2de118b-1d88-4c23-9ca9-c4974e45680e.html

上面给出的代码只能处理插入时使用位图句柄插入的场合,对于非位图的图片,可以使用GDI+将它们转化为位图,然后再插入到richedit中,具体的转化说明在下面的链接中有说明:
http://topic.csdn.net/u/20120206/17/097ab2db-7d27-4237-a853-577bebb5898d.html
dvlinker 2012-02-17
  • 打赏
  • 举报
回复
我这边先分享一下关于图片插入后如何另存为文件的代码,论坛里问的也比较多:

// 下面找到选中图片对象对应的位图句柄,通过句柄将图片数据保存到文件中
// 注意:下面的代码只对位图有效,对于TrueLink自带的表情对象,则不起作
// 用(GetData接口会获取失败,故无法保存到文件中)
BOOL bSavePicSuccess = FALSE;
int nCount = pRichOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象
for ( int i=0; i<nCount; i++ )
{
REOBJECT reobject;
memset( &reobject, 0 , sizeof(REOBJECT) );
reobject.cbStruct = sizeof(REOBJECT);

SCODE sc = pRichOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
if ( sc != S_OK )
{
continue;
}

if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
{
continue; // 不是当前选中的对象,继续查找
}

IDataObject* pDataObject = NULL;
sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
if ( sc != S_OK )
{
break; // 已经找到选中的图片对象,获取信息失败,直接退出
}

// 要对fm参数进行设置,指明要从IStorage中获取什么样的信息,否则GetData接口会获取stg信息失败
STGMEDIUM stg;
FORMATETC fm;
fm.cfFormat = CF_BITMAP; // Clipboard format = CF_BITMAP
fm.ptd = NULL; // Target Device = Screen
fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content
fm.lindex = -1; // Index = Not applicaple
fm.tymed = TYMED_GDI; // 对应CF_BITMAP

HRESULT hr = pDataObject->GetData( &fm, &stg );
if ( hr != S_OK || stg.hBitmap == NULL )
{
break; // 已经找到选中的图片对象,获取信息失败,直接退出
}

BOOL bRet = SaveBmpDataToFile( stg.hBitmap, csFilePath );
if ( bRet )
{
bSavePicSuccess = TRUE;
}
}

if ( !bSavePicSuccess )
{
AfxMessageBox( _T("图片保存失败!") );
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧