最近在实现一个材质编辑器 主体的功能代码都实验完毕 主要的难点有二
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
野猪红 阅读(939)
评论(0) 编辑 收藏 引用 所属分类:
编辑器