最近在实现一个材质编辑器 主体的功能代码都实验完毕 主要的难点有二
    1. 窗体的嵌入
    下载Mogre 里面samples自带一个嵌入ogre窗体的工程 基本是没什么问题的 在真正使用时 要加个定时器 然后主动
    更新窗口 另外一点让人有些疑惑的是当窗体大小改变的时候 mogre能自动调用相应的代码让camera设置新的比例
    感觉做的有点太过到位 不习惯。。。
 
    2. scintilla.net控件的使用
    入手有点困难,主要是绘制文本的window api没怎么接触过 使得此控件看上去有点神奇 不过我们只是要使用她
    下面是一个实现cg编辑器的一段代码:
  1 //init edit,scintilla1是该控件的一个实例
  2 scintilla1.Lexing.Lexer = ScintillaNet.Lexer.Cpp;
  3 ScintillaNet.KeywordCollection kc = scintilla1.Lexing.Keywords;

  4 //下面还可以加更多的关键字
  5 kc[0= @"
  6 short 
  7 short2 
  8 short3
  9 short4 
 10 short1x1 
 11 short1x2
 12 short1x3
 13 short1x4
 14 TEXCOORD0
 15 TEXCOORD1
 16 TEXCOORD2
 17 TEXCOORD3
 18 ";

 19 //也是关键字,颜色会不一样,下面有设置
 20 kc[1= @"
 21 abs
 22 acos
 23 all
 24 any
 25 asin
 26 atan
 27 atan2
 28 ceil
 29 clamp
 30 ";
 31 
 32 //显示行号
 33 scintilla1.Margins[0].Width = 20;

 34 //设置相应的显示style

 35 //SCE_C_COMMENT 注释颜色 字体
 36 scintilla1.Styles[1].ForeColor = Color.FromA#008000;
 37 scintilla1.Styles[1].FontName = "simhei";

 38 //SCE_C_COMMENTLINE
 39 scintilla1.Styles[2].ForeColor = Color.FromA#008000;

 40 //SCE_C_STRING 字符串颜色
 41 scintilla1.Styles[6].ForeColor = Color.FromA#c8c8c8;

 42 //SCE_C_WORD 关键字颜色
 43 scintilla1.Styles[5].ForeColor = Color.FromA#0000ff;

 44 //SCE_C_WORD2 也是关键字颜色
 45 scintilla1.Styles[16].ForeColor = Color.FromA#880000;

 46 //SCE_C_NUMBER 数字颜色
 47 scintilla1.Styles[4].ForeColor = Color.FromA#000080;
 48 
 49 //auto complete
 50 //和关键字不同的是,自动完成生词必须是有序的,不然选择时会出现错误
 51 scintilla1.AutoComplete.MaxHeight = 6;
 52 string autowords = @"
 53 abc
 54 apple
 55 lea
 56 sampler
 57 sampler_state
 58 sampler1D
 59 sampler2D
 60 sampler3D
 61 samplerCUBE
 62 shared
 63 signed
 64 ";

 65 //排序上面的words
 66 sortString(ref autowords);

 67 //设置auto words
 68 scintilla1.AutoComplete.ListString = autowords;
 69 scintilla1.KeyDown += new KeyEventHandler(scintilla1_KeyDown);
 70 
 71 void scintilla1_KeyDown(object sender, KeyEventArgs e)
 72 {
 73     //决定何时显示自动完成的单词列表 可以根据自己要求的逻辑来
 74     if (InputLanguage.CurrentInputLanguage.LayoutName == "简体中文 - 美式键盘")
 75     {
 76         //输入中文时不显示,遇到下列字符也不显示
 77         if (e.KeyCode == Keys.Enter ||
 78             e.KeyCode == Keys.Up    ||
 79             e.KeyCode == Keys.Down  ||
 80             e.KeyCode == Keys.Left  ||
 81             e.KeyCode == Keys.Right ||
 82             e.KeyCode==Keys.Back    ||
 83             e.KeyCode==Keys.Space)
 84 
 85             return;
 86         //得到当前光标位置
 87         int cpos = scintilla1.CurrentPos;
 88         //查看光标前一位置的字符
 89         char prechar = scintilla1.CharAt(cpos-1);
 90         //当前输入的字符
 91         char curchar = (char)e.KeyValue;
 92        
 93         if(prechar == '\n' || prechar == ' '|| prechar=='\t' || cpos==0)
 94         {
 95              //如果前一字符是以上的字符,且当前字符为auto words中某个词的首字母
 96              //显示自动完成列表
 97              if (autoFirstLetters.BinarySearch(curchar)>=0)
 98              {
 99                  scintilla1.AutoComplete.Show();
100              }
101         }               
102    }
103 }

当然,还可以加入更多功能和控制逻辑,如在换行的时候将光标跳到合适的位置,而不总是在最前面
从此,不用在vc中写一群黑压压的cg或是材质脚本 生活会更亲松和艺术点。。。


posted on 2010-08-08 14:55 野猪红 阅读(650) 评论(0)  编辑 收藏 引用 所属分类: 编辑器

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理