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(),
发布评论