2024年4月1日发(作者:)

【OpenGL汉化研究】OpenGL中文本的显示

Nibiru经测试,用了OpenGL的wglUseFontBitmaps,glCallLists函数来显示文字。

也许是一个汉化的突破口?

---- 本文详细讨论了在OpenGL中显示文本的几种方法。

----也许大多数程序员使用OpenGL更多的是将精力集中于动态三维图形应用,因此,Ope

nGL中的文本显示往往被忽视,使人有不见积薪之感。本文介绍了几种文本显示的方法,

希望能对使用OpenGL的编程者有所帮助。

建立并修改程序

----建立一个MFC SDI Windows应用工程Text,除单文档属性外,使用其他的所有默认选

择。在菜单Project打开Settings对话框,在Link属性页的 object/library modules编辑框

中加入 三个GL库。我们利用这些库函数完成图形编辑工

作。

----为使VC++的AppWizard产生的SDI应用程序能使用 OpenGL绘图,还需要作一些

修改,说明如下。

----1.介绍PreCreateWindow函数

---- OpenGL窗口必须具有WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用

于重绘时剪裁子窗口所覆盖的区域)和WS_CLIPIBLINGS(创建子窗口使用的Windows

风格,用于重绘时剪裁其他子窗口所覆盖的区域)两种风格。此外,窗口类属性不能包括C

S_PARENTDC风格。具体程序实现如下:

BOOL CTextView::PreCreateWindow

(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

//An OpenGL window must be created with the following flag

// and must not include CS_PARENTIDC for the class style.

|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;

return CView::PreCreateWindow(cs);

}

----te函数中定义像素格式PIXELFORMAT和创建 RC

----要使窗口支持OpenGL绘图,必须对窗口进行初始化。其中包括定义像素格式PIXELF

ORMAT和创建RC,为OpenGL指定一个合适的像素格式,创建着色上下文并将它和窗口

的设备上下文关联起来。着色上下文保存着当前着色环境的信息。可在OnCreate中调用一

个自建视口成员函数SetupPixelFormat(),具体函数如下:

BOOL CTextView::SetupPixelFormat()

{

//Create a rendering context

CDC* m_pDC=GetDC();

if(m_pDC==NULL) //failure to get DC

{

MessageBox(“Could't get a valid DC.");

return FALSE;

}

//Default pixel format is a single-buffered,

//OpenGL support hardware-accelerated,RGBA mode format

PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR),//Structure size.

1,

// Structure version ty flags(特性标志):

PFD_DRAW_TO_WINDOW | // support window

PFD_SUPPORT_OPENGL | // support OpenGL

PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA, // RGBA type

24, // 32-bit color.

0, 0, 0, 0, 0, 0, // Not concerned with these:不涉及的属性

0, // No alpha :无alpha缓存

0, // Shift bit ignored:忽略转换位

0, 0, 0, 0, 0,// No accum buffer:没有累积缓存

32, // 32-bit depth buffer.

0, // No stencil:无模板缓存

0, // No auxliliary buffers:无辅助缓存

PFD_MAIN_PLANE, // Main layer type.:主层类型

0, // Reserved.:保留结构数

0, 0, 0 // Unsupported.:不支持结构数

};

int nPixelFormat=

ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);

if( nPixelFormat ==0)

{

MessageBox(“ChoosePixelFormat failed.");

return FALSE;

}

if(SetPixelFormat(m_pDC->GetSafeHdc(),