首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

[]用OPENGL画中文文字有关问题,但是需要裁切一半

2012-04-26 
[求助]用OPENGL画中文文字问题,但是需要裁切一半我想用OPENGL画出中文,现在已经画出来了,但是,我想指定一

[求助]用OPENGL画中文文字问题,但是需要裁切一半
我想用OPENGL画出中文,现在已经画出来了,但是,我想指定一个区域,文字只画在这个区域内,但是,如果文字很长,那么只显示出在这个区域内的文字。
一直就是这点做不到,开始我想用glViewport,但是没有效果,现在用裁切,也没有效果。
不知道哪位能帮我看看,谢谢了


C/C++ code
// OpenGLDrawChina.cpp : コンソール アプリケーションのエントリ ポイントを定義します。//#include "stdafx.h"//int _tmain(int argc, _TCHAR* argv[])//{//    return 0;//}// 显示文本#include <GL/glut.h>#include <string.h>#include <windows.h>#define MAX_CHAR 256// 指定要显示的字体void selectFont(int size, int charset, const char* face){    HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);    HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);    DeleteObject(hOldFont);}// 绘制英文字母和符号void drawString(const char* str){    static int isFirstCall = 1;    static GLuint lists;    if( isFirstCall )    {        // 如果是第一次调用,执行初始化        // 为每一个ASCII字符产生一个显示列表        isFirstCall = 0;        // 申请MAX_CHAR个连续的显示列表编号        lists = glGenLists(MAX_CHAR);        // 把每个字符的绘制命令都装到对应的显示列表中        wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);    }    // 调用每个字符对应的显示列表,绘制每个字符    for(; *str!='\0'; ++str)    {        glCallList(lists + *str);    }}// 绘制中文文本void drawChinaString(const char* str){    int len, i;    wchar_t* wstring;    HDC hDC = wglGetCurrentDC();        GLuint list = glGenLists(1);    // 计算字符的个数    // 如果是双字节字符的(比如中文字符),两个字节才算一个字符    // 否则一个字节算一个字符    len = 0;    for(i=0; str[i]!='\0'; ++i)    {        if( IsDBCSLeadByte(str[i]) )            ++i;        ++len;    }    // 将混合字符转化为宽字符    wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);    wstring[len] = L'\0';    /*glViewport(0,0,1,1);*/    // 逐个输出字符    for(i=0; i<len; ++i)    {        wglUseFontBitmapsW(hDC, wstring[i], 1, list);        glCallList(list); // 调用显示列表    }    // 回收所有临时资源    free(wstring);    glDeleteLists(list, 1);}//绘制对象void display(void){    //清空缓存    glClear(GL_COLOR_BUFFER_BIT);    GLdouble eqn1[4]={0.5,0.0,0.0,0.6};    glClipPlane(GL_CLIP_PLANE0,eqn1);    glEnable(GL_CLIP_PLANE0);    GLdouble eqn2[4]={-0.5,0.0,0.0,0.6};    glClipPlane(GL_CLIP_PLANE1,eqn2);    glEnable(GL_CLIP_PLANE1);    GLdouble eqn3[4]={0.0,0.5,0.0,0.6};    glClipPlane(GL_CLIP_PLANE2,eqn3);    glEnable(GL_CLIP_PLANE2);    GLdouble eqn4[4]={0.0,-0.5,0.0,0.6};    glClipPlane(GL_CLIP_PLANE3,eqn4);    glEnable(GL_CLIP_PLANE3);        glColor3f(0.0f,0.0f,1.0f);    glBegin(GL_QUADS);    glVertex3f(-2.0f,-2.0f,0.0f);    glVertex3f(-2.0f,2.0f,0.0f);    glVertex3f(2.0f,2.0f,0.0f);    glVertex3f(2.0f,-2.0f,0.0f);    glEnd();    // 输出中文    glColor3f(1.0f, 0.0f, 0.0f); // 设置文字颜色    selectFont(48, SHIFTJIS_CHARSET, "HGP行書体");    glRasterPos2f(0.0f, 0.0f);    drawChinaString("四川成都XXXXX公司");        // 执行绘制    glutSwapBuffers();}// 初始化变量void init(){    //设置背景色为绿色    glClearColor (1.0, 1.0, 1.0, 1.0);    //设置背景色为蓝色    glColor3f(0.0, 0.0, 1.0);    // 指定坐标系为投影矩阵方式    glMatrixMode (GL_PROJECTION);    // 将当前矩阵初始化为单位矩阵    glLoadIdentity ();    // 设置投影区域(左右上下近远)    glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); }void ViewPort(int w,int h){    //glViewport(0,0,200,200);}void main(int argc, char** argv){    // 初始化glut库    glutInit(&argc,argv);    // 设置双缓冲和RGB色彩空间    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);     // 窗口大小    glutInitWindowSize(500,500);    // 设置窗口左上角在屏幕中的位置    glutInitWindowPosition(0,0);    // 建立窗口    glutCreateWindow("simple");    //设置显示范围    glutReshapeFunc(ViewPort);    // 执行函数    glutDisplayFunc(display);    // 设置opengl状态    init();    // 循环执行    glutMainLoop();}


------解决方案--------------------


把文字单独放使用一个正交投影来显示
[解决办法]
这个我得学习一下,OpenGL是个好东西啊!!

热点排行