请教:CRichEditCtrl如何存为图片

winsome_zhong 2005-01-06 11:09:33
要实现一功能,读出CRichEditCtrl的文字并存为图片,每个文字的格式、颜色可能都不一样
我的实现方式是:确定后从第一个文字开始循环用SetSel和GetSelectionCharFormat、GetSelText取的文字及格式信息,然后写到图片上,但总觉得不是一个好办法,不知哪为大侠有更好的方法
...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2005-01-08
  • 打赏
  • 举报
回复
http://www.codeproject.com/bitmap/drawing2bitmap.asp
Atomictry 2005-01-08
  • 打赏
  • 举报
回复
同意zhaogaojian, 你的方法为什么不好.
fanqing 2005-01-08
  • 打赏
  • 举报
回复

图像与文字的合成

前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且可用鼠标拖动文字。现在我把代码贴出,希望能给需要的朋友以帮助。

一、关键函数

1. int SetDIBits(
HDC hdc, // 兼容DC的句柄
HBITMAP hbmp, // 兼容位图的句柄
UINT uStartScan, // 扫描起始行的编号
UINT cScanLines, // 扫描的行的数目
CONST VOID *lpvBits, // 位图缓冲区的指针,要求已经分配空间
CONST BITMAPINFO *lpbmi, // 位图信息
UINT fuColorUse // 颜色格式
);

这个函数把位图数据一个像素一个像素的贴到一个兼容位图上,hdc是选择了兼容位图的兼容DC。

2.int GetDIBits(
HDC hdc, // 兼容DC的句柄
HBITMAP hbmp, // 兼容位图的句柄
UINT uStartScan, // 扫描起始行的编号
UINT cScanLines, // 扫描的行的数目
LPVOID lpvBits, // 位图缓冲区的指针,要求已经分配空间
LPBITMAPINFO lpbi, // 位图信息
UINT uUsage // 颜色格式
);

这个函数的作用和SetDIBits刚好相反,它把兼容位图内已存在的数据一个像素一个像素的拷贝到数据缓冲区(lpvBits)中。这样程序的实现就比较明朗了,首先根据位图的尺寸,创建一个兼容位图,然后把图片绘制到兼容位图,接着把文字也写到兼容位图上,然后再从兼容位图得到合成的数据。

二、关键程序段
CreateMemObject(CDC *pDC, BITMAPINFO *lpbmi, int* pnLineChar)
{
if (NULL == m_pMemDC)
{
m_pMemDC = new CDC();
m_pMemDC->CreateCompatibleDC(pDC);
}

if (m_pMemBmp != NULL)
{
m_pMemDC->SelectObject(m_pOldBmp);
delete m_pMemBmp;
m_pMemBmp = NULL;
}



m_pMemBmp = new CBitmap(); //根据图片的大小创建一个兼容位图
m_pMemBmp->CreateCompatibleBitmap(pDC, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight);
m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);
m_pMemDC->FillSolidRect(0, 0, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight, RGB(255, 255, 255));

//把图像的数据绘制到兼容位图上

SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject,
0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);
}
SetBmpText(const CString &strText, BOOL bRepaint)
{
//本函数在位图上添加文本

m_strBmpText = strText;

SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject,
0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);


if (m_strBmpText.GetLength() > 0)
{
//制造透明和重影效果

m_pMemDC->SetBkMode(TRANSPARENT);
m_pMemDC->SetTextColor(RGB(0, 0, 0));
m_pMemDC->TextOut(10, 10, m_strBmpText);
m_pMemDC->SetTextColor(RGB(255, 255, 255));
m_pMemDC->TextOut(11, 11, m_strBmpText);
}

if (bRepaint)
{
Invalidate();
}

}
SetSaveBmpPath(LPCTSTR pszPath)
{
//从兼容位图中取出合成的数据

BYTE *pTemp = new BYTE[m_dwImageSize];
ZeroMemory(pTemp, m_dwImageSize);

int nCount = GetDIBits(m_pMemDC->GetSafeHdc(),
(HBITMAP)m_pMemBmp->m_hObject, 0, m_lpBMPHdr->biHeight,
(LPVOID)pTemp, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);
}


来源:http://www.vckbase.com/document/viewdoc/?id=1106
zhaogaojian 2005-01-08
  • 打赏
  • 举报
回复
搂主的方法挺好的麻
Kudeet 2005-01-07
  • 打赏
  • 举报
回复
留下email
fengqinggao 2005-01-07
  • 打赏
  • 举报
回复
那就不是“存”为图片了,呵呵,这样就好像没什么偷懒的方法了,等待高手。
winsome_zhong 2005-01-07
  • 打赏
  • 举报
回复
不是这样的,我其实是要把文字写到另一个图片上,抓屏不行
fengqinggao 2005-01-06
  • 打赏
  • 举报
回复
内部屏幕抓图吧,呵呵,参考网上的屏幕抓取程序,将窗口设为你的CRichEditCtrl的窗口,这样比较方便,直接就是图片了,需要处理的很少

但是,如果你的CRichEditCtrl有滚动条,那就麻烦些了,需要滚动滚动条抓图……

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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