实例介绍
【实例简介】请童鞋们边看代码,边看本文档
在CSGLControl组件的代码视图下,直接就有一种方法 BuildFont(string text,Font font)
运行起来在窗体的左下角蓝背景红字的就是效果。
优点,这种方法,简单,易懂。
缺点,内存流,glDrawPixels,gluOrtho2D的坐标转换,无法输出与GL很好的融为一体。
果断放弃了。
下面是正主了
项目目录下面有一个Win32的类,是从老外的SharpGL里直接拷过来的(可以直接用,为什么不用^_^),主要封装了一些GDI操作和类型。
只是没有汉字的GDI操作,我已经加上了,童鞋们可以直接使用
GLFont是主要的类,大家好好看这个类,OpenGLPublicFunction类只有一个方法,把C#中的Color转成GL接受的float数组
在输出汉字的方法中请
----注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意----
GLFont类中,方法Print调用的是wglUseFontBitmaps
而PrintCN调用的是wglUseFontBitmapsW
wglUseFontBitmapsW是wglUseFontBitmaps的宽字符版,汉字一个字符占两个字节,而且不影响输出英文
就这两个方法调错了,弄了我一下午找错误(先抽自己一下)
最后,但愿我写的这个东西对你有帮助。。。。
【实例截图】
在CSGLControl组件的代码视图下,直接就有一种方法 BuildFont(string text,Font font)
运行起来在窗体的左下角蓝背景红字的就是效果。
优点,这种方法,简单,易懂。
缺点,内存流,glDrawPixels,gluOrtho2D的坐标转换,无法输出与GL很好的融为一体。
果断放弃了。
下面是正主了
项目目录下面有一个Win32的类,是从老外的SharpGL里直接拷过来的(可以直接用,为什么不用^_^),主要封装了一些GDI操作和类型。
只是没有汉字的GDI操作,我已经加上了,童鞋们可以直接使用
GLFont是主要的类,大家好好看这个类,OpenGLPublicFunction类只有一个方法,把C#中的Color转成GL接受的float数组
在输出汉字的方法中请
----注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意--------注意----
GLFont类中,方法Print调用的是wglUseFontBitmaps
而PrintCN调用的是wglUseFontBitmapsW
wglUseFontBitmapsW是wglUseFontBitmaps的宽字符版,汉字一个字符占两个字节,而且不影响输出英文
就这两个方法调错了,弄了我一下午找错误(先抽自己一下)
最后,但愿我写的这个东西对你有帮助。。。。
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.IO; using System.Windows; using CsGL.OpenGL; using CsGL.Pointers; using CsGL.Util; namespace CSGLShowChinese { public class CSGLControl : OpenGLControl { public CSGLControl() : base() { } protected override void InitGLContext()// 此处开始对OpenGL进行所有设置 { base.InitGLContext(); GL.glShadeModel(GL.GL_SMOOTH); // 启用阴影平滑 GL.glClearDepth(1.0f); // 设置深度缓存 GL.glEnable(GL.GL_DEPTH_TEST); // 启用深度测试 GL.glDepthFunc(GL.GL_LEQUAL); // 所作深度测试的类型 GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // 告诉系统对透视进行修正 } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); Size s = this.Size; // 计算窗口的纵横比 double aspect_ratio = (double)s.Width / (double)s.Height; GL.glMatrixMode(GL.GL_PROJECTION); // 设置当前为投影矩阵 GL.glLoadIdentity(); // 重置投影矩阵 GL.gluPerspective(100.0f, aspect_ratio, 0.0f, 1000.0f); GL.glMatrixMode(GL.GL_MODELVIEW); // 设置当前为模型视图矩阵 GL.glLoadIdentity(); // 重置模型视图矩阵 //GL.glViewport(0, 0, s.Width, s.Height); } GLFont glFont = new GLFont(); public override void glDraw() { GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT | GL.GL_ACCUM_BUFFER_BIT); // 清理视窗颜色缓存、深度缓存、模板缓存以及累积缓存。 GL.glLoadIdentity(); GL.gluLookAt(0.0f, 0.0f,20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.1f, 0.0f); BuildFont("你好!",null); GL.glColor3fv(OpenGLPublicFunction.GetGLColorFromDotNetColor(Color.Red)); //我这样给World Say Hello 大家没意见吧。。。。 glFont.Print("Fuck The Program World", -8.0f, 20.0f, 0.0f); //无任何样式的输出,仅英文 GL.glColor3fv(OpenGLPublicFunction.GetGLColorFromDotNetColor(Color.White)); glFont.StylePrint("Fuck The Program World",null, -12.0f, 15.0f, 0.0f);//字体我在这就不写了,只接用默认写好的InitFont,见GLFont类里的代码 GL.glColor3fv(OpenGLPublicFunction.GetGLColorFromDotNetColor(Color.SkyBlue)); glFont.PrintCN("我这样给World Say Hello 大家没意见吧", null, -15.0f, 10.0f, 0.0f);//字体我在也就不写了 GL.glColor3fv(OpenGLPublicFunction.GetGLColorFromDotNetColor(Color.Violet)); glFont.PrintCN("傳統的中國漢字", null, -5.0f, 5.0f, 0.0f); } private void BuildFont(string text,Font font) { SizeF m_size; byte[] pixBuffer; if (font == null) font = new Font("Arial", 12); Color m_color = Color.Red; Graphics g_ctrl = this.CreateGraphics(); m_size = g_ctrl.MeasureString(text, font).ToSize() new Size(1, 0); g_ctrl.Dispose(); Bitmap bitmap = new Bitmap((int)m_size.Width, (int)m_size.Height); Graphics g_bmp = Graphics.FromImage(bitmap); Brush brush = new SolidBrush(m_color); g_bmp.Clear(Color.Blue); g_bmp.DrawString(text, font, brush, new Rectangle(0, 0, (int)m_size.Width, (int)m_size.Height)); MemoryStream stream = new MemoryStream(); bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); pixBuffer = new byte[(int)(m_size.Width * m_size.Height * 4)]; Array.Copy(stream.ToArray(), 54, pixBuffer, 0, pixBuffer.Length); GL.glBindTexture(GL.GL_TEXTURE_2D, 0); // 取消材质绑定 GL.glPushMatrix(); GL.glLoadIdentity(); GL.glMatrixMode(GL.GL_PROJECTION); GL.glPushMatrix(); GL.glLoadIdentity(); GL.gluOrtho2D(0.0, (double)this.Width, 0.0, (double)this.Height); GL.glRasterPos2f(24.0f, 24.0f); GL.glDrawPixels((int)m_size.Width, (int)m_size.Height, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, pixBuffer); GL.glPopMatrix(); GL.glMatrixMode(GL.GL_MODELVIEW); GL.glPopMatrix(); stream.Dispose(); brush.Dispose(); g_bmp.Dispose(); bitmap.Dispose(); } private void InitializeComponent() { this.SuspendLayout(); this.ResumeLayout(false); } } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论