我要发帖 回复

正式会员

4

主题

24

积分

0

专家分

:

私信
发表时间 : 2009-12-26 21:10:04 | 浏览 : 960    评论 : 4
如题,请教一下基于MFC 的汉字显示问题。在基于Win32 Console的程序中,笔者已成功调试好汉字的显示程序。但是移植到MFC程序中,发现总是不太稳定,运行一段时间,1到2分钟,便有错误爆出,所以特地请教MFC框架下汉字的显示问题。
笔者订制了下列的一个汉字类:
// GLFont.cpp: implementation of the CGLFont class.
//
//////////////////////////////////////////////////////////////////////
//
#include "stdafx.h"
#include "GLFont.h"

#include "gl/gl.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGLFont::CGLFont()
{

}

CGLFont::~CGLFont()
{

}

/********************************************************************
*        
*        Function: ShowStringBitmap
*        Parameters:
*        Return value:
*        Description:位图方式显示字符串(支持中文)
*        Created:  
*        modified:   
*
*********************************************************************/
int CGLFont::ShowStringBitmap(LPCTSTR lpszText,HFONT hFont /* =NULL */,
                                                          BOOL bUseDisplayList /*=FALSE */)
{
        CBitmap bitmap;
        BITMAP bm;
        SIZE size;
        UCHAR* pBmpBits;
        HFONT hOldFont;
        HDC hdc = wglGetCurrentDC();

        if(!hFont) // use default system font
        {
                hFont = (HFONT)::GetStockObject(SYSTEM_FONT);
        }

        hOldFont = (HFONT)SelectObject(hdc, hFont);
        ::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);

        bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);

        HDC hMemDC = ::CreateCompatibleDC(hdc);
        if(hMemDC)
        {
                HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC, bitmap);
                HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);
               
                SetBkColor(hMemDC, RGB(0, 0, 0));
                SetTextColor(hMemDC, RGB(255, 255, 255));
                SetBkMode(hMemDC, OPAQUE);
                TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));

                // copy GDI bitmap to DIB
                bitmap.GetBitmap(&bm);
                size.cx = (bm.bmWidth + 31) & (~31);
                size.cy = bm.bmHeight;
                int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) / 8);
                pBmpBits = new UCHAR[bufsize];
                memset(pBmpBits, 0, sizeof(UCHAR)*bufsize);

                struct {
                        BITMAPINFOHEADER bih;
                        RGBQUAD col[2];
                }bic;
                BITMAPINFO *binf = (BITMAPINFO *)&bic;

                binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
                binf->bmiHeader.biWidth = bm.bmWidth;
                binf->bmiHeader.biHeight = bm.bmHeight;
                binf->bmiHeader.biPlanes = 1;
                binf->bmiHeader.biBitCount = 1;
                binf->bmiHeader.biCompression = BI_RGB;
                binf->bmiHeader.biSizeImage = bufsize;
                binf->bmiHeader.biXPelsPerMeter = 1;
                binf->bmiHeader.biYPelsPerMeter = 1;
                binf->bmiHeader.biClrUsed = 0;
                binf->bmiHeader.biClrImportant = 0;

                ::GetDIBits(hdc, bitmap, 0, bm.bmHeight, pBmpBits, binf, DIB_RGB_COLORS);               
                SelectObject(hMemDC, hPrevBmp);
        }
        :eleteDC(hMemDC);

        //设置当前字体  
        SelectObject(hdc, hOldFont);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

        GLuint displist = 0;
        if(bUseDisplayList)
        {
                displist = glGenLists(1);
                glNewList(displist, GL_COMPILE);
                glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,pBmpBits);
                glEndList();
        }
        else;
        glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,        pBmpBits);

        delete pBmpBits;        
        return displist;
}


但是不知道如何在MFC中使用这个CGLFOnt类生成的对象,调试好长时间,始终没有解决之道。
声闻此处大虾甚多,人气在仿真论坛里面算是比较浓厚的。特此请教,望大家积极发言。

最近VR访客

humaxwell 评论于2009-12-27 09:43:04
先顶,很早学习就发现书上讲的用回调函数实现汉字显示在C里面可以实现,在MFC中不行,希望有人能够解决
www_www 评论于2009-12-27 12:00:55
“运行一段时间,1到2分钟,便有错误爆出”应该是资源释放问题,把完整代码贴出来,才能看出来。尤其是产生字体,使用完之后必须释放,等等。
快乐统一体 评论于2009-12-27 19:04:36
在Win32 Console的程序中显示汉字的代码可以分享下吗?正在寻找~谢谢
ggw0122 评论于2011-4-7 22:31:36
学习了,谢谢

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-5-13 10:55 AM

返回顶部