在RichEdit中插入Bitmap/GIF动画以及获取这些元素的信息的方法

MFC RichEdit控件直接插入PNG/JPG/BMP图片的完整工程包(VS2019) 这个资源包提供一个可直接编译运行的MFC项目,实现在RichEdit控件中无缝插入和显示PNG、JPG、BMP格式图片。核心封装在MyRichEdit类里,支持两种加载方式:一是通过资源ID加载嵌入的位图(如bitmap1.bmp、bitmap2.bmp),二是从内存缓冲区读取任意路径的PNG/JPG/BMP文件(示例含res/1.png、1.jpg、1.bmp)。调用接口简洁,RichEditTestDlg.cpp中两个按钮分别对应资源位图插入(OnBnClickedButton1)和二进制流加载(OnB 阅读详情

    利用RichEdit制作表情控件是,首先需要向RichEdit中插入图片(Bitmap)或GIF动画,然后需要从RichEdit中获取Bitmap/GIF的信息,以便向远端传送。

    本人对RichEdit了解很有限。下面是本人根据网上找到的资料,以通过看MSDN整理出来的实现在RichEdit中插入Bitmap与/GIF的方法,在这里共享给大家。RichEdit方面的高手不要取笑。

    1.在RichEdit中插入Bitmap/GIF的方法

        下面的代码是从网上找来的,我稍微作了一点修改(代码中红色部分是我改过的)。

ImageDataObect.h

====================================================

#ifndef IMAGE_DATA_OBJECT__H
#define IMAGE_DATA_OBJECT__H

#include <Richedit.h>
#include <objidl.h.>
#include <Richole.h>

class CImageDataObject : IDataObject
{
public:
    // This static fumction accepts those parameters:
    // IRichEditOle* : a pointer to IRochEditOle interface for the RichEdit Control
    // HBITMAP : the bitmap handle.
    //DWORD dwUser - 位图相关的信
    // After calling the function, it inserts the image in the current
    //    position of the RichEdit
    //
    static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser);
    static void InsertGif(IRichEditOle *pRichEditOle,const char *gif_file,DWORD dwUser);

private:
    ULONG    m_ulRefCnt;
    BOOL    m_bRelease;

    // The data being bassed to the richedit
    //
    STGMEDIUM m_stgmed;
    FORMATETC m_fromat;

public:
    CImageDataObject() : m_ulRefCnt(0)
    {
        m_bRelease = FALSE;
    }

    ~CImageDataObject()
    {
        if (m_bRelease)
            ::ReleaseStgMedium(&m_stgmed);
    }

    // Methods of the IUnknown interface
    //
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
    {
        if (iid == IID_IUnknown || iid == IID_IDataObject)
        {
            *ppvObject = this;
            AddRef();
            return S_OK;
        }
        else
            return E_NOINTERFACE;
    }
    STDMETHOD_(ULONG, AddRef)(void)
    {
        m_ulRefCnt++;
        return m_ulRefCnt;
    }
    STDMETHOD_(ULONG, Release)(void)
    {
        if (--m_ulRefCnt == 0)
        {
            delete this;
        }

        return m_ulRefCnt;
    }

    // Methods of the IDataObject Interface
    //
    STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) {
        HANDLE hDst;
        hDst = ::OleDuplicateData(m_stgmed.hBitmap, CF_BITMAP, NULL);
        if (hDst == NULL)
        {
            return E_HANDLE;
        }

        pmedium->tymed = TYMED_GDI;
        pmedium->hBitmap = (HBITMAP)hDst;
        pmedium->pUnkForRelease = NULL;

        return S_OK;
    }
   
    STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium )
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(QueryGetData)(FORMATETC*  pformatetc )
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn ,FORMATETC* pformatetcOut )    
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease )
    {
        m_fromat = *pformatetc;
        m_stgmed = *pmedium;

        return S_OK;
    }
   
    STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc )
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink,
        DWORD *pdwConnection)
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(DUnadvise)(DWORD dwConnection)
    {
        return E_NOTIMPL;
    }
   
    STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise)
    {
        return E_NOTIMPL;
    }

    // Some Other helper functions
    //
    void SetBitmap(HBITMAP hBitmap);
    IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage);
};

#endif // IMAGE_DATA_OBJECT__H

===========================

ImageDataObject.cpp

#include "stdafx.h"  //我很不喜欢这个头文件,这个程序只能在windows下运行,就留着吧
#include "ImageDataObject.h"

#import "ImageOle.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
static CLSID const gif_clsid = { 0x6ADA938, 0xFB0, 0x4BC0, { 0xB1, 0x9B, 0xA, 0x38, 0xAB, 0x17, 0xF1, 0x82 } };

void CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser)
{
    SCODE sc;

    // Get the image data object
    //
    CImageDataObject *pods = new CImageDataObject;
    LPDATAOBJECT lpDataObject;

    pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject);
    pods->SetBitmap(hBitmap);

    // Get the RichEdit container site
    //
    IOleClientSite *pOleClientSite;   
   
    pRichEditOle->GetClientSite(&pOleClientSite);
    // Initialize a Storage Object
    //
    IStorage *pStorage;   

    LPLOCKBYTES lpLockBytes = NULL;
    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
   
    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
        STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);


    // The final ole object which will be inserted in the richedit control
    //
    IOleObject *pOleObject;
    pOleObject = pods->GetOleObject(pOleClientSite, pStorage);

    // all items are "contained" -- this makes our reference to this object
    //  weak -- which is needed for links to embedding silent update.
    OleSetContainedObject(pOleObject, TRUE);

    // Now Add the object to the RichEdit
    //
    REOBJECT reobject;
    ZeroMemory(&reobject, sizeof(REOBJECT));
    reobject.cbStruct = sizeof(REOBJECT);
   
    CLSID clsid;
    sc = pOleObject->GetUserClassID(&clsid);


    reobject.clsid = clsid;
    reobject.cp = REO_CP_SELECTION;
    reobject.dvaspect = DVASPECT_CONTENT;
    reobject.poleobj = pOleObject;
    reobject.polesite = pOleClientSite;
    reobject.pstg = pStorage;
 reobject.dwUser = dwUser;

    // Insert the bitmap at the current location in the richedit control
    //
    pRichEditOle->InsertObject(&reobject);

    // Release all unnecessary interfaces
    //
    pOleObject->Release();
    pOleClientSite->Release();
    pStorage->Release();
    lpDataObject->Release();
}

void CImageDataObject::InsertGif(IRichEditOle *lpRichEditOle,const char *gif_file,DWORD dwUser)
{
 LPOLEOBJECT  lpObject=NULL;
 LPSTORAGE       lpStorage=NULL;
 LPOLECLIENTSITE lpClientSite=NULL;
 LPLOCKBYTES  lpLockBytes = NULL;

 HRESULT hr=S_OK;
 CLSID clsid=CLSID_NULL;
 do{
  hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
  if (hr != S_OK || lpLockBytes==NULL) 
   break;

  hr= ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
  if (hr!= S_OK||lpStorage==NULL) 
   break;

  hr=lpRichEditOle->GetClientSite(&lpClientSite);
  if (hr!= S_OK||lpClientSite==NULL) 
   break;

  try
  {
   HRESULT hr;
   IGifAnimator *pGif  = NULL;
   hr = CoCreateInstance(gif_clsid,NULL,CLSCTX_INPROC_SERVER , IID_IGifAnimator,(void **)&pGif);
   if(FAILED(hr) || pGif == NULL)
    break ;

   _bstr_t bstrPath(gif_file);
   pGif->LoadFromFile(bstrPath);
   if(FAILED(hr))
   {
    pGif->Release();
    break ;
   }

   hr = pGif->QueryInterface(IID_IOleObject, (void**)&lpObject);
   if( FAILED(hr)||lpObject==NULL) 
   {
    pGif->Release();
    break ;
   }
   
   hr=OleSetContainedObject(lpObject, TRUE);
   if( FAILED(hr) )
   {
    pGif->Release();
    break ;
   }
   hr=lpObject->GetUserClassID(&clsid);
   if( FAILED(hr) )
   {
    pGif->Release();
    break ;
   }

   REOBJECT reobject;
   ZeroMemory(&reobject, sizeof(REOBJECT));
   reobject.cbStruct = sizeof(REOBJECT); 
   reobject.clsid = clsid;
   reobject.cp = REO_CP_SELECTION;
   reobject.dvaspect = DVASPECT_CONTENT;
   reobject.dwFlags = REO_BELOWBASELINE;
   reobject.dwUser = dwUser;
   reobject.poleobj = lpObject;
   reobject.polesite = lpClientSite;
   reobject.pstg = lpStorage;
   SIZEL sizel={0,0};
   reobject.sizel = sizel;
   hr=lpRichEditOle->InsertObject(&reobject);
  }
  catch( _com_error &e )
  {
  }

 }while(FALSE);
 if(lpLockBytes) lpObject->Release(); 
 if(lpLockBytes) lpLockBytes->Release();
 if(lpClientSite) lpClientSite->Release();
 if(lpRichEditOle) lpRichEditOle->Release();
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

void CImageDataObject::SetBitmap(HBITMAP hBitmap)
{


    STGMEDIUM stgm;
    stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle       
    stgm.hBitmap = hBitmap;
    stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium

    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;                    // Storage medium = HBITMAP handle

    this->SetData(&fm, &stgm, TRUE);       
}

IOleObject *CImageDataObject::GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)
{


    SCODE sc;
    IOleObject *pOleObject;
    sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
            &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject);

    return pOleObject;
}

/////////////

  OK,下面是想RichEdit中插入bitmap的范例

  CImageDataObject::InsertBitmap(m_sendRichEdit.GetOleInterface(),bmp.m_hBitmap,dwBitmapInfo); 

  上面是m_sendRichEdit是一个RichEdit控件(这段代码是从一个WTL项目中提取出来的)。

  注意:上面的dwBitmapInfo就是应用程序设置的与插入RichEdit中的Bitmap相关的信息。

  2. 从EditRich中提取位图信息

     下面是范例代码,其中原来就不多说了,看代码吧。

    //获取RichEdit中有几个bitmap,这里假设RichEdit中有位图文件
    int c = m_sendRichEdit.GetOleInterface()->GetObjectCount();     

   for(int i = 0 ; i < c ; i++) //遍历位图
   {
       REOBJECT object;  //位图信息存在这里
     memset(&object,0,sizeof(REOBJECT));
     object.cbStruct = sizeof(REOBJECT);
     m_sendRichEdit.GetOleInterface()->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES);

     int pos = object.cp ; //位图的位置信息
     DWORD dwUSer  =object.dwUSer ; //位图的信息,之前应用程序设置的,应有程序当然知道什么意思了
  }

/////////////////////////////////////////////////////

OVER

////////////////////////////////////////////////////

MFC RichEdit使用简介 MFC RichEdit 的使用简介 包括了大部分的基本用法 立即下载

相关推荐

RichEdit显示图片(gif,bmp,jpg等所有图片)

RichEdit显示文字,图片,动态图(gif)。 在网上找的RichEdit显示gif的资料很多不能用,有的就是用的是QQ的dll,没有一个完整可用的代码。这个是我发了不少心思在国外网站上找到的源码,能很好的显示gif。大家不要嫌贵哦,肯定值的!

再谈向RichEdit中插入GIF动画的实现

我的前一篇文章“使用定时器显示GIF动画的ATL控件实现”中讲述了如何创建ATL项目,并实现显示GIF动画的控件,虽然能够显示,但有一些问题: 1. tphlj同学说一行插入多个GIF的时候,CPU会很高。     这个问题我倒没有注意,因为我发现了更严重的问题,所以用那种方法实现的控件没有使用了,已经被我删掉,不能测试。 2. 删除插入的GIF后发现光标还在不停的闪烁     显然这是由

haoekin的专栏 5295

类似聊天窗口,可以发送表情、图片,RichEdit显示图片

类似聊天窗口,可以发送表情、图片,RichEdit显示图片,这只是一个例子,不过可以借鉴一下 类似聊天窗口,可以发送表情、图片,RichEdit显示图片,这只是一个例子,不过可以借鉴一下

Richedit中添加图片

<br />在添加图片之前,先了解两个结构:<br />1.STGMEDIUM<br />   这个结构描述了一个用于数据传输介质的对象。<br />   typedef struct tagSTGMEDIUM {<br />    DWORDtymed;//存储介质。封送处理和unmarshaling例程使用此值来确定哪个成员被使用。此值必须是TYMED枚举的因素之一。<br /><br />    union {<br />        HBITMAPhBitmap;                 

kay_1010的专栏 7461

duilib richedit插入图片

duilib richedit用法 插入图片 以及换色 字体问题 duilib richedit用法 插入图片 以及换色 字体问题

卫星动力学仿真模型开发之AI初试

以下是通过AI生成的一个简单的C语言仿真模型,用于模拟卫星的姿态、轨道动力学和运动学。该模型基于基本的物理公式,假设卫星在近地轨道上运行,并忽略了一些复杂的扰动因素(如大气阻力、太阳辐射压等)。姿态动力学描述了卫星绕其质心的旋转运动。轨道动力学描述了卫星在引力作用下的运动。姿态运动学描述了卫星姿态随时间的变化。

xspace的博客 569

在RichEdit中插入Bitmap

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 561

从无人机到机械臂:深入聊聊LQR和LQG在实际项目里的那些‘坑’与最佳实践

本文深入探讨了LQR和LQG在无人机和机械臂等实际项目中的应用挑战与最佳实践。从系统建模的妥协艺术到调参的系统化方法,再到离散化的细节处理,文章分享了工程实践中的宝贵经验。特别强调了如何应对传感器噪声、未建模动态等现实问题,并提供了实用的调试工具和诊断流程,帮助工程师避免常见陷阱,提升控制系统的稳定性和性能。

weixin_28683391的博客 386

richEdit中插入图片

添加一个richedit控件,并在APP::  InitInstance()添加如下的语句:AfxInitRichEdit(); //否则窗口一闪而过       在头文件.h和cpp中添加头文件    afxole.h     richole.h //定义成员变量和函数     IOleObject* m_pPicObj;

丰空岛主(Vega Prime,Android,LabWindows,ThreeJS,Python,OpenCV) 3618

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 488

Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作指南

本文详细介绍了Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作流程与技巧。内容涵盖从开机预热、校准(SOLT/ECal)、参数设置(频率、点数、功率、IFBW)到连接测量、数据保存分析的全过程,并分享了夹具去嵌入、时域分析等进阶功能与常见问题避坑指南,旨在帮助工程师获得精准可靠的散射参数测试结果。

kotlin6android的博客 401

【181101】VC++ RichEdit文本控件中添加表情图象类及示例源代码

VC++在RichEdit中使用诸如表情一类的图象类,VC6和VC7两个版本的都有,示例程序同样支持两种环境,编译无错,请将编译后的EXE文件拷贝至项目根目录下运行,以便于程序能调用res目录中的资源文件,本例运行效果图如上所示。 源码下载地址:点击下载 备用下载地址:点击下载 ...

资源小站 903

Windows 10下Carla 0.9.15安装避坑指南:从下载到运行的全流程解析

本文详细解析了在Windows 10系统上安装和运行Carla 0.9.15自动驾驶仿真平台的全流程。内容涵盖从系统环境准备、资源下载、Python依赖安装,到首次启动验证及常见错误(如DLL缺失、显卡驱动问题)的深度解决方案,旨在帮助用户快速搭建稳定的开发环境,并运行第一个自动驾驶Python脚本。

alice7model的博客 546

向RichEditCtrl中添加图片和URL功能

最近在写一个工具,需要用到RichEditCtrl控件,这个控件需要支持图片和URL超链接功能。查看了Codeguru和codeproject网站中文章的描述,其中实现的主要部分代码如下。 if (FAILED(CoInitialize(NULL))) {  return ; } HBITMAP hBitmap =(HBITMAP)LoadImage   (NULL, str, IMA

Tommy(凌飞)的专栏 1435

如何使用VNC对openEuler系统进行远程图形化操作

本文详细介绍了在openEuler系统中配置VNC远程图形化操作的方法。主要内容包括:1)服务端配置:安装GNOME图形界面和TigerVNC服务,创建VNC用户并设置密码,配置VNC服务启动脚本;2)客户端连接:使用VNC Viewer等工具连接服务器;3)常见问题解决方法。通过5901端口建立连接后,用户可远程操作openEuler图形界面,适用于需要图形化管理的场景。

2501_93651177的博客 314

YOLOv13涨点改进 | 全网独家创新、HyperACE改进、注意力改进篇 | CVPR 2025| 引入LRSA局部区域自注意力模块,能提升其在细节捕捉、小目标检测和长距离依赖建模方面的能力

本文提出将LRSA(局部区域自注意力)模块集成到YOLOv13中,通过局部特征交互增强细节捕捉能力、小物体检测精度和长距离依赖建模。LRSA模块采用重叠图像块处理策略,在保持计算效率的同时提升复杂背景下的检测性能。文章详细介绍了模块结构、原理优势,并提供了三种改进方案:1)在主干网络添加LRSA层;2)将关键模块替换为DSC3k2_LRSA;3)采用HyperACE_LRSA结构。配套提供了完整的PyTorch实现代码和YAML配置文件,展示了该模块如何通过局部注意力机制平衡检测精度与推理速度。

Ai缝合怪、助力小伙伴高效发论文 344

1018RICHEDIT的使用方法

当我第一次将RichEdit控件放在资源窗体上的时候,发现程序根本就不能运行。后来才找到原因,原来Rich Edit 控件是Ole类型的控件。在加载Rich Edit 控件的时候,必须进行初始化。代码如下:BOOLCTestApp::InitInstance(){ ..... AfxInitRichEdit(); } 同时,为控件添加文本以及格式设置如下 v...

我也想当个程序员 260

Android开发工程师(IOT)面试指南与参考答案

【摘要】绿联科技招聘Android开发工程师(IOT方向),要求5年以上Android开发经验,精通Kotlin/Java,熟悉IOT设备交互及跨平台开发。岗位职责包括客户端开发维护、技术调研及性能优化等。核心考察点包括:Kotlin协程在IOT低功耗场景的应用、多协议设备连接层设计、音视频性能优化及离线架构实现。重点技术涉及蓝牙Mesh群控、BLE功耗优化及ReactNative混合开发。需具备GooglePlay合规经验,熟悉Android13+权限管理,并能提供量化性能优化案例。

郑伟强dev的专栏 722

解决网易开源duilib自带RichEdit在部分系统下键盘无法输入的问题

现象 最近基于网易开源维护的duilib做了一款客户端,上线后,用户反馈了一系列问题,其中最诡异的问题就是RichEdit有时候无法输入。 调查 使用官方自带的例子进行测试后,发现同样存在问题: NIM_Duilib_Framework 这2个RichEdit的XML如下: <!-- 单行文本 --> <RichEdit class="simple input" height="30" margin="0,3" padding="6,6,6" promptmode="true" p

xmcy001122的专栏 1332

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

DUILIB 实现微信气泡聊天效果

最近由于项目原因,需要做一个产品内嵌的IM聊天系统。而且要象微信类似的效果;界面也要比较炫; 开始考虑用MFC,但MFC的控件自绘很麻烦,后来又考虑QT,倒是使用控件使用方便,但QT库太大,所以也放弃了。 最终选择了DUILIB ,原因是各种控制自绘方便,发布版本体积小。 说到聊天,大家可能首先想到发图片,文字等等,所以也想想用richedit控件,看了看DUILIB也实现了RICHEDIT...

weixin_30700099的博客 748

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用IDropTarget接口同时支持文本和文件拖放(二)

 使用IDropTarget接口同时支持文本和文件拖放(二)2008-01-12 07:47在这里我们最感兴趣的是cfFormat和tymed两个数据。cfFormat是标准的“粘帖板”数据类型比如CF_TEXT之类。tymed表示数据所依附的媒介,比如内存,磁盘文件,存储对象等等。其他的成员可以参见MSDN。 一个典型的FORMATETC结构变量定义如下:

dadalan的专栏 2660

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RichEdit中支持超链接的实现

  现在很多IM软件的聊天对话框在接收到网站URL的时候,都能够显示成大家熟悉的蓝色,鼠标移到链接上,还会出现手样的鼠标指针,用户点击后就可以直接打开相应的URL,这对IM软件确实很有用吧,这么方便,实现起来难吗?其实一点也不难,只要设置让你的RICHEDIT支持链接,自动检测URL就行了,再实现一个对连接点击的响应函数就行了。总的来说就几行代码,看看吧。  我用一个对话框工程来说明一下吧。  首

水妖的专栏 7047

MFC Richedit添加图片后界面空白

MFC Richedit添加图片后界面空白,多次排查,为背景使用static控件影响。控件在重叠时会出现很多异常显现。换种方式操作。

tyuanshan的博客 209

DuiLib实现仿微信聊天界面(二)——解决RichEdit自适应高度问题

前言 在上一篇文章中: DuiLib实现仿微信聊天界面 我们实现了仿微信的布局和简单的聊天列表: 但是,因为网易开源 NimDuiLib 的版本落后于其提供的Demo,同样的写法在开源DuiLib中就会出现问题,比如RichEdit在同时设置width、height为auto时,会断错误。所以需要我们自己进行修复。 至于为何要设置RichEdit的width和height属性为auto?因为文本的宽度和高度都是动态的,根据文本的内容需要自行计算。 网易DuiLib中控件如何计算宽高? 我们从网易Dui

xmcy001122的专栏 2210
上一篇: 一个高效的C++性能计数器模板
下一篇: 关于Servlet class org.apache.jasper.servlet.JspServlet for servlet debugjsp could not be loaded
larrin
博客等级 码龄23年 2粉丝 45原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值