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