﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Cpper-随笔分类-Game引擎</title><link>http://cppblog.com/gaimor/category/13118.html</link><description>C/C++高级工程师
Android高级软件工程师
IT集成工程师
音频工程师
熟悉c,c++,java,c#,py,js,asp等多种语言
程序猿</description><language>zh-cn</language><lastBuildDate>Fri, 18 Mar 2016 18:20:54 GMT</lastBuildDate><pubDate>Fri, 18 Mar 2016 18:20:54 GMT</pubDate><ttl>60</ttl><item><title>BGE GUI升级</title><link>http://www.cppblog.com/gaimor/archive/2016/03/17/213054.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 17 Mar 2016 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2016/03/17/213054.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/213054.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2016/03/17/213054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/213054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/213054.html</trackback:ping><description><![CDATA[主要解决了很多故障，增加了一点功能<br />API上参考了Qt<br /><ol><li>支持png格式</li><li>支持控件序列化，反序列化</li><li>支持换肤</li><li>代码整洁，风格良好</li><li>提供StackLayout,BoxLayout,GridLayout,FlowLayout</li><li>提供CheckBox,Panel,StaticText,ImageBox,ProgressBar,TableWidget,Slider,EditFiled,Combox等常用控件</li></ol><p>截图如下:</p><p><img src="http://www.cppblog.com/images/cppblog_com/gaimor/button.png" alt="" height="508" border="0" width="646" /></p><p><br /></p><p><img src="http://www.cppblog.com/images/cppblog_com/gaimor/table.png" alt="" height="508" border="0" width="646" /></p><p>例子1</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">BGE</span><span style="color: #000000; ">/</span><span style="color: #000000; ">All</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;bge;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Dispatcher&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;SlotHolder<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Dispatcher(ImageBox</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;image,Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;image;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;button;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;click()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:box/side</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;toString(count_);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.png</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setImage(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(count_&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;ImageBox</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;image_;<br />&nbsp;&nbsp;&nbsp;&nbsp;Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button_;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count_;<br />};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().initial(argv[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().setResourcePackage(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data.zip</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().initialize(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:accid.ttf</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Device</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Device::create();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">initial();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">createWindow(</span><span style="color: #000000; ">640</span><span style="color: #000000; ">,</span><span style="color: #000000; ">480</span><span style="color: #000000; ">,String(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BGE&nbsp;Window</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Panel</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;panel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Panel();<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setPosition(Vector2f(</span><span style="color: #000000; ">20</span><span style="color: #000000; ">,</span><span style="color: #000000; ">20</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">128</span><span style="color: #000000; ">+</span><span style="color: #000000; ">24</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ImageBox</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;image&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ImageBox();<br />&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setImage(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:box/side6.png</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setPosition(Vector2f(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">128</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Button();<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">loadAppearance(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:buttonskin1.xml</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">24</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setText(L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Click</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Dispatcher&nbsp;dispacher(image,button);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">clicked.connect(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dispacher,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Dispatcher::click);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BoxLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;layout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BoxLayout();<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSpacing(.0f);<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setLayout(layout);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setJustification(Orientation_vertical);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(image);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(button);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">adjust();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().addWindow(panel);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">isRunning())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">preRender();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().update();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">swapBuffers();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">pollEvents();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">closeWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br />例子2<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">BGE</span><span style="color: #000000; ">/</span><span style="color: #000000; ">All</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;bge;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Dispatcher&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;SlotHolder<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Dispatcher(StackLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;layout,Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;layout;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;button;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;click()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setCurrentIndex(count_);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(count_&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;StackLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;layout_;<br />&nbsp;&nbsp;&nbsp;&nbsp;Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button_;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count_;<br />};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().initial(argv[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().setResourcePackage(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data.zip</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().initialize(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:accid.ttf</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Device</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Device::create();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">initial();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">createWindow(</span><span style="color: #000000; ">640</span><span style="color: #000000; ">,</span><span style="color: #000000; ">480</span><span style="color: #000000; ">,String(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BGE&nbsp;Window</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Panel</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;panel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Panel();<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setPosition(Vector2f(</span><span style="color: #000000; ">20</span><span style="color: #000000; ">,</span><span style="color: #000000; ">20</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">128</span><span style="color: #000000; ">+</span><span style="color: #000000; ">24</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Panel</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;stackPanel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Panel();<br />&nbsp;&nbsp;&nbsp;&nbsp;stackPanel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">128</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;StackLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;stackLayout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;StackLayout();<br />&nbsp;&nbsp;&nbsp;&nbsp;stackPanel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setLayout(stackLayout);<br />&nbsp;&nbsp;&nbsp;&nbsp;stackLayout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSpacing(.0f);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageBox</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;image&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ImageBox();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:box/side</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;toString(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.png</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setImage(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setPosition(Vector2f(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">128</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stackLayout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">insertWindow(i,image);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Button();<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">loadAppearance(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:buttonskin1.xml</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">24</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setText(L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Click</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Dispatcher&nbsp;dispacher(stackLayout,button);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">clicked.connect(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dispacher,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Dispatcher::click);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BoxLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;layout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BoxLayout();<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSpacing(.0f);<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setLayout(layout);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setJustification(Orientation_vertical);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(stackPanel);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(button);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">adjust();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().addWindow(panel);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">isRunning())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">preRender();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().update();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">swapBuffers();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">pollEvents();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">closeWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br />这2个显示效果完全一样<br />欢迎下载<br /><br /></span></div><span style="color: #000000; "><img src="http://www.cppblog.com/images/cppblog_com/gaimor/rich.png" alt="" height="508" border="0" width="646" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/gaimor/image.png" alt="" height="508" border="0" width="646" /><br /><img src="http://www.cppblog.com/images/cppblog_com/gaimor/gird.png" alt="" height="350" border="0" width="646" /><br /><img src="http://www.cppblog.com/images/cppblog_com/gaimor/p.png" alt="" height="508" border="0" width="646" /><br /><br />在这里下载:<div>http://download.csdn.net/detail/ccsdu2004/9464121</div><br />代码有点大 这里放不下<br /><br /></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/213054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2016-03-17 11:13 <a href="http://www.cppblog.com/gaimor/archive/2016/03/17/213054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Opengl显示富文本</title><link>http://www.cppblog.com/gaimor/archive/2016/02/22/212861.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 22 Feb 2016 09:46:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2016/02/22/212861.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212861.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2016/02/22/212861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212861.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212861.html</trackback:ping><description><![CDATA[给BGE加上了富文本显示功能<br />相关代码如下:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;GLTextRenderer::render(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Color</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;color,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;String</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;FloatRect</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;area,</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;isMultiLine,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Horizontal&nbsp;hAlignment,Vertical&nbsp;vAlignment,</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;rich)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(typeFace_&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">rich)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeFace_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setColor(color);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(isMultiLine)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderMultiline(color,</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,area,hAlignment);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector2f&nbsp;position(typeFace_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">penX(</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,area,hAlignment),baseLineY(area,vAlignment));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeFace_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">render(</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,position);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(typeFace_)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">isMultiLine)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;cmdlist&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;parseString(</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector2f&nbsp;position(typeFace_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">penX(</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,area,hAlignment),baseLineY(area,vAlignment));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeFace_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">render(String(),position,cmdlist);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;cmdlist&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;parseString(</span><span style="color: #0000FF; ">string</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderMultiline(color,cmdlist,area,hAlignment);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>这里的parseString用于解析类似html的问题<br />函数实现如下:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;TextRenderer::parseString(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;String</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;content)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text(content);<br />&nbsp;&nbsp;&nbsp;&nbsp;std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;cmdList;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;current;<br />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;text.split(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">list.size();i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;list[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(current.startWith(L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textRenderCmdUnit&nbsp;unit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.undo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdList.push_back(unit);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;remain&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current.substr(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">remain.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.text&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;remain;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.undo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdList.push_back(unit);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(current.find(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;String::InvalidPos)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textRenderCmdUnit&nbsp;unit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.tag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current.substr(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,current.find(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.undo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdList.push_back(unit);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;find&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current.find(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(find&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;current.size()</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.tag.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.text&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current.substr(find</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdList.push_back(unit);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textRenderCmdUnit&nbsp;unit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.text&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit.undo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdList.push_back(unit);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;cmdList;<br />}<br /></span></div>以下用于渲染富文本<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;TypeFace::render(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;FloatRect</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;area,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;queue,Horizontal&nbsp;hAlignment,</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;vpos)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;availableWidth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;area.width_&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2.0f</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;textRenderCmdUnit&nbsp;unit;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line,lineRemain;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::queue</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;cmdStack;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vpos;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;penX(String(),area,hAlignment);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;itr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;queue.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(itr&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;queue.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">itr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(unit.undo)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">cmdStack.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cmdStack.front();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdStack.pop();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bold</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bold_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">italic</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;italic_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">underline</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;underline_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applyColor(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">unit.tag.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;unit.tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdStack.push(tag);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bold</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bold_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">italic</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;italic_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">underline</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;underline_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applyColor(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;unit.text;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;pos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;hitCharacterIndex(line,availableWidth</span><span style="color: #000000; ">-</span><span style="color: #000000; ">x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pos&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;penX(String(),area,hAlignment);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;lineHeight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pos&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;String::InvalidPos)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.size();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.substr(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineRemain&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.substr(pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;linefeed&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">().find_first_of(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(linefeed&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;std::basic_string</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">uint32_t</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::npos)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.substr(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,linefeed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineRemain&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.substr(linefeed</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;lineRemain;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;render(line,Vector2f(x,y),std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;width(line);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(linefeed&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;String::InvalidPos)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;penX(String(),area,hAlignment);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;lineHeight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lineRemain;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(lineRemain.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itr&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>以下渲染单色文本<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;TypeFace::renderGlyphs(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;cmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Vector2f&nbsp;position(</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;leftChar&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;textRenderCmdUnit&nbsp;unit;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::queue</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;cmdStack;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::list</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">textRenderCmdUnit</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::const_iterator&nbsp;itr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cmd.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(itr&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;cmd.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">itr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(unit.tag.empty()&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">unit.undo)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;renderGlyphs(unit.text,position);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">unit.tag.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;unit.tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdStack.push(tag);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bold</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bold_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">italic</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;italic_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">underline</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;underline_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applyColor(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(unit.undo)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">cmdStack.empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cmdStack.front();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdStack.pop();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bold</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bold_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">italic</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;italic_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(tag&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">underline</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;underline_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applyColor(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itr&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>可以看出 支持的文本格式为&lt;Tag&gt;Text&lt;/&gt;<br />一个例子是:<br /><div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Blue</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">这段代码主要测试BGE的富文本显示功能\n</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">Blue</span><span style="color: #000000; ">&gt;&lt;</span><span style="color: #000000; ">Red</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">需要指出的是当前只要能支持多行显示和多颜色显示功能即可(不考虑下划线斜体以及加粗显示)。</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">Red</span><span style="color: #000000; ">&gt;&lt;</span><span style="color: #000000; ">White</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">这句话将被显示为白色</span><span style="color: #000000; ">&lt;/&gt;&lt;</span><span style="color: #000000; ">Blue</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">这句话应该被蓝色字体</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">Blue</span><span style="color: #000000; ">&gt;&lt;</span><span style="color: #000000; ">Green</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">绿色字体</span><span style="color: #000000; ">&lt;/&gt;&lt;</span><span style="color: #000000; ">Cyan</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">Cyan色</span><span style="color: #000000; ">&lt;/&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span></div></div>最终显示如下:<br /><img src="http://www.cppblog.com/images/cppblog_com/gaimor/richtext.png" alt="" height="272" border="0" width="656" /><img src ="http://www.cppblog.com/gaimor/aggbug/212861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2016-02-22 17:46 <a href="http://www.cppblog.com/gaimor/archive/2016/02/22/212861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发布一个基于OPENGL的GUI库</title><link>http://www.cppblog.com/gaimor/archive/2016/01/22/212715.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Fri, 22 Jan 2016 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2016/01/22/212715.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212715.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2016/01/22/212715.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212715.html</trackback:ping><description><![CDATA[算是基本完成了，先上一个截图<br /><img src="http://www.cppblog.com/images/cppblog_com/gaimor/bge.PNG" width="656" height="401" alt="" /><br /><br />可以说GUI所需要的当前基本都是实现了<br /><br />再上一个使用例子:<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;BGE/All&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;bge;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().initial(argv[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().setResourcePackage("data.zip");<br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().initialize("simkai.ttf",<span style="color: #0000FF; ">true</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Device*&nbsp;device&nbsp;=&nbsp;Device::create();<br />&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;initial();<br />&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;createWindow(640,480,bge::String("BGE&nbsp;Window"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().propertyScheme()-&gt;load(":skin1.xml");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Window*&nbsp;window&nbsp;=&nbsp;WindowManager::instance().createWindow(":grid-layout-window.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().addWindow(window);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(device-&gt;isRunning())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;preRender();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().update();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;swapBuffers();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;pollEvents();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;closeWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device-&gt;deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br />个人感觉写的还是比较清晰，没什么需要特别说明的<br />使用的开源库有libpng,glfw,freetype,sigslot,physfs<br />不过代码有点大，有兴趣的可以留个邮箱<br /><br /><img src ="http://www.cppblog.com/gaimor/aggbug/212715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2016-01-22 15:41 <a href="http://www.cppblog.com/gaimor/archive/2016/01/22/212715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新做的一个基于OPENGL的gui库 起名BGE</title><link>http://www.cppblog.com/gaimor/archive/2016/01/20/212689.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Wed, 20 Jan 2016 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2016/01/20/212689.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212689.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2016/01/20/212689.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212689.html</trackback:ping><description><![CDATA[先上一个使用例子<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">BGE</span><span style="color: #000000; ">/</span><span style="color: #000000; ">All</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;bge;<br /><br />Window</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;createButton(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;name,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;String</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;text)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Button</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;button&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Button(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,text);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setName(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">92</span><span style="color: #000000; ">,</span><span style="color: #000000; ">42</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;button;<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().initial(argv[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance().setResourcePackage(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data.zip</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().initialize(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">simkai.ttf</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Device</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Device::create();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">initial();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">createWindow(</span><span style="color: #000000; ">640</span><span style="color: #000000; ">,</span><span style="color: #000000; ">480</span><span style="color: #000000; ">,bge::String(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BGE&nbsp;Window</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Panel</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;panel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Panel(FloatRect(</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,</span><span style="color: #000000; ">192</span><span style="color: #000000; ">,</span><span style="color: #000000; ">180</span><span style="color: #000000; ">),</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;GridLayout</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;layout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;GridLayout();<br />&nbsp;&nbsp;&nbsp;&nbsp;panel</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setLayout(layout);<br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;widths;<br />&nbsp;&nbsp;&nbsp;&nbsp;widths.push_back(</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setColumnWidths(widths);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;heights;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;k&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">k)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heights.push_back(</span><span style="color: #000000; ">48.0f</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;heights.push_back(</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setRowHeights(heights);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GridCellInfo&nbsp;info;<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(createButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">button1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">按键</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),info);<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(createButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">button2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">按键</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),info);<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(createButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">button3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">按键</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),info);<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(createButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">button4</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">按键</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),info);<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;info.horizontalSpan_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Window</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;edit&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;EditField(NULL,L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Edit&nbsp;Text</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;edit</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSize(Vector2f(</span><span style="color: #000000; ">196</span><span style="color: #000000; ">,</span><span style="color: #000000; ">36</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">addWindow(edit,info);<br />&nbsp;&nbsp;&nbsp;&nbsp;info.columnIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;info.rowIndex_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;info.horizontalSpan_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;layout</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">arrangeWithin();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FrameWindow</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;window&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FrameWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">enableMovement();<br />&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setText(L</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BGE窗体</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setClientPanel(panel);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().addWindow(window);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">isRunning())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">preRender();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().update();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">swapBuffers();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">pollEvents();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">closeWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000;">;<br />}<br /><br />在开发上参考了Qt等软件，当前支持常见控件 支持控件序列化 整体换肤 控件换肤 <br />上面的代码显示的截图如下:<br /><div>http://images2015.cnblogs.com/blog/676118/201601/676118-20160120092402484-466039328.png</div>不过当前还有一点小问题 修改完了再上代码<br />做这个不为什么 就是几年前一直想做个<br /></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/212689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2016-01-20 09:34 <a href="http://www.cppblog.com/gaimor/archive/2016/01/20/212689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在做一个基于OPENGL的GUI库，希望方便好用.</title><link>http://www.cppblog.com/gaimor/archive/2016/01/07/212628.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 07 Jan 2016 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2016/01/07/212628.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212628.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2016/01/07/212628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212628.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">BGE</span><span style="color: #000000; ">/</span><span style="color: #000000; ">all</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;bge;<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!初始化文件系统</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance()</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">initial(argv[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!加载压缩包</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;FileSystem::instance()</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setResourcePackage(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data.zip</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!初始化UI管理器,设定默认字体,并设定自动删除控件</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;WindowManager::instance().initialize(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">simkai.ttf</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!生成和初始化窗口设备</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Device</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bgeCreateDevice();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">initial();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">createWindow(</span><span style="color: #000000; ">640</span><span style="color: #000000; ">,</span><span style="color: #000000; ">480</span><span style="color: #000000; ">,bge::String(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BGE&nbsp;Window</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!从资源文件加载控件包含子控件和控件属性</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Window</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;window&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WindowManager::instance().create(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">window.xml</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;bge::WindowManager::instance().addWindow(listbox);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">isRunning())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!预渲染设备</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">perRender();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!窗体更新</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bge::WindowManager::instance().update();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">swapBuffers();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">pollEvents();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!销毁窗体管理器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;bge::WindowManager::instance().terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!关闭并销毁设备</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">closeWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">terminate();<br />&nbsp;&nbsp;&nbsp;&nbsp;device</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pause</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000;">;<br />}<br /><br />还没做完，用法如上，很简练吧:D<br /><br />什么？对整体视效不满意？<br />试下这个:<div>WindowManager::instance().propertyScheme()-&gt;load("skin.xml");<br />想定制某个控件的视效?<br />Button* button = window-&gt;findChild("ok");<br />button-&gt;loadAppearance("button.xml","blue");</div><br /></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/212628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2016-01-07 16:20 <a href="http://www.cppblog.com/gaimor/archive/2016/01/07/212628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用libpng解码png文件</title><link>http://www.cppblog.com/gaimor/archive/2015/12/29/212577.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 29 Dec 2015 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2015/12/29/212577.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212577.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2015/12/29/212577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212577.html</trackback:ping><description><![CDATA[libpng比较另类，解码方式比较奇特，这里记录下<br />以下代码为使用虚拟IOReader的方式，稍做修改就基于FILE使用<br />代码很详细，不需额外解释<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">PNGImage::PNGImage(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;filename):<br />&nbsp;&nbsp;&nbsp;&nbsp;ReferenceCountedImage(filename),<br />&nbsp;&nbsp;&nbsp;&nbsp;data_(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IOReader</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;FileSystem::instance()</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">readFile(filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(reader&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;png_structp&nbsp;png_ptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_create_read_struct(PNG_LIBPNG_VER_STRING,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(png_ptr&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;png_infop&nbsp;info_ptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_create_info_struct(png_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(info_ptr&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_read_struct(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">png_ptr,&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">),&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(setjmp(png_jmpbuf(png_ptr)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_read_struct(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">png_ptr,png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">),png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;png_set_read_fn(&nbsp;png_ptr,reader,(png_rw_ptr)user_read_data);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;png_set_sig_bytes(png_ptr,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;png_read_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;width&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_get_image_width(png_ptr,info_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;height&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_get_image_height(png_ptr,info_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;bit_depth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_get_bit_depth(png_ptr,info_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bit_depth&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_info_struct(png_ptr,png_infopp(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info_ptr));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_read_struct(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">png_ptr,png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">),&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;png_byte&nbsp;colorType&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_get_color_type(png_ptr,&nbsp;info_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((colorType&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;PNG_COLOR_TYPE_RGB)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;(colorType&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;PNG_COLOR_TYPE_RGB_ALPHA))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_info_struct(png_ptr,&nbsp;png_infopp(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info_ptr));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_read_struct(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">png_ptr,&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">),&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;bytesPerPixel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(colorType&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;PNG_COLOR_TYPE_RGB)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;stride&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bytesPerPixel&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;width;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[stride&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;height];<br />&nbsp;&nbsp;&nbsp;&nbsp;png_bytep</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;row_pointers&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;png_get_rows(png_ptr,&nbsp;info_ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;height;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;row&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;height&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(data&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(row&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;stride),&nbsp;row_pointers[i],&nbsp;stride);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;size_.x_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;width;<br />&nbsp;&nbsp;&nbsp;&nbsp;size_.y_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;height;<br />&nbsp;&nbsp;&nbsp;&nbsp;numberOfBitsPerPixel_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bytesPerPixel&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;data_&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;data;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">close();<br />&nbsp;&nbsp;&nbsp;&nbsp;reader</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">deleteLater();<br />&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_info_struct(png_ptr,&nbsp;png_infopp(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info_ptr));<br />&nbsp;&nbsp;&nbsp;&nbsp;png_destroy_read_struct(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">png_ptr,&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">),&nbsp;png_infopp(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />}</span></div><img src ="http://www.cppblog.com/gaimor/aggbug/212577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2015-12-29 11:12 <a href="http://www.cppblog.com/gaimor/archive/2015/12/29/212577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GAudio library 2.2.1.0发布啦</title><link>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 10 Dec 2015 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212449.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212449.html</trackback:ping><description><![CDATA[更新不多，主要是取消了插接结构，把所有的编解码和音效都合入了主库<br />dll合计不超过1M<br /><br />支持常见音频格式和音效，使用超级方便<br />下载在这里:<a href="/Files/gaimor/gaudio-sdk-2.2.1.0.zip">/Files/gaimor/gaudio-sdk-2.2.1.0.zip</a><img src ="http://www.cppblog.com/gaimor/aggbug/212449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2015-12-10 16:37 <a href="http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SFML String类的问题</title><link>http://www.cppblog.com/gaimor/archive/2015/11/20/212297.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Fri, 20 Nov 2015 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2015/11/20/212297.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212297.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2015/11/20/212297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近想做个基于Opengl的GUI试了下SFML发现其String类对宽字节转换有问题，就修改了下String并重命名为Utf8使用这个应该可以正确显示中文该类修改如下:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/////////////////...&nbsp;&nbsp;<a href='http://www.cppblog.com/gaimor/archive/2015/11/20/212297.html'>阅读全文</a><img src ="http://www.cppblog.com/gaimor/aggbug/212297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2015-11-20 13:09 <a href="http://www.cppblog.com/gaimor/archive/2015/11/20/212297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gaudio是一个基于C/C++混合编程的音频库~</title><link>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 11 Jul 2013 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/201711.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/201711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/201711.html</trackback:ping><description><![CDATA[<div>gaudio是一个基于C/C++混合编程的跨平台音频库,当前支持windows32操作系统和linux32位操作系统<br /><br />修改记录<br />1.2013.04.01<br />&nbsp;&nbsp;&nbsp; 初次发布<br />2.2013.04.10<br />&nbsp;&nbsp;&nbsp; 完成对wav格式采样频率8000-48000,采样格式4,8,16,24,32的支持 &nbsp;&nbsp; &nbsp;<br />3.2013.05.01<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.4.0.8<br />&nbsp;&nbsp;&nbsp; b.修改一个退出异常<br />&nbsp;&nbsp;&nbsp; c.支持二源混音<br />&nbsp;&nbsp;&nbsp; d.使用载入插件的方式提供对wav播放的支持<br />&nbsp;&nbsp;&nbsp; e.增加对au格式的支持<br />&nbsp;&nbsp;&nbsp; f.增加echo音效<br />&nbsp;&nbsp;&nbsp; g.增加bassboost音效<br />&nbsp;&nbsp;&nbsp; h.增加函数gaudio_address_get<br />&nbsp;&nbsp;&nbsp; i.增加使用例子:echo/mixer/stream/boost<br />&nbsp;&nbsp;&nbsp; j.把设置,获取音源三维空间信息的函数调整为: gaudio_source_set_float3,gaudio_source_get_float3<br />&nbsp;&nbsp;&nbsp; k.修改解码器结构为回调模式<br />4.2013.05.10<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.6.8.0<br />&nbsp;&nbsp;&nbsp; b.优化部分代码<br />&nbsp;&nbsp;&nbsp; c.增加speedchanger音效<br />&nbsp;&nbsp;&nbsp; d.增加音频翻转(g168)<br />&nbsp;&nbsp;&nbsp; e.增加音频声道交换(g168)<br />&nbsp;&nbsp;&nbsp; f.增加声道合并(g168)<br />&nbsp;&nbsp;&nbsp; g.增加speedchanger/invert测试用例<br />&nbsp;&nbsp;&nbsp; h.增加vc调用静态链接库libgaudio.lib<br />&nbsp;&nbsp;&nbsp; i.增加调制音效和测试例子<br />&nbsp;&nbsp;&nbsp; j.修改解码器框架<br />&nbsp;&nbsp;&nbsp; k.修改获取音频采样编码格式不正确的问题<br />&nbsp;&nbsp;&nbsp; l.解决seek定位不准的问题<br />&nbsp;&nbsp;&nbsp; m.增加音效链测试例子<br />&nbsp;&nbsp;&nbsp; n.增加函数gaudio_set_long,gaudio_get_long<br />&nbsp;&nbsp;&nbsp; o.修改stream例子<br />&nbsp;&nbsp;&nbsp; p.支持压缩mpc音频格式<br />&nbsp;&nbsp;&nbsp; q.支持ogg/vorbis格式<br />&nbsp;&nbsp;&nbsp; r.修改获取采样格式错误的bug<br />&nbsp;&nbsp;&nbsp; t.增加接口说明文档&nbsp;&nbsp; &nbsp;<br />5.2013.06.10<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.7.2.0<br />&nbsp;&nbsp;&nbsp; b.gaudio_source_set_error_callback回调函数增加音源参数<br />&nbsp;&nbsp;&nbsp; c.gaudio_source_set_finish_callback回调函数增加音源参数<br />&nbsp;&nbsp;&nbsp; d.移除gaudio_get_version函数<br />&nbsp;&nbsp;&nbsp; e.gaudio_effect_setcallback函数调整为gaudio_effect_set_callback<br />&nbsp;&nbsp;&nbsp; f.使用插件式的音频驱动模式 - gwinmm<br />&nbsp;&nbsp;&nbsp; g.gaudio代码优化<br />&nbsp;&nbsp;&nbsp; h.增加音频源码率的获取<br />&nbsp;&nbsp;&nbsp; i.增加feature范例<br />&nbsp;&nbsp;&nbsp; j.完善文档<br />&nbsp;&nbsp;&nbsp; k.增加对mp3的支持<br />&nbsp;&nbsp;&nbsp; l.移除invert/modulator/bassboost例子<br />&nbsp;&nbsp;&nbsp; m.增加balance<br />6.2013.07.07<br />&nbsp;&nbsp;&nbsp; a.版本提升到1.8.0.2<br />&nbsp;&nbsp;&nbsp; b.增加对交换文件aiff的支持<br />&nbsp;&nbsp;&nbsp; c.修改音频驱动插件实现<br />&nbsp;&nbsp;&nbsp; d.增加移相器音效<br />&nbsp;&nbsp;&nbsp; e.修改部分API接口使用的long为int32_t以方便移植<br />&nbsp;&nbsp;&nbsp; f.增加code::blocks测试工程<br />&nbsp;&nbsp;&nbsp; g.增加msvc2008测试工程<br />&nbsp;&nbsp;&nbsp; h.增加函数接口gaudio_source_create_from_buffer2以播放raw音频数据<br />&nbsp;&nbsp;&nbsp; i.把各个音效参数提到单独文件<br />&nbsp;&nbsp;&nbsp; j.简化wav解码<br />&nbsp;&nbsp;&nbsp; k.修改几处内存泄漏<br />&nbsp;&nbsp;&nbsp; l.增加音频回录功能,输出格式MP2,MP3,APE,WV,AAC,WAV,AU,AIFF,VOC,CAF,OGG<br />&nbsp;&nbsp; &nbsp;当前录制信息:16位音频,双声道,采样频率44100<br />&nbsp;&nbsp;&nbsp; m.增加音频回录的例子recorder<br />&nbsp;&nbsp;&nbsp; n.测试例子使用getopt和usage提示<br />&nbsp;&nbsp;&nbsp; o.增加对tta格式的支持&nbsp;&nbsp; &nbsp;<br />7.2013.07.28<br />&nbsp;&nbsp;&nbsp; a.版本提升到1.9.8.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; b.解决了wav,au,aiff播放进度不准的故障 <br />&nbsp;&nbsp;&nbsp; c.优化wav/au/aiff解码性能&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; d.增加distortion音效&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; e.增加foldback distortion音效&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; f.增加distortion音效使用例子&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; g.增加声音穿透力&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; h.修改结构最大支持八声道&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; i.增加portaudio插件驱动(win32&amp;linux)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; j.完成g168,bassbost的liux版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; k.完成wav,au音频格式的linux版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; l.代码增加部分注释(未完成)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; m.尝试性支持linux操作系统&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; n.支持midi/mid音乐格式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; o.解决了mixer混音退出报错的问题<br />&nbsp; &nbsp; p.skip id3v2 &nbsp;&nbsp;&nbsp; <br /><div>8.2013.08.16<br />&nbsp;&nbsp;&nbsp; a.版本提升到2.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; b.变量宏增加AUDIO_ENUM前缀 <br />&nbsp;&nbsp;&nbsp; c.增加非标准插件gsndfile支持flac/ogg/au/wav/aiff/voc/caf/..基于(sndfile)<br />&nbsp;&nbsp;&nbsp; d.改用mpg123解码mp3<br />&nbsp;&nbsp; &nbsp;e.支持FFT频谱<br /><div>9.2013.09.08<br />&nbsp;&nbsp;&nbsp; a.版本提升到2.0.6.0<br />&nbsp;&nbsp;&nbsp; b.修改CROSSFEED宏和相关&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;c.引入200号插件支持s3m/mod/it/xm音频格式<br />&nbsp;&nbsp; &nbsp;d.整理测试用例<br />&nbsp;&nbsp; &nbsp;e.增加autowah音效<br />&nbsp;&nbsp; &nbsp;f.增加驱动检测<br />10.2015.12.10 版本2.2.1.0</div><div>支持常见音频格式和音效，使用超级方便<br />下载在这里:<a href="http://www.cppblog.com/Files/gaimor/gaudio-sdk-2.2.1.0.zip">/Files/gaimor/gaudio-sdk-2.2.1.0.zip</a></div><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;<a href="/Files/gaimor/gaudio-sdk-2101.zip"></a></div></div><img src ="http://www.cppblog.com/gaimor/aggbug/201711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-07-11 22:49 <a href="http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SmartGUI库字体接口</title><link>http://www.cppblog.com/gaimor/archive/2011/06/08/148294.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Wed, 08 Jun 2011 11:39:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/06/08/148294.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/148294.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/06/08/148294.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/148294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/148294.html</trackback:ping><description><![CDATA[终于把SmartGUi库写了一半，基本的架子算是搭起来了<br />现在我打算编写博客边做开发<br />虽然说之前也做过GUI，但是这次还是想把这个做好点(要是一不小心和CEGUI或者MYGUI起名那就不错了哈哈)<br /><br />先说GUI字体接口吧<br />需要说在的 这个库的定位是与具体渲染机器无关<br />那么我们就需要一个与具体渲染有关的插件了<br /><br />很显然，对于GUI来说主要有3个部分<br />1.纹理/位图<br />2.字体<br />3.基本图元的绘制<br />当然还有其他...<br /><br />下面这是基本字体的抽象基类
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">CORE_BEGIN_NAMESPACE<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GUI_EXPORT&nbsp;GFont&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;LEFT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TOP&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CENTER&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RIGHT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;BOTTOM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">GFont();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;gstring&nbsp;GetFileName()</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetFontSize()&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetLineHeight()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetWidth(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;text)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetHitCharIndex(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;text,</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;offset)</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;Render(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;text,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Recti</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;area,\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;halignment&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CENTER,\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;valignment&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CENTER,\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;oneline&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(GFont)<br />};<br /><br />CORE_END_NAMESPACE</span></div><br />函数功能基本都看的懂<br />需要说明的是<br />1.GetHitCharIndex是本文给定偏移对于的字符标号<br />2.这里并没有提供一个渲染给定文本在给定位置的功能，反而提供了一个更为贴心的Render渲染文本于给定矩形-可以指定对其方式和是否为多行渲染<br />3.这里还没有提供一些更为复杂的字体性质，比如斜体，下划线，粗体等等<br /><br />一个相关的字体工厂对象如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">CORE_BEGIN_NAMESPACE<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GUI_EXPORT&nbsp;GFontFactory&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">GFontFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">GFont</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;CreateFont(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;font,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(GFontFactory)&nbsp;<br />};<br /><br />CORE_END_NAMESPACE</span></div>这个没什么说的，根据字体文件和字体大小生成字体指针一枚<br />还有一个相关对象是FontManager<br />接口如下:
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">CORE_BEGIN_NAMESPACE<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GUI_EXPORT&nbsp;GFontManager:<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Manager</span><span style="color: #000000">&lt;</span><span style="color: #000000">boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">GFont</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">,<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GSerializer<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;AddFont(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;name,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;gstring</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;font,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size,</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;del&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;gstring&nbsp;GetSerializerTag(){</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">fontlist</span><span style="color: #000000">"</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Load(boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">XMLNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;node);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Save(boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">XMLDocument</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;doc,boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">XMLNode</span><span style="color: #000000">&gt;&amp;</span><span style="color: #000000">&nbsp;node);<br />apiuse<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetFontFactory(boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">GFontFactory</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;factory);<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr</span><span style="color: #000000">&lt;</span><span style="color: #000000">GFontFactory</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;factory;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEFINE_SINGLETON(GFontManager)<br />};<br /><br />CORE_END_NAMESPACE</span></div>
<p>1.显然字体管理器是一个单件<br />2.函数SetFontFactory()是提供给插件设置具体的字体工厂的，所以这里有一个标记apiuse<br />3.函数GetSerializerTag,Load,Save是从对那象GSerializer继承来的，目的就是提供字体的序列化和反序列化动作-我们的GUI是要尽可能做到自动化的</p>
<p>在SmartGUI中，字体系统基本上就由这三个对象，以后样子改动不会太大了，也许只会增加函数接口而已<br /><br />另外这个字体系统从设计模式的角度看是很容易理解的<br /><br />----------------------------------------------------------标记<br />接口总比实现重要些.</p><img src ="http://www.cppblog.com/gaimor/aggbug/148294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-06-08 19:39 <a href="http://www.cppblog.com/gaimor/archive/2011/06/08/148294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SmartGUI项目</title><link>http://www.cppblog.com/gaimor/archive/2011/05/30/147720.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 30 May 2011 14:35:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/30/147720.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/147720.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/30/147720.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/147720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/147720.html</trackback:ping><description><![CDATA[<p>先解释下啥是SmartGUI?<br />SmartGUI是我打算做，也做了一周多的一个Game GUI LIB<br />其基本的特点包括，但不限于以下几项<br />1.跨平台<br />2.支持DX,GL<br />以上2项似乎不大能引起别人的注意<br />3.全脚本化支持<br />&nbsp;&nbsp;&nbsp; 载入配置即可自动生成控件,外观并显示出来<br />&nbsp;&nbsp;&nbsp; 你所要做的只是设置必要的逻辑关系即可(至少现在我还没有合适的方案来支持脚本配置UI逻辑关系，不过未来未必)<br />这点貌似比较吸引人吧<br />不过还有一点<br />4.开源<br />这将是我第一个开源项目,在动手之前我吸收了大量android,QT编程的养分<br /><br />SmartGUI最大的特点只要2个<br />1为易用<br />2为界面配置协调<br />--------------------------------------------------------------------<br />当然性能不会差到哪里去 <br /><br />附注:几天前才开始，争取端午截止前放上第一份源码<br />各位同学给一个好的开源站点吧<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><img src ="http://www.cppblog.com/gaimor/aggbug/147720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-30 22:35 <a href="http://www.cppblog.com/gaimor/archive/2011/05/30/147720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程(3)-FadeOut和FadeIn音效 </title><link>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 10 May 2011 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/146148.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/146148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/146148.html</trackback:ping><description><![CDATA[这是音效系列编程之三:FadeOut和FadeIn音效<br><br>二者都分别控制音乐的淡出和淡入<br><br>解释下淡出效果的含义:就在是音乐播放即将结束之前通过一定的手法控制音乐响度-直至结束。<br><br>很显然，使用线性关系基本可以达到目的<br>假定数据关系为y = kx + b;<br>另外需要控制淡出的坡度,或者直接说需要知道从结束之前多少个数据开始需要使用FadeOut音效。所以我们需要一个参数len。<br>假定我们使用下列的一句话算法来说明问题:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;len&nbsp;;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;bufer[i]</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b;</span></div>
其中a,b为待定参数<br>因为有一个前提:当i = len-1的时候buffer[len-1] = 0;<br>所以有a=len-1<br>另外当fadeout发挥作用之前buffer数据并未变化，故有<br>b=(len-1)<br>故基本的Fadeout核心算法就是一句:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">t</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k)</span></div>
简单吧。<br>理所当然<br>基本的FadeIn核心算法就是<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">y</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span></div>
<p>虽然在具体场合，算法有所变形，但是基本的原理就是这个样子<br><br>PS:基本的函数关系虽然简单，但是比较实用</p>
<p>以后有空还会讲Echo,Reverb,Treble Booster,Compressor,High Filter等音效原理<br>。只是研究音效的同志们不多。没的讨论<br>&nbsp;</p>
<img src ="http://www.cppblog.com/gaimor/aggbug/146148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-10 23:14 <a href="http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GUI库分块</title><link>http://www.cppblog.com/gaimor/archive/2011/05/06/145856.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Fri, 06 May 2011 14:44:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/06/145856.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145856.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/06/145856.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145856.html</trackback:ping><description><![CDATA[嗯&nbsp;GUI库应该分为几个大的模块呢? :)我想<br><br>这次的GUI库我会采用类似GUICHAN的方式，具体的GUI并不依赖于特定的图形接口，而是采取插件的方式动态加载，这样有助于提高其使用的广度<br>应该包含一个GUIRender<br><br>另外GUI库涉及面比较广，需要有大量附加的数据结构比如XML，图形处理，向量，插件，基本对象，日志等。我们应该再加一个辅助库<br>于是有一个叫做Util的东西<br><br>其次我们主要的GUI库类<br>这个是核心<br>我暂时给他起个名字叫coregui吧<br>这个是这个GUi的核心<br>其功能除了一般的GUI控件对象之后还应该有控件工厂，控件池(管理器)，控件数据串行化，控件布局，控件编辑，控件动态加载，脚本处理等功能（想想功能还比较多-不过总比之前做的游戏引擎量要小很多）<br><br>分块就这么几个了<br><br>在开发过程中，我会一个一个GUI对象都贴上来，然后说明为什么要这样做，并附上可能对应的设计模式（要活学活用(⊙v⊙)?）<br><br>PS:其实一个比较好的办法是借助于UML，可是我现在忘了这几个字母如何写，有空学学吧 
<img src ="http://www.cppblog.com/gaimor/aggbug/145856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-06 22:44 <a href="http://www.cppblog.com/gaimor/archive/2011/05/06/145856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GUI库设计前奏</title><link>http://www.cppblog.com/gaimor/archive/2011/05/05/145778.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 05 May 2011 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/05/145778.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145778.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/05/145778.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145778.html</trackback:ping><description><![CDATA[<p>早在2008年底我就想做一套完整的GUI库，搞笑的是当时我以为游戏中的所有控件都是</p>
使用win32做的。看了Opengl游戏编程附带的代码，才搞清楚了不是这个样子的滴(感觉当时很肤浅哈哈)<br><br>之后我就打算自己开发一个玩玩，尽管我很努力，但是水平太菜，做不出来(不过我有一个特点就是说干就干，这点很赞)<br><br>大致到了2009年年底，技术积累达到了一定的高度，也查看了很多的gui库，基本上能够做出来成型的GUI了(至于能不能用，这是一个问题)<br><br>去年中期，才拿出了一个成套的GUI，虽然不是特别好，但是基本能用，另外对GUI各块机理也有了很好的认识（比如字体渲染，控件架构，对象序列化，事件处理等）<br><br>但是这块有几个问题：<br>1。对象序列化是基于模板的，这块有益处也有弊端<br>2。只能支持控件换肤，不能支持完备的控件序列化<br>3。.做出来的控件太丑了-不具有漂亮的脸蛋<br><br>现在决定做一个独立，开源，完备，漂亮，方便，易用，容扩展的一个GUI<br>说他独立:是考虑把这个做成一个类似于个人做的音频引擎，不依赖于游戏引擎<br>说他开源:这个好解释<br>说他漂亮:就是做出来的界面一定要美观，否则就是一坨屎<br>说他易用:是指容易使用，包括支持控件资源皮肤资源等<br>说他易扩展:是指其由若干模块构成，容易增加新的接口，不依赖于具体渲染API和平台<br>当然编辑器也应该有的<br><br>在开发过程中将详细讲解GUI开发中遇到的各类问题,包括所有控件，接口，事件处理，对象布局，设计的设计模式等细节<br><br>同时尽可能得附上代码<br>如果感觉写的不对请随时指正<br><br>另外:今年看了大量的QT和Android例子，吸收了不少养分<br>关于开发时间:慢慢来吧，兴趣所致，走走看吧<br><br>之前开发的引擎不打算再做了，涉及面太大，精力太少<br>在可预见的时间内，我想继续维护音频API，GUI库和另外一个软件<br>
<img src ="http://www.cppblog.com/gaimor/aggbug/145778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-05 22:52 <a href="http://www.cppblog.com/gaimor/archive/2011/05/05/145778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程二:Tremolo音效</title><link>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 26 Apr 2011 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145089.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145089.html</trackback:ping><description><![CDATA[接上文.<br>Tremolo音效比较酷的音效，听上去感觉是使用电子乐器演示的。<br>从感官上将Tremolo(颤音)音效是重击一个音符然后快速提高，减小音量<br><br>下面是颤音音效的几个参数:<br>1.深度控制:用来控制音量增减速度<br>2.阈值数据:说明控制音量的频率值<br>3.波形<br><br>其基本数学表达式为:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;data&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;sin(k</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;index));</span></div>
<br>简易的c++代码如下:<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Tremolo&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;def_depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;def_rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;k;<br>&nbsp;&nbsp;&nbsp;&nbsp;Tremole();<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;_data)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;data.size();i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]&nbsp;</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;sin(</span><span style="COLOR: #000000">2.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;PI&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;k);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;data;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br>};</span></div>
当然有java版本的化应该是如下这个样子:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Tremolo&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;def_depth&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;def_rate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;def_depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;def_rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;Tremolo()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;Filter(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;_data)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data.length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[len];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">depth</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Math.Sin(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Math.PI</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rate</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ret;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
基本的源码就这个样子<br>不过有一个问题就是播放音效有少许杂音-不过不是大问题
<img src ="http://www.cppblog.com/gaimor/aggbug/145089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-04-26 22:42 <a href="http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程(1)-Distortion音效</title><link>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 25 Apr 2011 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145002.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145002.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145002.html</trackback:ping><description><![CDATA[<p>之前做的音频API都是使用的第三方的库或者代码<br>不过这段时间一直比较忙<br>没什么时间来玩玩音频引擎了<br><br>不过为了不至于本博客长草<br>我就整理下以前接触过的音频处理这块吧<br><br>首先上一个简单的音效基类吧</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">AudioEffect(){}<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;data)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;<br>};</span></div>
<br>通过调用Filter就可以获取给定pcm处理后的音效数据<br><br>然后再谈下什么是Distortion音效<br>Distortion主要使用于电吉他等电子类乐器，<br><br>Distortion音效主要有以下参数:<br>1.edge 临界值<br>2.gain 增益<br>3.低通剪切值(当然还有其他几个参数,...)<br><br>其简易化的音效处理原则就是<br>使用使用给定临界值对原有数据做Clamp处理<br><br>简单的例子如下:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DISTORTION_RATE&nbsp;100.0</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DISTORTION_THRESHOLD&nbsp;0.4</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Distortion&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Distortion()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DISTORTION_RATE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DISTORTION_THRESHOLD;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;data_)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;data_.size();&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;data_[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">gain;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(v&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(v&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(v);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reutrn&nbsp;data;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;gain;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;value;<br>};</span></div>
<br>看上去似乎很简单<br><br>那处理后的音效如何? 试试就知道了<br><br>接下来还有reverb,ring,echo,chorus等音效算法和音频傅里叶变换等<br>等弄完了这些，音频引擎也就该升级了(我早已构思好了下个版本的音频API功能了)<br><br>下篇tremolo音效
<img src ="http://www.cppblog.com/gaimor/aggbug/145002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-04-25 22:48 <a href="http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏音频引擎(Gaimo Audio Library)新版开发计划O(∩_∩)O~</title><link>http://www.cppblog.com/gaimor/archive/2011/03/01/140933.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 01 Mar 2011 11:24:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/03/01/140933.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/140933.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/03/01/140933.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/140933.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/140933.html</trackback:ping><description><![CDATA[本着严肃,认真的态度 打算开发新版的Gaimo Audio Library(版本一定要大于2.0.0)<br>打算重新书写所有内容<br>基本考虑如下:<br>1.不再使用openal音频库,也不打算使用Dsound代替之<br>而打算使用winmm(这样接近底层,win32下)<br>2.不再声称支持各种格式的音频文件而使用自定义音频格式或者使用pcm或wav格式<br>3.新版SDK可能增加一个简单的audio convertor以方便转换音频格式<br>4.新版SDK将增加打算的音频音效算法(reverb,ring等.)<br>5.使用c++书写,基于c借口以方便跨语言使用者<br>6.良好的跨平台特性<br>7.以fmod为目标<br><br>题外话:<br>如果你对这个感兴趣可以联系我以作为一个业余爱好<br>(仅仅业余的:-O)<br><br> <img src ="http://www.cppblog.com/gaimor/aggbug/140933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-03-01 19:24 <a href="http://www.cppblog.com/gaimor/archive/2011/03/01/140933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEngine.2.4.0开发纪要</title><link>http://www.cppblog.com/gaimor/archive/2010/11/11/133327.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 11 Nov 2010 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/11/11/133327.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/133327.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/11/11/133327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/133327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/133327.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">1</span><span style="color: #000000;">.原DLL分为2个gcore和device(这样可以在其他软件中使用前者)<br></span><span style="color: #000000;">2</span><span style="color: #000000;">.支持xp,vista,win7,linux操作系统<br></span><span style="color: #000000;">3</span><span style="color: #000000;">.支持msvc7.</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">8.0</span><span style="color: #000000;">,</span><span style="color: #000000;">9.0</span><span style="color: #000000;">,mingw,bcb,dev</span><span style="color: #000000;">++</span><span style="color: #000000;">,codeblock编译器系列<br></span><span style="color: #000000;">4</span><span style="color: #000000;">.提供方便易用的xml序列化框架一个<br></span><span style="color: #000000;">5</span><span style="color: #000000;">.提供可插式图形插件接口<br></span><span style="color: #000000;">6</span><span style="color: #000000;">.移除原有的RefPtr对象改用boost系列智能指针<br></span><span style="color: #000000;">7</span><span style="color: #000000;">.移除原有的Manager对象<br></span><span style="color: #000000;">8</span><span style="color: #000000;">.修改了filesystem接口<br></span><span style="color: #000000;">9</span><span style="color: #000000;">.在UI中增加了栅格主题,UI工厂,UI_ProgressBar增加了进度的显示<br></span><span style="color: #000000;">10</span><span style="color: #000000;">.粒子系统中增加了粒子工厂<br></span><span style="color: #000000;">11</span><span style="color: #000000;">.移除了原有的Cursor类<br></span><span style="color: #000000;">12</span><span style="color: #000000;">.移除线程类对象(改用boost&nbsp;thread.)<br></span><span style="color: #000000;">13</span><span style="color: #000000;">.增加了Helper文件以方便用户<br></span><span style="color: #000000;">14</span><span style="color: #000000;">.增加了Sprite2对象</span></div>
<br><img src ="http://www.cppblog.com/gaimor/aggbug/133327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-11-11 16:45 <a href="http://www.cppblog.com/gaimor/archive/2010/11/11/133327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫音频SDK1.6.0来了</title><link>http://www.cppblog.com/gaimor/archive/2010/10/26/131297.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 26 Oct 2010 00:57:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/10/26/131297.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/131297.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/10/26/131297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/131297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/131297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->【基本介绍】盖莫音频引擎SDK1.6.0(类似fmod音频api)原本为盖莫游戏引擎开发当前支持win7,xmp,vista操作系统支持10种音频格式:mp3,ogg,wav,au,aiff,mod,it...&nbsp;&nbsp;<a href='http://www.cppblog.com/gaimor/archive/2010/10/26/131297.html'>阅读全文</a><img src ="http://www.cppblog.com/gaimor/aggbug/131297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-10-26 08:57 <a href="http://www.cppblog.com/gaimor/archive/2010/10/26/131297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI设计概要4:UI基件</title><link>http://www.cppblog.com/gaimor/archive/2010/10/20/130630.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Wed, 20 Oct 2010 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/10/20/130630.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/130630.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/10/20/130630.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/130630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/130630.html</trackback:ping><description><![CDATA[接上篇 <br>我们接着说UI部分的控件基类<br>控件基类应该具备的要素<br>1.按名生成<br>2.控件尺寸<br>3.控件大小<br>4.控件状态<br>5.对消息事件的处理<br>6.控件渲染<br>7.控件检测<br>8.控件文本<br>然后具体代码如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义UI控件基类<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;UI_Widget&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;SlotHolder,</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;UI_EventHandler,</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_EventListener</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;UIEventListener;<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_EventListener</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">::iterator&nbsp;UIEventListenerItr;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;窗体构造和析构<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">explicit</span><span style="color: #000000;">&nbsp;UI_Widget(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL,</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_wstring</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">widget</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">UI_Widget();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取,设置设置窗体文本<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_wstring&nbsp;GetText()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;text_;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetText(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_wstring</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;text);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;窗体大小和尺寸<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;&nbsp;GetSize()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;SetSize(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Size</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;size);<br>&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;GetPosition()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;SetPosition(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Point</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;point);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取窗体推荐大小<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;Size&nbsp;GetRecommendedSize()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;检测给定点下控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetWidgetBelow(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取本控件的顶层控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetTopWidget()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取,设置父窗体<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetParentWidget()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;SetParentWidget(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;parent);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;设置,获取控件边框<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetBorder(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_AbstractBorder</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;border);<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_AbstractBorder</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetBorder()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;设置,获取是否渲染边框<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetBorderVisible(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;visible);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;IsBorderVisible();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;增加,移除事件消息<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddEventListener(UI_EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RemoveEventListener(UI_EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;消息处理<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Process(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;UI_Event</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;焦点函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;IsFocusOn()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetFocusOn(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;focus);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ChangedFocusOn();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;设置,检测是否为活动控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetAsActiveWidget();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;IsActiveWidget()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;检测控件层次关系<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;DoesHierarchyContain(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widget)</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;显示,隐藏窗体<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetVisible(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;visible);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Show();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Hide();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;IsVisible()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;窗体状态函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;IsEnable(){enabled_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Disable(){enabled_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;IsEnabled()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;enabled_;}<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;窗体渲染<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Render();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;当窗体关闭的时候发射信号<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Signal0&nbsp;closed_;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;窗体数据载入<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Load(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;file,</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;widget);<br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;执行函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnResize(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnMove(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnTextChanged(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnShow(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnHide(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnGainedFocus(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnLostFocus(){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnDraw(){}<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_;<br>&nbsp;&nbsp;&nbsp;&nbsp;UIEventListener&nbsp;&nbsp;&nbsp;&nbsp;message_listeners_;<br>&nbsp;&nbsp;&nbsp;&nbsp;engine_wstring&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text_;<br>&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_;<br>&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position_;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visible_;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled_;<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_AbstractBorder</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;border_;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border_visible_;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(UI_Widget)<br>};<br><br>}<br><br>#ifdef&nbsp;G_COMPILER_MSVC<br>#pragma&nbsp;warning(pop)<br></span><span style="color: #0000ff;">#endif</span></div>
<br>需要说明的就是这里有3个父类<br>一个是Object<br>一个是SlotHolder这是消息桩<br>另外一个是UI_EventHandler负责对事件的处理<br><br>需要说明的是UI_Widget总是和UI_WidgetManager配合使用的<br>毕竟UI上下文最大只能有一个活动控件<br><img src ="http://www.cppblog.com/gaimor/aggbug/130630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-10-20 18:19 <a href="http://www.cppblog.com/gaimor/archive/2010/10/20/130630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI设计概要3:UI事件</title><link>http://www.cppblog.com/gaimor/archive/2010/10/04/128570.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 04 Oct 2010 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/10/04/128570.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/128570.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/10/04/128570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/128570.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/128570.html</trackback:ping><description><![CDATA[接上文:http://www.cppblog.com/gaimor/archive/2010/09/30/128134.html
<br>本文我们接着说UI库的消息事件部分:<br>1.UI基本事件类型<br>&nbsp; 基本上就下面几种:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;枚举UI消息类型<br></span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #0000ff;">enum</span><span style="color: #000000;">&nbsp;UI_EVENT<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;鼠标移动</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_MOUSE_MOVE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;鼠标点击</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_MOUSE_CLICK,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;鼠标进入</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_MOUSE_ENTERED,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;鼠标退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_MOUSE_EXITED,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;鼠标滚轮事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_MOUSE_WHEEL,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;字符输入</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_CHAR_INPUT,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;键盘按键</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_KEY_PRESS,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;按键退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_KEY_RELEASE,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;焦点事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_LOST_FOCUSE,<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_GAIN_FOCUSE,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;滑块事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_SLIDER_MOVE,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;编辑事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_EDIT,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;选择,反选择</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_SELECTED,<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_EVENT_DESELECTED<br>};</span></div>
2.<br>关于事件一般就3个相关对象:<br>事件,消息听者和消息处理对象3个单元块:<br>如下所示:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义引擎事件基类模板<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;EventType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Event&nbsp;:&nbsp;NonCopyable<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;事件基类构造函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Event(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;EventType</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;type):type_(type){}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;事件基类析构函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Event(){}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取事件类型<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;EventType&nbsp;GetEventType()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;type_;}<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;数据成员变量<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;EventType&nbsp;type_;<br>};<br><br></span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义事件听者基类<br></span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Event,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Target</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;EventListener<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;事件听者虚析构函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">EventListener(){}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;消息派送<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Dispatch(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Event</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;message,Target&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>};<br><br></span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义事件处理者基类<br></span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Event,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;EventListener</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;EventHandler<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;事件听者虚析构函数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">EventHandler(){}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;消息处理<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Process(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Event</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;message){</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;增加,移除事件消息<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddEventListener(EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener){}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RemoveEventListener(EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener){}<br>};</span></div>
然后便是模板实例:<br>typedef Event&lt;UI_EVENT&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UI_Event;<br>typedef EventListener&lt;UI_Event,UI_Widget*&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UI_EventListener;<br>typedef EventHandler&lt;UI_Event,UI_EventListener*&gt; UI_EventHandler;
<br>说实话可以不这样做而是用boost::function之类的函数绑定<br>但是没法子这样写我习惯了 呵呵<br>2.下面是UI事件的承接部分:<br>通过UI管理器承接输入输出系统的消息响应:<br>{<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;盖莫GUI管理器<br></span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;UI_WidgetManager&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;UI_EventListenerImpl</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;按键处理<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseLeftDown(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseLeftUp(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseMiddleDown(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseMiddleUp(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseRightDown(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseRightUp(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseMove(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnChar(wchar_t&nbsp;code);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnKeyDown(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;code);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnKeyUp(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;code);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;OnMouseWheel(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;z);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:</span></div>
3.事件生成:<br>以上2部分分别是UI事件对象系列和UI事件输入部分<br>下面设计UI事件的生成<br>无论是鼠标还是键盘事件实际上都相当于生成了一个新的事件<br>举例如下:<br>OnMouseLeftDown(int x,int y)
<br>如果该函数被调用<br>那么就说明鼠标的左键被点击同时我们还知道了点击的位置坐标<br>这样就生成了一个UI_MouseClickEvent
对象<br>不过这里需要考虑是鼠标双击还是单击<br>这就要考虑本次点击和上次点击的时间间隔了<br>这样就生成了一个UI鼠标事件<br>那本事件应该传给谁?<br>应该是目标对象<br>直观一点应该是传给鼠标当前位置下的控件对象<br>但是考虑到实际情况<br>这里有一个聚焦控件和活动控件的概念<br>比如说我们打开一个对话框(这是一个聚焦控件)<br>对话框上有1个按键<br>当用户点击本按键则消息发送给这个按键了<br>但是当鼠标移出对话框之外<br>一般情况其他控件此时处于非活动状态<br>消息应该发送给聚焦控件<br>所以这里至少有3各类型的控件指针分别为:聚焦控件,活动控件以及鼠标下控件(当然他们可以是同一控件)<br>在这里需要说明这三个控件是这样切换的<br>如果发生特定的uI事件则修改当前的聚焦控件等对象了<br>4.具体控件对消息的处理:<br>&nbsp;&nbsp; 生成特定消息,并发送给相应的控件对象之后那么控件就需要相应该消息了:<br>控件对象的相关函数:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义UI控件基类<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;UI_Widget&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;SlotHolder,</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;UI_EventHandler,</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_EventListener</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;UIEventListener;<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_EventListener</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">::iterator&nbsp;UIEventListenerItr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RemoveEventListener(UI_EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;消息处理<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Process(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;UI_Event</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">)</span></div>
在这里我们通过Process函数来接受UI管理器传过来的消息对象.<br>这里是想要的处理<br>注意我们并不直接根据消息响应控件的各种状态!<br>而是通过迭代消息听者链表的<br>如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;UI_Widget::Process(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;UI_Event</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(IsVisible()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;IsEnabled())<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIEventListenerItr&nbsp;it;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;message_listeners_.begin();it&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;message_listeners_.end();</span><span style="color: #000000;">++</span><span style="color: #000000;">it)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI_EventListener</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;listener&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">it;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ret&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;listener</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Dispatch(</span><span style="color: #0000ff;">event</span><span style="color: #000000;">,</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;处理控件边框事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(border_)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border_</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Process(</span><span style="color: #0000ff;">event</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ret;<br>}</span></div>
当消息传来之后我们并不能确定这就是本控件所需要的消息需要验证它<br>如何验证?<br>就看当前控件是不是可显示和活动的咯<br>同时如何控件有边框对象我们则把消息发给它以改变可能的边框外观<br><br>下篇:UI设计概要4:UI控件对象<br><br><img src ="http://www.cppblog.com/gaimor/aggbug/128570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-10-04 16:46 <a href="http://www.cppblog.com/gaimor/archive/2010/10/04/128570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI设计概要2:UI组件</title><link>http://www.cppblog.com/gaimor/archive/2010/09/30/128134.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 30 Sep 2010 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/09/30/128134.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/128134.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/09/30/128134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/128134.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/128134.html</trackback:ping><description><![CDATA[接上文:http://www.cppblog.com/gaimor/archive/2010/09/27/127900.html
<br>第一篇是关于UI布局管理器的文章<br>本文主要说说引擎UI部分组件的问题<br>在这里UI组件是指UI中的各个基础模块而非UI控件也<br>在本引擎之中当前UI组件有以下几个基础单元<br>1.UI_Widget UI控件的基类<br>2.UI_AbstractBorder UI控件边框类<br>3.UI_AbstractLayouter UI布局管理器类<br>4.UI_Event/UI_EventHandler,UI_EventListerner UI事件处理家族<br>5.UI_Brush UI库画笔(当前基于OpenGL)<br>6.UI_AbstractTheme UI库控件主题<br>7.UI_ProptyScheme UI库主题对象<br>8.UI_WidgetManager UI库管理器<br>9.UI_Factory UI库工厂对象<br>10.其他通用对象<br>以上所有对象构成了UI库的框架<br>下面说下各个部分的功能<br>1.UI_Widget UI基本控件 所有控件的基类 <br>2.UI_AbstractBorder 控件控件对象边框外观<br>3.UI_AbstractTheme 控件主题<br>&nbsp;&nbsp;&nbsp;&nbsp; 以上3着构成所见控件外观<br>每一个控件都有一个主题和边框对象<br>所有同质控件都采用统一的控件主题以保证统一的外观<br>当前UI_Border设计了2中 一种为线性边框一种为状态边框<br>当前主题设计了3中分别为简单主题,位图主题和矩形主题<br>UI布局管理器上文已经说过当前不再赘述<br>UI事件处理这块内容比较多 下文说吧<br>UI画笔的作用是绘制对象元素比如绘制线条,矩阵设置颜色等等很简单的咯<br>UI_PertptyShceme是一个控件主题的集合包含了所有控件类型的主题<br>在渲染控件的时候调用对等的主题绘制控件<br>控件管理器是UI库的中枢<br>负责统一渲染队列控件和调度输入输出事件<br>关于UI工厂则负责按名生成控件指针咯<br><br>我一直力图把UI库的实际简单化<br>但是总是做不到<br>而且越做越复杂的<br><br>注意当前并没有涉及脚本,<br>UI编辑器以及完成所有控件对象的开发<br>关于脚本我想采用得到脚本有lua,anglescrip或者自定义脚本<br>关于编辑器我想采用wxwidget or qt<br>虽然很慢但是我一直在努力 呵呵<br><br>下篇:UI设计概要3:UI消息<br><br><br><br><img src ="http://www.cppblog.com/gaimor/aggbug/128134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-09-30 15:29 <a href="http://www.cppblog.com/gaimor/archive/2010/09/30/128134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI设计概要1:控件布局管理器</title><link>http://www.cppblog.com/gaimor/archive/2010/09/27/127900.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 27 Sep 2010 12:09:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/09/27/127900.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/127900.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/09/27/127900.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/127900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/127900.html</trackback:ping><description><![CDATA[一直想把引擎的UI部分做强做大可是发现这个难度还是不小<br>所以只能一步一步蚕食之<br>一步一步来吧<br>先说下控件布局管理器吧<br>布局管理器的目的是按照一定规则排列控件于给定范围内<br>这是其基本目的<br>很显然基本的布局管理对象应该包含以下2个基本功能<br>1.控件的加入和删除<br>2.应用布局管理器<br>当然也可以有其他附加功能<br>比如获取控件个数等等<br>所以我把抽象控件布局对象设计如下:<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义引擎UI布局管理器<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;UI_AbstractLayouter&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">UI_Widget</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;Widgets;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_AbstractLayouter();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">UI_AbstractLayouter();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;布局管理器加载控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddWidget(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widget);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;布局管理器移除控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RemoveWidget(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widget);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;布局管理器移除所有子控件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RemoveAllWidget();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;布局管理器控件排列<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">////////////////////////////////////////////////////////////<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ApplyLayouter(UI_Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;parent)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Widgets&nbsp;&nbsp;widgets_;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(UI_AbstractLayouter)<br>};</span></div>
<br>然后就是具体的几种布局管理器对象了<br>下面是我当前弄的4种布局管理器了<br>分别为:<br>UI_FlowLayouter<br>&nbsp;&nbsp;&nbsp; 流式布局管理的布局策略是从左到右依次设定控件位置如果超出父控件则按照设定的竖直布局换行重新布局（注意它并不改变控件的大小）<br>UI_GridLayouter<br>&nbsp;&nbsp;&nbsp; 格子布局管理的策略则是工具设定布局间隔和子控件,父亲控件个数重写设置所有的子控件大小(这样所有的子控件大小就一样了)然后把所有的子控件放置在一个一个的格子中<br>UI_VLayouter<br>&nbsp;&nbsp; UI_VLayouter和UI_HLayouter则是我从QT中借鉴来的<br>&nbsp;&nbsp; IU_VLayouter把所有子控件按照从上到下的方式依次布局(不改变子控件大小)(可能会超出父控件喔)<br>UI_HLayouter<br>&nbsp;&nbsp; 这个就不说了<br><br>当然还可以定制其他布局管理器了<br>&nbsp;&nbsp; 比如UI_DockLayouter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UI_CenterLayouter等等基本原理都是一样的<br><br>做了游戏引擎这么久说实话<br>UI真是一个大块头<br>对于UI我的设计理念就是使用简单,功能丰富<br><br>题外话1:08年11月的时候我就想设计一套UI库<br>之前认为游戏UI是使用windows API话的 呵呵<br>题外话2:网上关于使用一些UI库的例子很多但是关于设计UI库的例子似乎不多<br>题外话3:说实话我觉得写博客是交流思想共同探讨而非其他<br><br><br><br><img src ="http://www.cppblog.com/gaimor/aggbug/127900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-09-27 20:09 <a href="http://www.cppblog.com/gaimor/archive/2010/09/27/127900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用盖莫游戏引擎做的渲染到纹理的例子</title><link>http://www.cppblog.com/gaimor/archive/2010/09/17/126901.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Fri, 17 Sep 2010 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/09/17/126901.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/126901.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/09/17/126901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/126901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/126901.html</trackback:ping><description><![CDATA[首先上代码吧<br>个人感觉写的很清爽<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">!==========================================================================<br>&nbsp;*<br>&nbsp;*&nbsp;&nbsp;盖莫游戏引擎(GaiMo&nbsp;Game&nbsp;Engine)<br>&nbsp;*<br>&nbsp;*&nbsp;&nbsp;版权所有&nbsp;(C)&nbsp;2009-2009&nbsp;成都盖莫软件技术工作室&nbsp;保留所有权利<br>&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(C)&nbsp;成都盖莫软件技术工作室.&nbsp;&nbsp;All&nbsp;Rights&nbsp;Reserved.<br>&nbsp;*<br>&nbsp;*&nbsp;&nbsp;了解更多情况,请访问&nbsp;</span><span style="COLOR: #008000; TEXT-DECORATION: underline">http://www.gaimo.net</span><span style="COLOR: #008000"><br>&nbsp;***************************************************************************</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;本demo测试引擎渲染到纹理功能</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">GEngine</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">Header_Config.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;core;<br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;FRAME_NUMBER&nbsp;12</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;定义图形纹理指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">core::Texture</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;texture_ptr[FRAME_NUMBER];<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;渲染到纹理指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Renderable</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;rendertotexture;<br>core::TextDesc</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>Matrix4f&nbsp;mat;<br></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;pos[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;length[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;CreateTexture();<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;InitCamera();<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;Render();<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;窗体描述符</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ScreenDesc&nbsp;desc;<br>&nbsp;&nbsp;&nbsp;&nbsp;desc.name_&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RenderToTextureTest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;生成窗体</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Screen</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;screen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateScreen(desc);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;生成纹理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CreateTexture();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;初始化摄像机</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;InitCamera();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(screen</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsOpen())<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Render();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;DestroyScreen();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;EXIT_SUCCESS;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;构造纹理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CreateTexture()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;载入资源包</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_FILESYSTEM_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">RegisterPackage(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\package\\logo.zip</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">core::ReadFile</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;imagefile;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Image</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;image[FRAME_NUMBER];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;FRAME_NUMBER&nbsp;;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagefile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GLOBAL_FILESYSTEM_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetRead(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">logo.jpg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GLOBAL_IMAGEMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateImage(name,imagefile);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;反色</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetInvertImage();<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;水平翻转</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">FlipImage(Image::IMAGE_FLIP_X);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;竖直翻转</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">FlipImage(Image::IMAGE_FLIP_Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;Gamma调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustGamma(</span><span style="COLOR: #000000">0.4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;亮度调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustBrightness(</span><span style="COLOR: #000000">0.4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;对比度调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustContrast(</span><span style="COLOR: #000000">0.6</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;翻转</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">FlipImage(Image::IMAGE_FLIP_XY);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;旋转</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">RotatedImage(Image::IMAGE_ROTATE_90);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;Gamma调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustGamma(</span><span style="COLOR: #000000">0.1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;亮度调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustBrightness(</span><span style="COLOR: #000000">0.8</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;对比度调整</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;image[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AdjustContrast(</span><span style="COLOR: #000000">0.3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateTexture2(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">),image[</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">]);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;FRAME_NUMBER;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;纹理构建</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetObject(ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(i))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Generate();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;core::TextDesc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\package\\accid.ttf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,Color::Cyan);<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetText(engine_wstring(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maker:gaimosoft,ccsdu2004@yahoo.com.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;获取渲染到纹理指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rendertotexture&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetRenderToTexture(</span><span style="COLOR: #000000">640</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">480</span><span style="COLOR: #000000">,GL_RGBA,GL_FLOAT);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_DEPTH_TEST);<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;InitCamera()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Camera</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;orthocamera&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GLOBAL_CAMERAMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateCamera(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">orthocamera</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;orthocamera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetOrtho(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">640</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">480</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1.2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0.8</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Camera</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;camera&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GLOBAL_CAMERAMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetActiveCamera();<br>&nbsp;&nbsp;&nbsp;&nbsp;camera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetViewPort()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Render();<br>&nbsp;&nbsp;&nbsp;&nbsp;camera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetPerspective(</span><span style="COLOR: #000000">45.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">640.0f</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">480.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">600.0f</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;camera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetPosition(Vector3f(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;camera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetView(Vector3f());<br>&nbsp;&nbsp;&nbsp;&nbsp;camera</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ApplayProjectMatrix();<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RenderTexture()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;texturename;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;FRAME_NUMBER;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texturename&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ToString</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetObject(texturename)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AttachRenderTarget();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI_Brush::RenderTexture((i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">160</span><span style="COLOR: #000000">,(i</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">160</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">160</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">160</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;处理鼠标响应</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MouseCheck()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F1))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F2))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F3))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RenderText()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_Brush::PreRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;offset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Render(Rectf(offset,</span><span style="COLOR: #000000">460</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(offset&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">600</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;UI_Brush::PostRender();<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RenderToTexture()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;rendertotexture</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">BeginRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Clear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;GL_DEPTH_BUFFER_BIT);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_CAMERAMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">orthocamera</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ApplayProjectMatrix();<br>&nbsp;&nbsp;&nbsp;&nbsp;RenderTexture();<br>&nbsp;&nbsp;&nbsp;&nbsp;RenderText();<br>&nbsp;&nbsp;&nbsp;&nbsp;rendertotexture</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AfterRender();<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RenderToScreen()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Clear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;GL_DEPTH_BUFFER_BIT);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_CAMERAMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetActiveCamera()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ApplayProjectMatrix();<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_CAMERAMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetActiveCamera()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ApplayViewMatrix();<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">DrawCube(pos,mat.ptr(),length);<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Render()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;MouseCheck();<br>&nbsp;&nbsp;&nbsp;&nbsp;RenderToTexture();<br>&nbsp;&nbsp;&nbsp;&nbsp;RenderToScreen();<br>}<br></span></div>
<br>基本步骤就是生成窗体<br>初始化摄像机<br>生成纹理<br>渲染到纹理<br>渲染到窗体<br>完了<br><br>图图如下:<br>似乎我比较喜欢贴立方体啊 呵呵<br><img height=512 alt="" src="http://www.cppblog.com/images/cppblog_com/gaimor/render_to_texture.jpg" width=646 border=0>
<img src ="http://www.cppblog.com/gaimor/aggbug/126901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-09-17 18:22 <a href="http://www.cppblog.com/gaimor/archive/2010/09/17/126901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏引擎-视频播放</title><link>http://www.cppblog.com/gaimor/archive/2010/09/09/126257.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 09 Sep 2010 10:38:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/09/09/126257.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/126257.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/09/09/126257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/126257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/126257.html</trackback:ping><description><![CDATA[重新修改了引擎的视频播放这块<br>并把视频等几个模块做成了插件的形式<br>具体代码和截图如下:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;本代码测试引擎视频播放,插件系统,键盘测试和立方体绘制</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">GEngine</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">Header_Config.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br>Matrix4f&nbsp;mat;<br></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;pos[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;length[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;offset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;core;<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MouseCheck();<br><br>VideoPlayer</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;video_player_instance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ScreenDesc&nbsp;desc;<br>&nbsp;&nbsp;&nbsp;&nbsp;desc.name_&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">VideoPlayerTest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;RefPtr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Screen</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;screen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateScreen(desc);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetPluginFolder(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\plugin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">InstallPlugin();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;VideoPlayerFactory&nbsp;factory;<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">RegisterPluginFactory(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">factory);<br>&nbsp;&nbsp;&nbsp;&nbsp;factory.SetData(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,screen</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetHDC());<br>&nbsp;&nbsp;&nbsp;&nbsp;factory.SetData(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,screen</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetHGLRC());<br>&nbsp;&nbsp;&nbsp;&nbsp;video_player_instance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.Create();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;core::TextDesc</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;core::TextDesc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\package\\accid.ttf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,Color::Cyan);<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetText(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maker:gaimosoft,ccsdu2004@yahoo.com.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;video_player_instance</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Play(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\package\\video.mp4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(screen</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsOpen())<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Clear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;GL_DEPTH_BUFFER_BIT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;video_player_instance</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AttachThreadRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Clear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;GL_DEPTH_BUFFER_BIT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;video_player_instance</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetFrame();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_TEXTUREMANAGER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">BindTexture2(id);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">DrawCube(pos,mat.ptr(),length);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI_Brush::PreRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Render(Rectf(offset,</span><span style="COLOR: #000000">460</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(offset&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">600</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI_Brush::PostRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_RENDERER_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">DetachThreadRender();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MouseCheck();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;video_player_instance</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Stop();<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;text;<br>&nbsp;&nbsp;&nbsp;&nbsp;DestroyScreen();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;EXIT_SUCCESS;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">!&nbsp;处理鼠标响应</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MouseCheck()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F1))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F2))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(GLOBAL_INPUT_PTR</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsPressedKey(KEY_F3))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">mat.Rotate((rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">900.0f</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>这次并没有做成全窗体播放的样子而是从播放器获取纹理标识<br>然后再渲染之 这样可以作出满意的样子了<br>截图为:<br><br><img height=512 alt="" src="http://www.cppblog.com/images/cppblog_com/gaimor/video1_.jpg" width=646 border=0><br>1.<br><img height=512 alt="" src="http://www.cppblog.com/images/cppblog_com/gaimor/video2_.jpg" width=646 border=0>
<img src ="http://www.cppblog.com/gaimor/aggbug/126257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-09-09 18:38 <a href="http://www.cppblog.com/gaimor/archive/2010/09/09/126257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏引擎-文件系统</title><link>http://www.cppblog.com/gaimor/archive/2010/08/21/124192.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sat, 21 Aug 2010 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/08/21/124192.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/124192.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/08/21/124192.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/124192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/124192.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文件系统的功能:1.资源包裹2.提供资源载入速度3.资源加密在盖莫游戏引擎中文件系统由读文件,写文件,XML序列化对象,ConfigFile构成文件系统的接口如下:1.读文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/////////////...&nbsp;&nbsp;<a href='http://www.cppblog.com/gaimor/archive/2010/08/21/124192.html'>阅读全文</a><img src ="http://www.cppblog.com/gaimor/aggbug/124192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-08-21 16:26 <a href="http://www.cppblog.com/gaimor/archive/2010/08/21/124192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏引擎-插件系统</title><link>http://www.cppblog.com/gaimor/archive/2010/07/29/121601.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 29 Jul 2010 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/07/29/121601.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/121601.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/07/29/121601.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/121601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/121601.html</trackback:ping><description><![CDATA[插件系统是游戏引擎中一个比较大的子系统<br>
这个系统的目的就是动态增加引擎的功能而不必修改引擎接口<br>
<br>
之前虽然做过插件这块&#8216;<br>
但是感觉设计的不好 <br>
这次总算弄了一个比较完备的插件系统<br>
<br>
相关对象和结构<br>
1.插件 Plugin<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义引擎插件数据结构<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Plugin<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Plugin()<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件重启<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件名字<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件作者<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;maker;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">插件描述<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;description;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件版本<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;&nbsp;vermain;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;&nbsp;versub;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;&nbsp;verpitch;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件类型<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;&nbsp;type;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件合法性标记<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;&nbsp;valid;<br>};<br></span></div>
插件数据结构只包含了插件的一些基本信息 比如名字,描述,作者,功能类型等<br>
<br>2.PluginLoader
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义插件载入类<br></span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PluginLoader<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;构造,析构插件载入<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;PluginLoader();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">PluginLoader();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;载入插件和卸载<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;Load(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">plugin);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;Free();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取插件指定符号地址<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetAddress(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">name);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;检测插件是否合法<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;IsValid()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;handle&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取插件句柄<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetHandle(){</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;handle;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetHandle()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;handle;}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取插件名<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;GetPluginName()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pluginame;}&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle;<br>&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;pluginame;&nbsp;&nbsp;&nbsp;<br>};</span></div>
<br>PluginLoader主要是载入插件文件并获取给定符号的函数指针 <br>
这个并没没有暴漏出来供用户调用
<br>3.PluginFactory
<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义引擎插件工厂基类<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;PluginFactory&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;构造和析构引擎插件工厂基类<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;PluginFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">PluginFactory();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;注册,反注册插件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;ENGINE_CALL&nbsp;RegisterFactory(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;plugin)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ENGINE_CALL&nbsp;UnregisterFacory()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取对应插件类型标识<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;GetPluginType()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(PluginFactory)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>};<br><br></span></div>
插件工厂是一切需要从插件中获取功能的对象工厂<br>她主要提供了插件的注册和反注册以及获取插件工厂所对应的插件类型<br><br>4.PluginManager 插件管理器
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义引擎插件管理器<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;PluginManager<br>{&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取,设置插件目录<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;GetPluginFolder()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetPluginFolder(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;folder);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;插件装载和卸载<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;InstallPlugin();&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;UnstallPlugin();&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;注册,反注册插件工厂<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;RegisterPluginFactory(PluginFactory</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;factory);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;UnregisterPluginFactory(PluginFactory</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;factory);<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取插件个数<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;ENGINE_CALL&nbsp;GetPluginNumber()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取给定索引插件信息<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Plugin&nbsp;ENGINE_CALL&nbsp;GetPluginByType(</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;index)</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取给定索引的插件名<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;engine_string&nbsp;ENGINE_CALL&nbsp;GetPluginNameByType(</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;index)</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取给定插件类型的插件载入类<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;PluginManagerImpl&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">impl;<br>&nbsp;&nbsp;&nbsp;&nbsp;DEFINE_SINGLETON(PluginManager);<br>};<br><br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">!&nbsp;定义插件管理器单件</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;GLOBAL_PLUGINMANAGER_PTR&nbsp;(core::PluginManager::GetInstance())</span></div>
插件管理器是插件系统的核心,充当了插件管理者的角色<br>
要使用插件线需要设置插件目录<br>
然后装载插件<br>
然后注册特定的插件工厂<br>
然后就可以通过插件工厂获取插件对象指针咯<br>
<br>
在这里插件管理器是作为一个单间使用的<br>
具体的宏 DEFINE_SINGLETON(PluginManager); <br>
展开之后为:
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;DEFINE_SINGLETON(SingletonObject)\</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;std::auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SingletonObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;instance;\<br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:\<br>&nbsp;&nbsp;&nbsp;&nbsp;SingletonObject();\<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">SingletonObject();\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;SingletonObject</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetInstance(){\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">instance.</span><span style="color: #0000ff;">get</span><span style="color: #000000;">())\<br>&nbsp;&nbsp;&nbsp;&nbsp;{\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;std::auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SingletonObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SingletonObject());\<br>&nbsp;&nbsp;&nbsp;&nbsp;}\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;instance.</span><span style="color: #0000ff;">get</span><span style="color: #000000;">();\<br>}<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;IMPLEMENT_SINGLETON(SingletonObject)\</span><span style="color: #000000;"><br>std::auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SingletonObject</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;SingletonObject::instance(NULL);</span></div>
下面是具体的一个插件对象---摄像头捕获类<br>
如下:通过调用CaptureImage就可以把摄像头所见程序保存为image了<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义摄像头捕获类(以插件形式提供之)<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;CapturePicture&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;构造和析构<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CapturePicture();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">CapturePicture();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取摄像头图形数据<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;CaptureImage(RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Image</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">image);<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(CapturePicture)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>};</span></div>
<br>
通过调用CaptureImage就可以把摄像头所见程序保存为image了<br>
<br>
下面这个是对于的工厂:
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//<br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;定义摄像头捕获工厂类<br></span><span style="color: #808080;">/////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GAPI&nbsp;CapturePictureFactory&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;PluginFactory<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;构造和析构<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CapturePictureFactory();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">CapturePictureFactory();<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取摄像头捕获指针<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CapturePicture</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Create();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;注册插件<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;ENGINE_CALL&nbsp;RegisterFactory(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;engine_string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;plugin);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ENGINE_CALL&nbsp;UnregisterFacory();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取对应插件类型标识<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//////////////////////////////////////////////////////</span><span style="color: #008000;">/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ushort</span><span style="color: #000000;">&nbsp;GetPluginType()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;PluginLoader</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;loader;<br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_OBJECT(CapturePictureFactory)<br>};</span></div>
这个只是多了一个函数Createer而已<br>
<br>
然后再说具体的插件部分<br>
插件3函数:<br>
extern "C" void&nbsp; &nbsp; GAPI Plugin_Info(Plugin &amp;plugin);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br>
extern "C" Object* GAPI Plugin_Install();<br>
extern "C" void&nbsp; &nbsp; GAPI Plugin_Unstall(void*);&nbsp;&nbsp;<br>
具体为通过Plugin_Info<br>
通过Plugin_Install获取插件实际对象指针<br>
通过Plugin_Unstall卸载插件<br>
<br>
最后一个部分是插件的使用小例子:
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cstdlib</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">GEngine</span><span style="color: #000000;">/</span><span style="color: #000000;">Header.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetPluginFolder(</span><span style="color: #000000;">"</span><span style="color: #000000;">plugin</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">InstallPlugin();<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">插件个数:</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetPluginNumber()</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;core::CapturePictureFactory&nbsp;factory;<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">注册视频捕获插件工厂:</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">RegisterPluginFactory(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">factory)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;core::CapturePicture</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;capturepicture&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;factory.Create();<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">插件工厂产品标识:</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">factory.GetPluginType()</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;core::RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">core::Device</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;device&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;core::InitDevice(</span><span style="color: #000000;">"</span><span style="color: #000000;">插件测试</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">capturepicture)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">生成摄像头捕获指针失败了</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">PAUSE</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;core::RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">core::ResourceManager</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;resmgr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;device</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetResourceManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;core::RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">core::ImageManager</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;imagemanager&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;resmgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetImageManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;core::RefPtr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">core::Image</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;image&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;imagemanager</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">CreateObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">capturepicture</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;capturepicture</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">CaptureImage(image);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">save&nbsp;image&nbsp;is:</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">image</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Save(</span><span style="color: #000000;">"</span><span style="color: #000000;">capture.bmp</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_LOOP(device)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glClearColor(</span><span style="color: #000000;">0.1</span><span style="color: #000000;">,</span><span style="color: #000000;">0.3</span><span style="color: #000000;">,</span><span style="color: #000000;">0.2</span><span style="color: #000000;">,</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glClear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;GL_DEPTH_BUFFER_BIT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;END_LOOP(device)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">UnregisterPluginFactory(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">factory);<br>&nbsp;&nbsp;&nbsp;&nbsp;GLOBAL_PLUGINMANAGER_PTR</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">UnstallPlugin();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">system("PAUSE");</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;EXIT_SUCCESS;<br>}</span></div>
题后话:<br>
当前引擎支持xp,vista,win7环境<br>
在编译器支持vc7.1,vc8,vc9,devc++,codeblock<br>
也许在不久的将来我会弄一个linux版本的
<br><img src ="http://www.cppblog.com/gaimor/aggbug/121601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-07-29 16:40 <a href="http://www.cppblog.com/gaimor/archive/2010/07/29/121601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏引擎-ui-所见即所得-编辑器</title><link>http://www.cppblog.com/gaimor/archive/2010/06/28/118885.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 28 Jun 2010 12:28:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/06/28/118885.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/118885.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/06/28/118885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/118885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/118885.html</trackback:ping><description><![CDATA[先放这里改天写吧!<br><img src ="http://www.cppblog.com/gaimor/aggbug/118885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-06-28 20:28 <a href="http://www.cppblog.com/gaimor/archive/2010/06/28/118885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫音频-API-1.5.5</title><link>http://www.cppblog.com/gaimor/archive/2010/06/24/118658.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 24 Jun 2010 11:57:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/06/24/118658.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/118658.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/06/24/118658.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/118658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/118658.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是最新设计的盖莫音频音频(API)(c++)(1.5.5)当前提供一个简易版本的播放器(使用了Skinse界面库)界面如下:当前提供的功能如下:盖莫音频API1.5.5 功能更为强劲盖莫音频引擎(API) 是使用标准c++写的音频播放软件支持devc++,codeblock,vc6,vc7.1,vc8.,vc9编译器平台支持xp,vista,win7 当前支持ogg,mp3,wav,au,aif...&nbsp;&nbsp;<a href='http://www.cppblog.com/gaimor/archive/2010/06/24/118658.html'>阅读全文</a><img src ="http://www.cppblog.com/gaimor/aggbug/118658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-06-24 19:57 <a href="http://www.cppblog.com/gaimor/archive/2010/06/24/118658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖莫游戏引擎-GUI-小图</title><link>http://www.cppblog.com/gaimor/archive/2010/06/24/118638.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 24 Jun 2010 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2010/06/24/118638.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/118638.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2010/06/24/118638.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/118638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/118638.html</trackback:ping><description><![CDATA[这是刚改动的盖莫游戏引擎-UI小图<br>可以看出 <br>好看了很多<br><br>具体的做法就是每一个控件对象都有一个对于的渲染描述符<br>包含控件边框和控件背景<br><br>当然只有改动控件的描述配置就可以改变控件的外观了(典型的装饰器啊)<br><br>具体小图如下:<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/gaimor/ui2010.06.234.4.jpg" border=0><br>1.<br><img height=512 alt="" src="http://www.cppblog.com/images/cppblog_com/gaimor/ui2010.06.234.3.jpg" width=646 border=0><br><br>下一步我并不打算加入更多的控件(控件很多?)<br>还是先做做UI编辑器吧 <br>提高一下生产率吧<br><br>
<img src ="http://www.cppblog.com/gaimor/aggbug/118638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2010-06-24 14:51 <a href="http://www.cppblog.com/gaimor/archive/2010/06/24/118638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>