在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 在csgl中显示文字

C# 在csgl中显示文字

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.14M
  • 下载次数:19
  • 浏览次数:683
  • 发布时间:2015-09-22
  • 实例类别:C#语言基础
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 文字 C# c

实例介绍

【实例简介】请童鞋们边看代码,边看本文档

在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);

        }



    }
}

标签: 文字 C# c

实例下载地址

C# 在csgl中显示文字

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警