﻿<?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++博客-λ-calculus（惊愕到手了欧耶，BlogExportFull.aspx）</title><link>http://www.cppblog.com/vczh/</link><description>【QQ：343056143，504254078】【MSN：vczh@hotmail.com】【Email：vczh@163.com】【新浪微博：http://weibo.com/vczh】</description><language>zh-cn</language><lastBuildDate>Thu, 17 May 2012 04:39:11 GMT</lastBuildDate><pubDate>Thu, 17 May 2012 04:39:11 GMT</pubDate><ttl>60</ttl><item><title>GacUI Demo：文本框高亮（一）</title><link>http://www.cppblog.com/vczh/archive/2012/05/12/174609.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Fri, 11 May 2012 16:58:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/05/12/174609.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/174609.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/05/12/174609.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/174609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/174609.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; GacUI的高亮Demo做了一半。现在的进度是，可以手写着色器的状态转换函数，但是自动从正则表达式产生着色器的状态转换函数部分还没有集成进GacUI。这篇博客还是照旧，看图、看Demo代码，说着色原理。&nbsp;&nbsp;&nbsp; 这次的Demo要做一个可以动态切换着色器的小程序，里面包含INI、XML和C++三种着色器。现在只实现了INI一中，手写的...&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2012/05/12/174609.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/174609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-05-12 00:58 <a href="http://www.cppblog.com/vczh/archive/2012/05/12/174609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI Demo：文本框基本应用</title><link>http://www.cppblog.com/vczh/archive/2012/05/05/173764.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 05 May 2012 10:37:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/05/05/173764.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/173764.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/05/05/173764.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/173764.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/173764.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; GacUI添加了一个新的Demo。这个Demo用了几个按钮（之所以不用菜单是因为不想让Demo一下子包含太多新东西）来实现剪贴板操作、只读控制和行跳转等功能。在剪贴板里面的内容是文字的时候，Paste按钮会被Enable。这个过程是自动的，也就是说，你在画图里面复制了一个图片，这个按钮也会变灰。Cut和Copy按钮仅在文本框有文字被选中的时候可用，因此相应了文...&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2012/05/05/173764.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/173764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-05-05 18:37 <a href="http://www.cppblog.com/vczh/archive/2012/05/05/173764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI Demo：标签页</title><link>http://www.cppblog.com/vczh/archive/2012/05/01/173349.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 01 May 2012 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/05/01/173349.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/173349.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/05/01/173349.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/173349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/173349.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; <a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank">GacUI</a>新增了一个Demo。这里模拟了一个简单到过头了的编辑程序。界面是一个标签页，第一页里面只有一个按钮：Add Page。点中了他之后，其它页包含一个用来关掉自己的按钮，和一个多行的文本框。<br /><br />&nbsp;&nbsp;&nbsp; 这个Demo要展示的其中一个问题是，在按下关闭按钮的时候，由于那个Page会被移除并删除，会导致按钮自己也被删除。但是事件发生过后，实际上还有很多事情要做的。所以这里展示了如何使用GacUI进行&#8220;延迟执行&#8221;，在事件结束之后再删除自己。为了方便，这个Demo使用了C++11（但是库的实现并不依赖与C++11）。先上图：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_32.jpg" /><br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_33.jpg" width="656" height="518" /><br /><br />&nbsp;&nbsp;&nbsp; 然后我们来看代码：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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">"</span><span style="color: #000000">..\..\Public\Source\GacUIIncludes.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CALLBACK&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CmdShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SetupWindowsDirect2DRenderer();<br />}<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TextBoxPage&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GuiTabPage<br />{<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;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pageCounter;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GuiButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeButton;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiMultilineTextBox</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;textBox;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;closeButton_Clicked(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<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;deleteing&nbsp;the&nbsp;tab&nbsp;page&nbsp;will&nbsp;also&nbsp;delete&nbsp;the&nbsp;button,&nbsp;because&nbsp;the&nbsp;button&nbsp;is&nbsp;in&nbsp;the&nbsp;page<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;when&nbsp;an&nbsp;event&nbsp;is&nbsp;processing,&nbsp;the&nbsp;button&nbsp;is&nbsp;not&nbsp;going&nbsp;to&nbsp;be&nbsp;deleted<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;because&nbsp;there&nbsp;are&nbsp;many&nbsp;works&nbsp;to&nbsp;do&nbsp;after&nbsp;this&nbsp;event<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;and&nbsp;maybe&nbsp;someone&nbsp;has&nbsp;already&nbsp;added&nbsp;another&nbsp;event&nbsp;handler&nbsp;to&nbsp;this&nbsp;button<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;so&nbsp;it&nbsp;use&nbsp;GetApplication()-&gt;InvokeInMainThread&nbsp;to&nbsp;send&nbsp;a&nbsp;function&nbsp;to&nbsp;the&nbsp;queue<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;so&nbsp;that&nbsp;this&nbsp;function&nbsp;will&nbsp;be&nbsp;executed&nbsp;after&nbsp;this&nbsp;input&nbsp;message&nbsp;(an&nbsp;input&nbsp;message&nbsp;raises&nbsp;multiple&nbsp;events)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;to&nbsp;the&nbsp;user,&nbsp;this&nbsp;page&nbsp;is&nbsp;closed&nbsp;after&nbsp;cliking&nbsp;this&nbsp;button</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">InvokeInMainThread([</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;remove&nbsp;the&nbsp;page&nbsp;and&nbsp;delete&nbsp;it</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetOwnerTab()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">RemovePage(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;</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;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnPageContainerReady(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<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;create&nbsp;a&nbsp;table&nbsp;to&nbsp;place&nbsp;a&nbsp;button&nbsp;and&nbsp;a&nbsp;text&nbsp;box</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiTableComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;table</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiTableComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowsAndColumns(</span><span style="color: #000000">2</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;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::MinSizeOption());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowOption(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">1.0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumnOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">1.0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetCellPadding(</span><span style="color: #000000">2</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</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">1</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;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeButton</span><span style="color: #000000">=</span><span style="color: #000000">g::NewButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeButton</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Close&nbsp;Me!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeButton</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Clicked.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">TextBoxPage::closeButton_Clicked);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(closeButton</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&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;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</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;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textBox</span><span style="color: #000000">=</span><span style="color: #000000">g::NewMultilineTextBox();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&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;textBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">You&nbsp;can&nbsp;input&nbsp;several&nbsp;lines&nbsp;of&nbsp;text&nbsp;here.\r\nThis&nbsp;is&nbsp;a&nbsp;multiple&nbsp;line&nbsp;text&nbsp;box.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(textBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainer()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(table);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;TextBoxPage()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:closeButton(</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,textBox(</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;PageContainerReady.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">TextBoxPage::OnPageContainerReady);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Page&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">itow(</span><span style="color: #000000">++</span><span style="color: #000000">pageCounter));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">TextBoxPage()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TextBoxPage::pageCounter</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TextBoxPageWindow&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GuiWindow<br />{<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiTab</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabControl;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiTabPage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlPanelPage;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonAddPage;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;buttonAddPage_Clicked(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<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;when&nbsp;the&nbsp;button&nbsp;is&nbsp;clicked,&nbsp;it&nbsp;creates&nbsp;a&nbsp;new&nbsp;TextBoxPage&nbsp;and&nbsp;adds&nbsp;it&nbsp;to&nbsp;the&nbsp;tab&nbsp;control</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextBoxPage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;page</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TextBoxPage;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabControl</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreatePage(page);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabControl</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSelectedPage(page);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;TextBoxPageWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:GuiWindow(GetCurrentTheme()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreateWindowStyle())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Controls.Tab.TextBoxPage</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetPreferredMinSize(Size(</span><span style="color: #000000">640</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">480</span><span style="color: #000000">));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;a&nbsp;tab&nbsp;control</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabControl</span><span style="color: #000000">=</span><span style="color: #000000">g::NewTab();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabControl</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(tabControl);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;the&nbsp;first&nbsp;page&nbsp;is&nbsp;a&nbsp;control&nbsp;panel</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlPanelPage</span><span style="color: #000000">=</span><span style="color: #000000">tabControl</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreatePage();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlPanelPage</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Control&nbsp;Panel</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;a&nbsp;button&nbsp;to&nbsp;the&nbsp;control&nbsp;panel</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonAddPage</span><span style="color: #000000">=</span><span style="color: #000000">g::NewButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonAddPage</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Add&nbsp;a&nbsp;tab&nbsp;page</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonAddPage</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Clicked.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">TextBoxPageWindow::buttonAddPage_Clicked);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlPanelPage</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainer()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetInternalMargin(Margin(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlPanelPage</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainer()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(buttonAddPage);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ForceCalculateSizeImmediately();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveToScreenCenter();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">TextBoxPageWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GuiMain()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiWindow</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;window</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TextBoxPageWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Run(window);<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;window;<br />}</span></div><br />&nbsp;&nbsp;&nbsp; 那一大段的注释，就是在讲延迟执行的事情。看过C++11的人都知道，lambda expression实际上就是一个functor。在旧C++里面，调用InvokeInMainThread的时候，要么可以传一个void(*)(void*)和void*，要么可以传一个带operator()()的struct。在新C++里面，直接把lambda expression写在里面就好了。<br /><br />&nbsp;&nbsp;&nbsp; 如果不使用延迟执行，在事件发生的时候把自己删掉，会导致Access Violation的发生，因为接下来要访问的对象被你删掉了。如果使用延迟执行，就可以在input message处理完之后，执行删除的代码。这样一切都是好的。<br /><br />&nbsp;&nbsp;&nbsp; 下一个Demo就是关于文本框的操作，再下一个Demo是关于如何做用来显示代码的高亮文本框的事情。敬请期待，啊哈哈哈。<br /></div><img src ="http://www.cppblog.com/vczh/aggbug/173349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-05-01 15:28 <a href="http://www.cppblog.com/vczh/archive/2012/05/01/173349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI Demo：多选框和单选框</title><link>http://www.cppblog.com/vczh/archive/2012/04/27/172964.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Fri, 27 Apr 2012 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/04/27/172964.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/172964.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/04/27/172964.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/172964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/172964.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; <a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank"><span style="font-size: 14pt">GacUI</span></a>发布了一个新的Demo。这个Demo是关于多选框和单选框的。跟Windows一样，直接创建出来的单选框其实是不会互斥的，除非你把他们放进同一个group里面。界面是左右各一个group box，使用table来保证两边的尺寸都一样大。每一个group box里面放三个按钮，而且每一个group box的最小尺寸都取决于两边所有6按钮中最长的那个按钮。每一边的三个按钮使用stack来排列成像一个列表一样。左边是多选框，右边是单选框。现在先上图：<br /><br />&nbsp;&nbsp;&nbsp; 第一张是刚打开的时候，窗口的尺寸自动变化到能显示所有内容的最小的尺寸。尽管因为文字的关系，左边的按钮比右边的短，但是table可以控制两个group box一样大，并且共享最小尺寸。<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_30.jpg" width="400" height="174" /><br /><br />&nbsp;&nbsp;&nbsp; 然后改变窗口的尺寸，按钮始终靠左上角，两个group box则保持一样大。<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_31.jpg" width="500" height="256" /><br /><br />&nbsp;&nbsp;&nbsp; 大家已经看了前面的三个demo，所以有些东西其实已经不需要重复解释了。先上代码：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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">"</span><span style="color: #000000">..\..\Public\Source\GacUIIncludes.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CALLBACK&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CmdShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SetupWindowsDirect2DRenderer();<br />}<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CheckAndRadioWindow&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GuiWindow<br />{<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;CreateButtons(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;WString</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;groupName,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;WString</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;buttonName,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;checkBox,&nbsp;GuiSelectableButton::GroupController</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;groupController)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiControl</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;groupBox</span><span style="color: #000000">=</span><span style="color: #000000">g::NewGroupBox();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;all&nbsp;child&nbsp;controls&nbsp;should&nbsp;at&nbsp;least&nbsp;10&nbsp;pixels&nbsp;away&nbsp;from&nbsp;the&nbsp;group&nbsp;box</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetInternalMargin(Margin(</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dock&nbsp;the&nbsp;group&nbsp;box&nbsp;to&nbsp;fill&nbsp;the&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(groupName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;button&nbsp;to&nbsp;the&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;a&nbsp;stack&nbsp;to&nbsp;layout&nbsp;the&nbsp;3&nbsp;buttons&nbsp;from&nbsp;top&nbsp;to&nbsp;bottom&nbsp;shown&nbsp;like&nbsp;a&nbsp;list</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiStackComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiStackComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetDirection(GuiStackComposition::Vertical);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetPadding(</span><span style="color: #000000">6</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupBox</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(stack);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;buttons</span><span style="color: #008000"><br /></span><span style="color: #000000">&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</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">3</span><span style="color: #000000">;i</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;GuiSelectableButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;button</span><span style="color: #000000">=</span><span style="color: #000000">checkBox</span><span style="color: #000000">?</span><span style="color: #000000">g::NewCheckBox():g::NewRadioButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(buttonName</span><span style="color: #000000">+</span><span style="color: #000000">itow(i</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;button</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&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;</span><span style="color: #0000ff">if</span><span style="color: #000000">(groupController)<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;button</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetGroupController(groupController);<br />&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;GuiStackItemComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;stackItem</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiStackItemComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(stackItem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stackItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(button</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cell;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CheckAndRadioWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:GuiWindow(GetCurrentTheme()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreateWindowStyle())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Controls.Button.CheckAndRadio</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;limit&nbsp;the&nbsp;size&nbsp;that&nbsp;the&nbsp;window&nbsp;should&nbsp;always&nbsp;show&nbsp;the&nbsp;whole&nbsp;content&nbsp;without&nbsp;cliping&nbsp;it</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;a&nbsp;table&nbsp;to&nbsp;layout&nbsp;the&nbsp;2&nbsp;group&nbsp;boxes</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiTableComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;table</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiTableComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;make&nbsp;the&nbsp;table&nbsp;to&nbsp;have&nbsp;2&nbsp;rows</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowsAndColumns(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::MinSizeOption());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumnOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumnOption(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dock&nbsp;the&nbsp;table&nbsp;to&nbsp;fill&nbsp;the&nbsp;window</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetCellPadding(</span><span style="color: #000000">6</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;table&nbsp;to&nbsp;the&nbsp;window;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(table);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;group&nbsp;box&nbsp;for&nbsp;check&nbsp;boxes</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #000000">CreateButtons(L</span><span style="color: #000000">"</span><span style="color: #000000">Check&nbsp;Boxes</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;a&nbsp;check&nbsp;box&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">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;cell&nbsp;is&nbsp;the&nbsp;left&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</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">1</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;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;group&nbsp;box&nbsp;for&nbsp;radio&nbsp;buttons</span><span style="color: #008000"><br /></span><span style="color: #000000">&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: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;a&nbsp;group&nbsp;controller&nbsp;to&nbsp;group&nbsp;those&nbsp;radio&nbsp;buttons&nbsp;together<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;so&nbsp;that&nbsp;select&nbsp;a&nbsp;radio&nbsp;button&nbsp;will&nbsp;unselect&nbsp;the&nbsp;previous&nbsp;one&nbsp;automatically</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiSelectableButton::GroupController</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;groupController</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiSelectableButton::MutexGroupController;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddComponent(groupController);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #000000">CreateButtons(L</span><span style="color: #000000">"</span><span style="color: #000000">Radio&nbsp;buttons</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;a&nbsp;radio&nbsp;button&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;groupController);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;cell&nbsp;is&nbsp;the&nbsp;right&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</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;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;call&nbsp;this&nbsp;to&nbsp;calculate&nbsp;the&nbsp;size&nbsp;immediately&nbsp;if&nbsp;any&nbsp;indirect&nbsp;content&nbsp;in&nbsp;the&nbsp;table&nbsp;changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;so&nbsp;that&nbsp;the&nbsp;window&nbsp;can&nbsp;calcaulte&nbsp;its&nbsp;correct&nbsp;size&nbsp;before&nbsp;calling&nbsp;the&nbsp;MoveToScreenCenter()</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ForceCalculateSizeImmediately();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;move&nbsp;to&nbsp;the&nbsp;screen&nbsp;center</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveToScreenCenter();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">CheckAndRadioWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GuiMain()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiWindow</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;window</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CheckAndRadioWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Run(window);<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;window;<br />}</span></div><br />&nbsp;&nbsp;&nbsp; 需要关心的就是第二次调用CreateButtons函数，用来构造单选按钮的时候，穿进去的最后一个参数。GuiSelectableButton::GroupController类是一个虚类，用来控制选中状况。而预定义的MutexGroupController则可以控制连接到的所有GuiSelectionButton并保证他们互斥。如果需要更加复杂的情况，譬如说&#8220;最多只能选中N个按钮&#8221;这样的，则自己集成一个group controller就可以了。在创建了一个group controller，要调用GuiWindow::AddComponent保持他的生命周期，然后使用GuiSelectableButton::SetGroupController来帮顶一个按钮和一个group controller。<br /><br />&nbsp;&nbsp;&nbsp; 这个demo就介绍到这里了，下一个将是关于tab控件和文本框的demo。</div><img src ="http://www.cppblog.com/vczh/aggbug/172964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-04-27 22:02 <a href="http://www.cppblog.com/vczh/archive/2012/04/27/172964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI新Demo：按钮和排版</title><link>http://www.cppblog.com/vczh/archive/2012/04/25/172755.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Wed, 25 Apr 2012 10:46:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/04/25/172755.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/172755.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/04/25/172755.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/172755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/172755.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今天为<a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank">GacUI</a>写了一个新的Demo，展示了一些可以自动排版的按钮。主要的设想就是在窗口上放一个表格，分成两行两列。上面的按钮占满一整行，下面两个单元格放两个按钮。然后就可以设置每个行和列占整个表格的比例，在这个Demo里面都设置成50%。这样每当窗口缩放的时候，按钮的位置也会随之重新排版。然后设置表格充满整个窗口，这样窗口的最小值就会被表格的内容所限定，这样试图把窗口缩小的时候，就会有一个最小的尺寸限制着，至始至终保证所有的东西都可以显示出来，不会因为窗口太小而只显示一半。按钮也是同样，可以设置它必须显示所有的文字。所有的过程一旦配置好之后，计算尺寸的时候所有的操作都会自动做，程序员不需要为窗口的Resize事件写任何代码。<br /><br />&nbsp;&nbsp;&nbsp; 下面先放图。<br /><br />&nbsp;&nbsp;&nbsp; 第一个图是窗口刚刚打开的时候的样子。因为Demo里面没有设置窗口的尺寸，所以一上来就自动变成了最小的尺寸&#8212;&#8212;并且刚好可以显示所有的内容。<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_28.jpg" width="488" height="131" /><br /><br />&nbsp;&nbsp;&nbsp; 第二个图是窗口放大之后的样子。Disable按钮被按下了，所以上面的按钮就变灰。<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_29.jpg" width="607" height="348" /><br /><br />&nbsp;&nbsp;&nbsp; 这个Demo使用了Direct2D渲染器，所有的绘制过程都十分高速。而且表格的尺寸计算也是经过优化的，在拖放窗口的时候十分流畅。事实上按钮的渐变啊、边框啊、文字等等也是借助表格排版的。由于尺寸计算过于复杂，除了表格之外整个框架都不保存控件的尺寸，所有的东西都在需要的时候&#8212;&#8212;譬如说渲染的时候，譬如说计算鼠标点中的位置&#8212;&#8212;的那一刻才开始算。因此无论是鼠标滑过，或者是窗口拖放，都拼命地执行很多虚函数。可见C++的虚函数的性能之高，几乎永远都不会成为程序的瓶颈。下面来看代码：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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">"</span><span style="color: #000000">..\..\Public\Source\GacUIIncludes.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CALLBACK&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CmdShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SetupWindowsDirect2DRenderer();<br />}<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;EnableDisableWindow&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GuiWindow<br />{<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiButton</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;buttonEnable_OnClick(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetEnabled(</span><span style="color: #0000ff">true</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;buttonDisable_OnClick(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;EnableDisableWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:GuiWindow(GetCurrentTheme()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreateWindowStyle())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Controls.Button.EnableDisable</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;limit&nbsp;the&nbsp;size&nbsp;that&nbsp;the&nbsp;window&nbsp;should&nbsp;always&nbsp;show&nbsp;the&nbsp;whole&nbsp;content&nbsp;without&nbsp;cliping&nbsp;it</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;a&nbsp;table&nbsp;to&nbsp;layout&nbsp;the&nbsp;3&nbsp;buttons</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiTableComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;table</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiTableComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;make&nbsp;the&nbsp;table&nbsp;to&nbsp;have&nbsp;2&nbsp;rows</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowsAndColumns(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetRowOption(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumnOption(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetColumnOption(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;GuiCellOption::PercentageOption(</span><span style="color: #000000">0.5</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dock&nbsp;the&nbsp;table&nbsp;to&nbsp;fill&nbsp;the&nbsp;window</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;table&nbsp;to&nbsp;the&nbsp;window;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetContainerComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(table);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;target&nbsp;button</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;cell&nbsp;is&nbsp;the&nbsp;top&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</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">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">=</span><span style="color: #000000">g::NewButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Enable&nbsp;or&nbsp;disable&nbsp;me&nbsp;using&nbsp;the&nbsp;buttons&nbsp;below!</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: #008000">//</span><span style="color: #008000">&nbsp;ensure&nbsp;that&nbsp;the&nbsp;buttonTarget&nbsp;display&nbsp;the&nbsp;whole&nbsp;text</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dock&nbsp;the&nbsp;button&nbsp;to&nbsp;fill&nbsp;the&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</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">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;button&nbsp;to&nbsp;the&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;enable&nbsp;button</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;cell&nbsp;is&nbsp;the&nbsp;bottom&nbsp;left&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable</span><span style="color: #000000">=</span><span style="color: #000000">g::NewButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Enable</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</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;buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Clicked.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">EnableDisableWindow::buttonEnable_OnClick);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;add&nbsp;the&nbsp;disable&nbsp;button</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GuiCellComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;cell</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GuiCellComposition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;this&nbsp;cell&nbsp;is&nbsp;the&nbsp;bottom&nbsp;right&nbsp;cell</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetSite(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">=</span><span style="color: #000000">g::NewButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Disable</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAlignmentToParent(Margin(</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Clicked.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">EnableDisableWindow::buttonDisable_OnClick);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;change&nbsp;the&nbsp;button&nbsp;font</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FontProperties&nbsp;font;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font</span><span style="color: #000000">=</span><span style="color: #000000">buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetFont();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.size</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;&nbsp;&nbsp;&nbsp;&nbsp;buttonTarget</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonEnable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonDisable</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;call&nbsp;this&nbsp;to&nbsp;calculate&nbsp;the&nbsp;size&nbsp;immediately&nbsp;if&nbsp;any&nbsp;indirect&nbsp;content&nbsp;in&nbsp;the&nbsp;table&nbsp;changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;so&nbsp;that&nbsp;the&nbsp;window&nbsp;can&nbsp;calcaulte&nbsp;its&nbsp;correct&nbsp;size&nbsp;before&nbsp;calling&nbsp;the&nbsp;MoveToScreenCenter()</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #000000">-&gt;</span><span style="color: #000000">UpdateCellBounds();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;update&nbsp;the&nbsp;size</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetBounds(Rect());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;move&nbsp;to&nbsp;the&nbsp;screen&nbsp;center</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveToScreenCenter();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">EnableDisableWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GuiMain()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiWindow</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;window</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EnableDisableWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Run(window);<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;window;<br />}</span></div><br />&nbsp;&nbsp;&nbsp; 代码里面充满了注释，而且主要的内容也在上面介绍了，在这里我就不罗嗦了。所有的代码都可以在<a href="http://gac.codeplex.com">http://gac.codeplex.com</a>中，下载最新的代码，然后在Libraries\GacUI\GacUIDemo\GacUIDemo.sln下面找到。<img src ="http://www.cppblog.com/vczh/aggbug/172755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-04-25 18:46 <a href="http://www.cppblog.com/vczh/archive/2012/04/25/172755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI Demo：使用Label控件模仿超链接</title><link>http://www.cppblog.com/vczh/archive/2012/04/24/172638.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 24 Apr 2012 10:37:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/04/24/172638.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/172638.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/04/24/172638.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/172638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/172638.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; 今天我给<a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank">GacUI</a>添加了一个新Demo。我发现写Demo也是一个测试的过程，可以用来检验类库提供的API是否够完整。前面这两个Demo都促使我往类库里面加入了新的函数。这次的Demo是用Label控件来模仿超链接。下载最新代码之后，可以在&#8220;Libraries\GacUI\GacUIDemo\GacUIDemo.sln&#8221;下面找到最新的Demo代码。<br /><br />&nbsp;&nbsp;&nbsp; 为了模仿超链接，我们要做两件事情。第一件事情就是鼠标悬浮在Label上的时候需要显示出手的光标图，第二件事情就是在鼠标进入Label的时候显示下划线，离开的时候去掉下划线。因此我们需要监听三个事件，分别是MouseEnter，MouseLeave和LeftButtonDown。下面是Demo的图：<br /><br />&nbsp;&nbsp;&nbsp; 上图：鼠标在Label外。下图：鼠标在Label内。单击Label的时候会打开浏览器。<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_27.jpg" width="316" height="486" /><br /><br />&nbsp;&nbsp;&nbsp; 代码如下：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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">"</span><span style="color: #000000">..\..\Public\Source\GacUIIncludes.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CALLBACK&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CmdShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SetupWindowsDirect2DRenderer();<br />}<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HyperlinkWindow&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;GuiWindow<br />{<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiLabel</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;labelHyperlink_OnMouseEnter(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FontProperties&nbsp;font</span><span style="color: #000000">=</span><span style="color: #000000">labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetFont();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.underline</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;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;labelHyperlink_OnMouseLeave(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FontProperties&nbsp;font</span><span style="color: #000000">=</span><span style="color: #000000">labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetFont();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.underline</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;labelHyperlink_OnLeftButtonDown(GuiGraphicsComposition</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;sender,&nbsp;GuiMouseEventArgs</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;arguments)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShellExecute(NULL,&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">OPEN</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">http://www.cppblog.com/vczh</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;NULL,&nbsp;NULL,&nbsp;SW_SHOWNORMAL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;HyperlinkWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:GuiWindow(GetCurrentTheme()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreateWindowStyle())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Controls.Label.Hyperlink</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetClientSize(Size(</span><span style="color: #000000">300</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">200</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MoveToScreenCenter();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">=</span><span style="color: #000000">g::NewLabel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">http://www.cppblog.com/vczh</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetTextColor(Color(</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">255</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;FontProperties&nbsp;font;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.fontFamily</span><span style="color: #000000">=</span><span style="color: #000000">L</span><span style="color: #000000">"</span><span style="color: #000000">Segoe&nbsp;UI</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.size</span><span style="color: #000000">=</span><span style="color: #000000">18</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.antialias</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;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;INativeCursor</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;hand</span><span style="color: #000000">=</span><span style="color: #000000">GetCurrentController()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ResourceService()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetSystemCursor(INativeCursor::Hand);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetBoundsComposition()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetAssociatedCursor(hand);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetEventReceiver()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mouseEnter.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">HyperlinkWindow::labelHyperlink_OnMouseEnter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetEventReceiver()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mouseLeave.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">HyperlinkWindow::labelHyperlink_OnMouseLeave);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelHyperlink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetEventReceiver()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">leftButtonDown.AttachMethod(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">HyperlinkWindow::labelHyperlink_OnLeftButtonDown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddChild(labelHyperlink);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">HyperlinkWindow()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GuiMain()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiWindow</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;window</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HyperlinkWindow();<br />&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Run(window);<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;window;<br />}</span></div><br />&nbsp;&nbsp;&nbsp; 这里展示的主要是监听事件的方法。在使用control-&gt;GetEventReceiver()-&gt;event的时候，可以使用Attach、AttachMethod、AttachFunction和AttachLambda。AttachLambda传入一个functor，在C++11里面可以直接使用lambda表达式。在这里使用AttachMethod给一个事件绑定类成员函数。C++运行类成员函数的时候，不仅需要参数，还需要一个this对象，所以AttachMethod有两个参数，使用方法在Demo里面已经展现出来了。<br /><br />&nbsp;&nbsp;&nbsp; 在这里还引入了GetCurrentController函数。GetCurrentController返回的INativeController对象抽象了所有需要的操作系统的功能，其中获得一个光标的对象就封装在了ResourceService里面。INativeController还包含了很多其他的Service，这个留在以后的Demo展示。</div> <img src ="http://www.cppblog.com/vczh/aggbug/172638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-04-24 18:37 <a href="http://www.cppblog.com/vczh/archive/2012/04/24/172638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI文档已经全部写完，进入制作Demo阶段</title><link>http://www.cppblog.com/vczh/archive/2012/04/23/172511.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 23 Apr 2012 15:37:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/04/23/172511.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/172511.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/04/23/172511.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/172511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/172511.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今晚终于把<a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank">GacUI</a>所有该加上的XML注释都加上了，开始做起了Demo。需要做的Demo大概有几十个，除了每个控件要那么几个以外，还有一些其他功能，譬如换皮肤换风格啊，使用不同的渲染器啊，移植到Direct3D上什么的，好多啊，即将写到手软。今天写了第一个Demo，是一个helloworld程序。创建一个GacUI程序是一件很容易的事情，首先下载<a style="text-decoration: underline" href="http://gac.codeplex.com/SourceControl/changeset/changes/89589" target="_blank"><a style="text-decoration: underline" href="http://gac.codeplex.com/SourceControl/changeset/changes/89589" target="_blank">GacUI</a>的最新代码</a>（在有了Release之后会有更好的文件组织和html文档），然后将&#8220;Libraries\GacUI\Public\Source&#8221;下面的5个文件添加进建好的Visual C++的Windows工程里面，然后开始写main函数：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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">"</span><span style="color: #000000">..\..\Public\Source\GacUIIncludes.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CALLBACK&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CmdShow)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SetupWindowsDirect2DRenderer();<br />}<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GuiMain()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiWindow</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;window</span><span style="color: #000000">=</span><span style="color: #000000">g::NewWindow();<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">Hello,&nbsp;world!</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">SetClientSize(Size(</span><span style="color: #000000">640</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">480</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveToScreenCenter();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;GuiControl</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;label</span><span style="color: #000000">=</span><span style="color: #000000">g::NewLabel();<br />&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetText(L</span><span style="color: #000000">"</span><span style="color: #000000">Welcome&nbsp;to&nbsp;GacUI&nbsp;Library!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FontProperties&nbsp;font;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.fontFamily</span><span style="color: #000000">=</span><span style="color: #000000">L</span><span style="color: #000000">"</span><span style="color: #000000">Segoe&nbsp;UI</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.size</span><span style="color: #000000">=</span><span style="color: #000000">40</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font.antialias</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;label</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetFont(font);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddChild(label);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GetApplication()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Run(window);<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;window;<br />}</span></div><br />&nbsp;&nbsp;&nbsp; Main函数里面需要选择渲染器，这里选的是Direct2D。如果要选择GDI，则调用SetupWindowsGDIRenderer。至于void GuiMain(void)函数则是类库自己的要求，一定要有那么一个，因为SetupWindowsDirect2DRenderer（或GDI）最终会进行一大段初始化工作之后调用一个声明了却没有实现的void GuiMain(void)函数，所以一个合法的GacUI工程需要包含void GuiMain(void)的实现，也就是上面这样。<br /><br />&nbsp;&nbsp;&nbsp; 然后接下来的就是普通的工作了，创建一个GuiWindow，加点东西，Run一下当主窗口。当主窗口被关掉的时候Run函数就会结束，这个时候进行一下必要的清理，程序就可以结束了。运行之后就是下面这个样子：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_26.jpg" width="656" height="518" /><br /><br />&nbsp;&nbsp;&nbsp; 至此HelloWorld的Demo就结束了。<br /><br /><img src ="http://www.cppblog.com/vczh/aggbug/172511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-04-23 23:37 <a href="http://www.cppblog.com/vczh/archive/2012/04/23/172511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成功从VC++的XML注释生成静态html文档</title><link>http://www.cppblog.com/vczh/archive/2012/04/01/169794.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sun, 01 Apr 2012 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/04/01/169794.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/169794.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/04/01/169794.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/169794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/169794.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; <a style="text-decoration: underline" href="http://gac.codeplex.com" target="_blank">GacUI</a>的类库说明文档已经可以生成了！利用了<a style="text-decoration: underline" href="http://www.cppblog.com/vczh/archive/2012/03/10/167539.html" target="_blank">之前的这篇博客</a>描述的pdb信息抽取并和XML注释合并的技术，成功写了一系列工具来从这些信息里面生成静态html文档。现在的XML注释只写了1/3，所以生成的文档还不全。<br /><br />&nbsp;&nbsp;&nbsp; 之所以做这个工具，而不用Doxygen，是因为Visual&nbsp;C++对XML注释有着良好的支持。如果你为你的代码写了XML注释，那么在智能提示里面还可以看到成员的文档。但是这个形式的注释并不是Doxygen所接受的，而微软或其它开源工具对XML注释生成文档的工具仅限于.net程序（包括C++/CLI）。本来GacUI的release所提供的代码是几个压缩过的cpp和h文件，所以可以用一个C++/CLI工程去编译这个代码从而使用那些软件来产生文档的。不过本着造福大众兼磨练自己的精神，就写了一个专门针对VC++的Native C++工程编译产生的xml注释文件和pdb文件抽取数据合成文档的工具。<br /><br />&nbsp;&nbsp;&nbsp; 下面是文档的截图：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_25.jpg" /><br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/DXGUI_24.jpg" /><br /><br /></p>
<p>&nbsp;&nbsp;&nbsp; 文档生成工具的代码已经提交到了Gac Library（<a href="http://gac.codeplex.com" target="_blank">http://gac.codeplex.com</a>）上面。目前的话，只需要打开&lt;root&gt;\Libraries\GacUI\GacUISrc\GacUISrc.sln，使用debug编译之后，运行&lt;root&gt;\Libraries\GacUI\Public\Release.bat，就会在Temp\StaticHtmpDoc\目录下面产生一系列的html文件。目前这个文档的根节点是reference_gacui.html文件。</p>
<p>&nbsp;&nbsp;&nbsp; 在Release.bat里面可以看出，我使用了&lt;root&gt;\Common\Tools\下面的几个exe程序来读pdb、读xml注释并生成静态html文档。在与exe同名的目录下面，有这些工具的源代码。目前这个工具还不能处理模板类的xml注释，这个功能不久之后就会加上去。</p><img src ="http://www.cppblog.com/vczh/aggbug/169794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-04-01 16:43 <a href="http://www.cppblog.com/vczh/archive/2012/04/01/169794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GacUI开源了！</title><link>http://www.cppblog.com/vczh/archive/2012/03/24/168813.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 24 Mar 2012 10:31:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/03/24/168813.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/168813.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/03/24/168813.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/168813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/168813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 我最终还是给GacUI专门申请了一个codeplex的项目主页：<a href="http://gac.codeplex.com">http://gac.codeplex.com</a>。Vczh Library++ 3.0上面上传的代码大多是实验产品，相比把GacUI也放在上面发布不太合适，所以开了一个新项目。新的项目使用MS-PL协议。MS-PL的协议跟BSD、MIT和Apache等协议几乎是一样的，除了&#8220;他人不得用MS-PL协议的代码申请专利&#8221;。这是一个避免纠纷的好方法。<br /><br />&nbsp;&nbsp;&nbsp; GacUI现在还没全部完成。目前正在制作文档和教程。文档应该要么是html要么是pdf，教程会跟文档合并到一起去。GacUI大体上还是能用，不过目前处于alpha状态。<br />&nbsp;&nbsp;&nbsp; 已经完成的功能有：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、GDI和Direct2D渲染器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、皮肤系统<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、各种基于MVVM模式设计的控件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、可切换的窗口系统。我目前只提供了一个用Windows窗口做窗口骨架的provider，如果你们高兴的话也可以去写一个虚拟的，然后就可以选择Direct2D渲染器，最后合并到游戏里面。<br />&nbsp;&nbsp;&nbsp; 还没完成的功能有：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、按键操作。目前只有文本框接受按键，列表和菜单什么的还没有，快捷键功能也还没有。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、基本对话框的支持。这个我应该不会自己做，而是使用API提供的打开保存文件对话框什么的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、更加高级的控件，譬如Ribbon、VisualStudio那样子的Docking等等。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、其它。<br />&nbsp;&nbsp;&nbsp; 在这次完成基本的文档和教程之后，将会继续开发GacUI剩余的部分。<br /><br />&nbsp;&nbsp;&nbsp; 之前的实验，让我最终采用代码方式来发布GacUI，并且用抓取PDB地方法，结合Visual C++提供的XML注释来生成文档的reference部分。GacUI虽然文件上百，不过我已经写了一个代码生成器，将他们合并成了3个h文件和2个cpp：Vczh Library++3.0的公共部分一个cpp；GacUI的部分一个cpp。这有利于我将来继续提供脚本引擎或者其他东西，可以共享代码一起编译。现在使用GacUI，只需要将这5个文件添加进工程就好了。而且cpp只有两个，所以如果项目使用预编译头（precompiled header）的话，给这两个cpp分别加上#include "stdafx.h"也将十分简单。 <img src ="http://www.cppblog.com/vczh/aggbug/168813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-03-24 18:31 <a href="http://www.cppblog.com/vczh/archive/2012/03/24/168813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合并Visual Studio本地C++XML注释文档和PDB的符号内容</title><link>http://www.cppblog.com/vczh/archive/2012/03/10/167539.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 10 Mar 2012 01:04:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/03/10/167539.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/167539.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/03/10/167539.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/167539.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/167539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     终于到了激动人心的时刻了。今天的博客内容将永远消除Visual Studio的本地C++XML注释编译出来的XML文档没有办法生成可读文档的根本原因。<br><br>    首先介绍一下C++的XML注释。在启用注释之前，我们必须先去工程属性里面，把[C/C++ -> Output Files -> Generate Xml Documentation Files]设置成Yes。这样我们就可以在C++的类啊函数上面写XML注释，然后被编译成一份带有符号链接的XML注释集合。这里先给一个GacUI的XML注释的例子：&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2012/03/10/167539.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/167539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-03-10 09:04 <a href="http://www.cppblog.com/vczh/archive/2012/03/10/167539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>
