none
ITextServices往Bitmap上渲染文字时的问题 RRS feed

  • 问题

  • 如图。在学习使用windowless richedit,往一块画布(Bitmap)上输出时就出现如图的渲染问题。求解,谢谢。

    下面是关键代码

    		Bitmap bmp(200, 200);
    		Graphics tmpG(&bmp);
    		HDC hdc = tmpG.GetHDC();
    		CRect tmpCRect(0, 0, 200, 200);
    		_textServices->TxDraw(DVASPECT_CONTENT, 0, NULL, NULL, hdc, NULL, NULL, NULL, &tmpCRect, NULL, 0, TXTVIEW_ACTIVE);
    		tmpG.ReleaseHDC(hdc);


    我是快乐的小鱼^_^

    2015年5月27日 8:44

答案

全部回复

  • 从你给出的代码看不出有什么问题啊。你怎么实现的ITextHost的呢? 用的是riched20.lib吗?请给一个详细的步骤,使在我们这边可以重现这个问题, 或者把你的sample工程发在一些public的地方,我可以去下载。

    建议你参考下这篇文章:Using Windowless RichEdit Controls

    http://www.codeproject.com/Articles/15906/Using-Windowless-RichEdit-Controls

    使用这篇文章的代码的时候注意在VC++ directories的Library directories里加上riched20.lib所在的文件夹路径,我这边是在这里 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib

    我简单的试了一下在图片上写字,效果图在下面,好像没有什么问题:

    希望这些能过对你有帮助。

    Shu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月28日 11:44
  • 谢谢回复,我不知道你是如何在图片上绘图的,如果可以的话请把你的sample工程发在一些public的地方,我可以去下载。

    你给出的参考文章,我也见过,刚才试了一下,发现它其实是在窗口dc上直接绘制文字,所以才没有出现我遇到的问题。

    下面给出我修改的代码,请替换参考文章的对应代码即可重现。

    void CRichDrawExampleDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CRect cBorder;
    		GetClientRect(&cBorder);
    
    		CPaintDC dc(this);
    		CDC memDC;
    		CBitmap memBmp;
    		memDC.CreateCompatibleDC(&dc);
    		memBmp.CreateCompatibleBitmap(&dc, cBorder.Width(), cBorder.Height());
    		CBitmap* oldBmp = memDC.SelectObject(&memBmp);
    
    		Graphics g(memDC);
    		// 白色背景
    		g.FillRectangle(&SolidBrush(Color(255, 255, 255)), 0, 0, cBorder.Width(), cBorder.Height());
    
    		// 绘制文字
    		CRect bmpCRect(0, 0, cBorder.Width(), cBorder.Height());
    		Bitmap bmp(cBorder.Width(), cBorder.Height());
    		Graphics tmpG(&bmp);
    		HDC tmpHDC = tmpG.GetHDC();
    		CDC* tmpCDC = CDC::FromHandle(tmpHDC);
    		m_RichText.DrawText(*tmpCDC, bmpCRect);
    		tmpG.ReleaseHDC(tmpHDC);
    
    		// 把包含文字的图片绘制在窗口上
    		g.DrawImage(&bmp, 0, 0, cBorder.Width(), cBorder.Height());
    
    		dc.BitBlt(0, 0, cBorder.Width(), cBorder.Height(), &memDC, 0, 0, SRCCOPY);
    
    		memDC.SelectObject(oldBmp);
    	}
    }


    我是快乐的小鱼^_^

    2015年5月29日 7:32
  • 不知道什么原因,在tempCDC确实有这个问题。但是你有什么必要一定画在tmpCDC 上吗?不能在同一个CDC里绘图吗。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月29日 10:17
  • 你理解错了,不是非要画在tmpCDC上,而是画在一个Bitmap上,而不是画在窗口的CDC上。那个tmpCDC实际是那个bmp。画到bmp上我就可以将这个bmp再绘制到任意位置了。

    我是快乐的小鱼^_^

    2015年5月30日 12:05
  • 看来是无解了,唉……

    我是快乐的小鱼^_^

    2015年6月3日 7:20