﻿<?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++博客-kenlistian-随笔分类-wxwidgets</title><link>http://www.cppblog.com/kenlistian/category/7292.html</link><description>厚积薄发.
勤为桨,思为帆



</description><language>zh-cn</language><lastBuildDate>Fri, 06 Feb 2009 04:39:24 GMT</lastBuildDate><pubDate>Fri, 06 Feb 2009 04:39:24 GMT</pubDate><ttl>60</ttl><item><title>wxwidget自定义消息处理步骤</title><link>http://www.cppblog.com/kenlistian/archive/2009/02/06/73096.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Fri, 06 Feb 2009 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/02/06/73096.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/73096.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/02/06/73096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/73096.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/73096.html</trackback:ping><description><![CDATA[<p><br>自定义消息处理<br>(不知道在wxpython,wxruby如何自定义类型消息?<br>最好装个wxpython,在其demo现场编写现场查看结果)</p>
<p>步骤如下:</p>
<p>1.在宏里处理如下:</p>
<p>a.<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BEGIN_DECLARE_EVENT_TYPES()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_EVENT_TYPE(wxEVT_MYCOMMAND,&nbsp;xxxx)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>END_DECLARE_EVENT_TYPES()</span></div>
<p><br>&nbsp; xxxx 为自定义数字,不过翻到wxwidget内部,其宏定义中该value好像<br>&nbsp; 没用!(...)</p>
<p>b. 定义wxEvT_MYCOMMAND 标识<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;DEFINE_EVENT_TYPE(wxEVT_MYMYCOMMAND)</span></div>
<p>&nbsp;</p>
<p>c. 定义宏EVT_MYCOMMAND<br>&nbsp;&nbsp; 格式中把自定义标识改为自己即可.拷贝.</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;EVT_MYCOMMAND(id,&nbsp;fn)&nbsp;\</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_EVENT_TABLE_ENTRY(&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wxEVT_MYCOMMAND,&nbsp;id,&nbsp;wxID_ANY,&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(&nbsp;wxCommandEventFunction,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">fn&nbsp;),&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(wxObject&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;NULL&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;),</span></div>
<p>&nbsp;</p>
<p><br>2.在BEGIN_EVENT_TABLE表中自定义映射.<br>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;EVT_MY_CUSTOM_COMMAND(wxID_ANY,&nbsp;MyFrame::OnMyfunction)</span></div>
<p>&nbsp;</p>
<p>3.处理投递</p>
<p>&nbsp;&nbsp;&nbsp; 自定义消息发送,this 一般是接受消息handler,也可其它wxEvtHandler.<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wxCommandEvent&nbsp;myEvent(wxEVT_MY_CUSTOM_COMMAND);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wxPostEvent(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;myEvent);</span></div>
<p>&nbsp;</p>
<p>4.自定义消息处理函数<br>&nbsp;&nbsp; 必须符合wxCommandEventFunction格式,既为如下:<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnMyfunction(wxCommandEvent</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">);</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/73096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-02-06 12:06 <a href="http://www.cppblog.com/kenlistian/archive/2009/02/06/73096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>界面设计</title><link>http://www.cppblog.com/kenlistian/archive/2009/02/03/72859.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 03 Feb 2009 03:35:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/02/03/72859.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/72859.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/02/03/72859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/72859.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/72859.html</trackback:ping><description><![CDATA[来源:http://www.oulan.com/com/2008/07/wxwidgets.html <br>[Commerial]<br>&nbsp;DialogBlocks&nbsp;&nbsp; <a href="http://www.anthemion.co.uk/dialogblocks/">http://www.anthemion.co.uk/dialogblocks/</a><br>&nbsp;wxDesigner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.roebling.de/">http://www.roebling.de/</a> <br><br>[Free] <br>wxGlade&nbsp; &nbsp; <a href="http://www.roebling.de/">http://www.roebling.de/</a><br>VisualWx&nbsp; <a href="http://visualwx.altervista.org/">http://visualwx.altervista.org/</a> <br>XRCed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://xrced.sourceforge.net/">http://xrced.sourceforge.net/</a> <br><br>wiki： http://wiki.wxformbuilder.org/ <br>官网： http://wxformbuilder.org/ <br><br>推荐直接用DialogBlocks, 至于版本问题,没办法,先用着再说.<br>&nbsp;Dialogblock是美国Anthemion公司开发的商业软件,如果只是简单<br>的包含控件,则免费使用.<br><br>另:<br>在现在编程中,利用界面设计工具把界面资源以xrc方式存放,<br>在程序中调用是一种趋势.<br><br><br><br>
<img src ="http://www.cppblog.com/kenlistian/aggbug/72859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-02-03 11:35 <a href="http://www.cppblog.com/kenlistian/archive/2009/02/03/72859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转vc6下编译wxWidget（全）</title><link>http://www.cppblog.com/kenlistian/archive/2008/11/05/65986.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 04 Nov 2008 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/11/05/65986.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/65986.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/11/05/65986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/65986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/65986.html</trackback:ping><description><![CDATA[<p>前言：<a  href="http://www.wxwidgets.org/"><font color="#366217">wxWidgets</font></a>
是跨平台的GUI库，用VC6会影响它的跨平台性吗？当然不会，我们只是用VC6充当编译器和编辑器，只要编写代码时注意不使用Windows相关的特性，写出的代码仍然是跨平台的，仍然是可以在其它操作系统下（如Linux）使用其它C++编译器（如GCC）编译并运行的。</p>
<p>为什么用VC6，只不过此文专门针对VC6而已。 </p>
<h1>创建项目</h1>
<p>点击菜单：File -> New... 创建一个"Win32 Application" Project，项目名称为"wxProject"，点击OK按钮，</p>
<p>在下一步的提示中选择"An Empty Project"，点击Finish按钮完成项目的创建。</p>
<p>以下的设置和操作可能有一些繁琐，但这是一劳永逸的事情。只要你完成了第一个空白工程，以后再需要创建工程时复制一份就可以了。</p>
<p>　</p>
<h1>设置项目属性</h1>
<p>以下四个编译配置并不要求都必须设置好，如果您不打算使用Unicode，那么不用设置"Win32 Unicode
Debug"和"Win32 Unicode
Release"，如果您仅仅想调试程序而非发布，则只需设置相应的"Debug"不用设置"Release"。最简单的情况下，只需设置"Win32
Debug"。</p>
<p>还有一点要注意，您需要事先编译出相应版本的 wxWidgets 库文件。如"Win32 Unicode Debug"需要
Unicode+Debug 版本的 wxWidgets 库。（wxWidgets 各种版本库均可通过
<wx安装目录>\build\msw\wx.dsw 进行编译）。</p>
<p>点击菜单：Project -> Settings... 打开项目属性设置对话框。</p>
<h2>Win32 Debug：</h2>
<blockquote>
<h3>C/C++ General:</h3>
<blockquote>
<p><strong>Preprocessor definitions:</strong> WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_MBCS,_WINDOWS,NOPCH</p>
</blockquote>
<h3>C/C++ Code Generation:</h3>
<blockquote>
<p><strong>Use run-time library:</strong> Debug Multithreaded DLL</p>
</blockquote>
<h3>Link General:</h3>
<blockquote>
<p><strong>Object/library modules:</strong> wxmsw26d_xrc.lib
wxmsw26d_html.lib wxmsw26d_adv.lib wxmsw26d_core.lib wxbase26d_xml.lib
wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib
wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib
comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib
oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib&#160;</p>
</blockquote></blockquote>
<h2>Win32 Release：</h2>
<blockquote>
<h3>C/C++ General:</h3>
<blockquote>
<p><strong>Preprocessor definitions:</strong> WIN32,NDEBUG,__WXMSW__,_MBCS,_WINDOWS,NOPCH</p>
</blockquote>
<h3>C/C++ Code Generation:</h3>
<blockquote>
<p><strong>Use run-time library:</strong> Multithreaded DLL</p>
</blockquote>
<h3>Link General:</h3>
<blockquote>
<p><strong>Object/library modules:</strong> wxmsw26_xrc.lib
wxmsw26_html.lib wxmsw26_adv.lib wxmsw26_core.lib wxbase26_xml.lib
wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib
wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib
rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib&#160;</p>
</blockquote></blockquote>
<p>进行以下操作之前，请先通过菜单 Build -> Configurations... 增加两个编译配置"Win32 Unicode
Debug"和"Win32 Unicode Release"（分别复制于"Win32 Debug"和"Win32 Release"）。</p>
<h2>Win32 Unicode Debug：</h2>
<blockquote>
<h3>C/C++ General:</h3>
<blockquote>
<p><strong>Preprocessor definitions:</strong> WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH</p>
</blockquote>
<h3>C/C++ Code Generation:</h3>
<blockquote>
<p><strong>Use run-time library:</strong> Debug Multithreaded DLL</p>
</blockquote>
<h3>Link General:</h3>
<blockquote>
<p><strong>Object/library modules:</strong> wxmsw26ud_xrc.lib
wxmsw26ud_html.lib wxmsw26ud_adv.lib wxmsw26ud_core.lib
wxbase26ud_xml.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib
wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib
gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib
ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib
odbc32.lib&#160;</p>
</blockquote></blockquote>
<h2>Win32 Unicode Release：</h2>
<blockquote>
<h3>C/C++ General:</h3>
<blockquote>
<p><strong>Preprocessor definitions:</strong> WIN32,NDEBUG,__WXMSW__,_UNICODE,_WINDOWS,NOPCH</p>
</blockquote>
<h3>C/C++ Code Generation:</h3>
<blockquote>
<p><strong>Use run-time library:</strong> Multithreaded DLL</p>
</blockquote>
<h3>Link General:</h3>
<blockquote>
<p><strong>Object/library modules:</strong> wxmsw26u_xrc.lib
wxmsw26u_html.lib wxmsw26u_adv.lib wxmsw26u_core.lib wxbase26u_xml.lib
wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib
wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib
rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib&#160;</p>
</blockquote></blockquote>
<p>　</p>
<h1>设置wxWidgets目录</h1>
<p>在前面的设置中，指定了wxWidgets的库文件（*.lib），但VC可能并不知道到哪个目录去寻找这些文件。同时，我们的源代码中也要包含
（include）wxWidgets的头文件，其头文件所在目录也需要指定。另外，为了更好的调试wx程序，最好把wxWidgets的源代码所在目录
也设置好。</p>
<p>点击菜单 Tools -> Options...，进入 Directories 页，分别加入以下路径（下面的<wx>表示wxWidgets安装目录）</p>
<blockquote>
<p>Include files:</p>
<blockquote>
<p><wx>\include</p>
<p><wx>\include\msvc</p>
</blockquote>
<p>Library files:</p>
<blockquote>
<p><wx>\lib\vc_lib</p>
</blockquote>
<p>Source files:</p>
<blockquote>
<p><wx>\src</p>
</blockquote></blockquote>
<p>这一设置是针对VC全局的，以后再用VC创建wxWigets程序，就不用设置这些路径了。</p>
<p>　</p>
<h1>创建wxWidgets预编译头文件</h1>
<p>各个编译器不同，有的支持预编译头文件，有的不支持，支持预编译头文件的，使用的语法也有所不同，如果在每个源文件中都重复的写未免不爽，还是集中到一个头文件中来比较好。但是注意，有了此文件并不决定或限制你使用还是不使用预编译头文件，用不用以及怎么用还是在你。</p>
<p>点击菜单 File -> New...，新建一个C/C++头文件 wx_pch.h，其内容如下：</p>
<table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">#ifndef </font><font color="#a000a0">WX_PCH_H_INCLUDED<br></font><font color="#0000ff">#define </font><font color="#a000a0">WX_PCH_H_INCLUDED<br><br></font><font color="#0000ff">#if </font><font color="#000080">( </font>defined<font color="#000080">(</font>USE_PCH<font color="#000080">) && !</font>defined<font color="#000080">(</font><font color="#a000a0">WX_PRECOMP</font><font color="#000080"> ) )<br></font><font color="#0000ff">#define </font><font color="#a000a0">WX_PRECOMP<br></font><font color="#0000ff">#endif </font><font color="#008000">// USE_PCH<br><br>// basic wxWidgets headers<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/wxprec<font color="#000080">.</font>h<font color="#000080">><br><br></font><font color="#008000">// for use xrc files<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/xrc/xmlres<font color="#000080">.</font>h<font color="#000080">><br><br></font><font color="#0000ff">#ifdef </font>__BORLANDC__<br><font color="#0000ff">#pragma </font>hdrstop<br><font color="#0000ff">#endif<br><br>#ifndef </font><font color="#a000a0">WX_PRECOMP<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/wx<font color="#000080">.</font>h<font color="#000080">><br></font><font color="#0000ff">#endif<br><br>#ifdef </font>USE_PCH<br><font color="#008000">// put here all your rarely-changing header files<br><br></font><font color="#0000ff">#endif </font><font color="#008000">// USE_PCH<br><br></font><font color="#0000ff">#endif </font><font color="#008000">// WX_PCH_H_INCLUDED</font></td>
        </tr>
    </tbody>
</table>
<p>wxWidgets官方文档是大概也是这样推荐，Code::Blocks中基本上就是这样子，我只是简单的增加了一行"#include <wx/xrc/xmlres.h>"（为了使用XRC文件）。</p>
<p>以后，工程中的源文件，只要包含（include） wx_pch.h 文件就可以了。</p>
<p>　</p>
<h1>创建wxApp子类</h1>
<p>点击菜单 Insert -> New
Class...，新建一个名称为"App"的类（类名称可以随意），考虑到代码的跨平台性，建议将其所在文件的名称修改为全部使用小写字母（如
app.h/app.cpp）。此操作将生成文件 app.h 和 app.cpp。</p>
<p>VC在这里生成的类代码显然是不满足我们的要求的，需要进行以下修改：</p>
<p>app.h</p>
<blockquote>
<p>增加预编译头文件 wx_pch.h 的包含（以后创建的每个.h文件都要包含它）：<font color="#0000ff">#include </font><font color="#008080">"wx_pch.h"</font></p>
<p>指定App类的父类为wxApp：即将"<font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font>"修改为"<font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080"> : </font><font color="#0000ff">public</font><font color="#000080"> </font><font color="#0000ff">wxApp</font>"</p>
<p>为类增加虚方法OnInit()的声明：<font color="#0000ff">virtual</font><font color="#000080"> </font><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#880000">OnInit</font><font color="#000080">();</font></p>
<p>在类声明的下方增加 wxWidgets App 声明：<font color="#a000a0">DECLARE_APP</font><font color="#000080">(</font><font color="#0000ff">App</font><font color="#000080">)</font></p>
<p>最终 app.h 的内容如下（其中经过手工改写的地方已用<span style="background-color: #ffff00;" twffan="done">黄色背景</span>突出显示）：</p>
<table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff"><font color="#008000">// by: <a  href="http://liigo.com/"><font color="#366217">liigo.com</font></a></font><br><br>#if </font><font color="#000080">!</font>defined<font color="#000080">(</font><font color="#a000a0"> AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_</font><font color="#000080">)<br></font><font color="#0000ff">#define </font><font color="#a000a0">AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_<br><br></font><font color="#0000ff">#if _MSC_VER</font><font color="#000080"> > </font><font color="#800000">1000<br></font><font color="#0000ff">#pragma </font>once<br><font color="#0000ff">#endif </font><font color="#008000">// _MSC_VER > 1000<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">#include </font></span><font color="#008080"><span style="background-color: #ffff00;" twffan="done">"wx_pch.h"</span><br><br></font><font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">public</font><font color="#000080"> </font></span><font color="#0000ff"><span style="background-color: #ffff00;" twffan="done">wxApp</span><br></font><font color="#000080">{<br></font><font color="#0000ff">public</font><font color="#000080"> :<br>&#160;&#160;&#160; </font><font color="#0000ff">App</font><font color="#000080">();<br>&#160;&#160;&#160; </font><font color="#0000ff">virtual</font><font color="#000080"> ~</font><font color="#0000ff">App</font><font color="#000080">();<br>&#160;&#160;&#160; </font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">virtual</font><font color="#000080"> </font><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#880000">OnInit</font></span><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">();</span><br>};<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">DECLARE_APP</font><font color="#000080">(</font><font color="#0000ff">App</font></span><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">)</span><br><br></font><font color="#0000ff">#endif </font><font color="#008000">// !defined(AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_)</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>app.cpp</p>
<blockquote>
<p>增加头文件包含（此头文件将在下面创建MainFrame类时创建）：<font color="#0000ff">#include </font><font color="#008080">"mainframe.h"</font></p>
<p>增加 OnInit() 方法的定义（其中用到的MainFrame类定义于mainframe.h，见后文）：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#880000">OnInit</font><font color="#000080">()<br>{<br>&#160;&#160;&#160; <font color="#0000ff">MainFrame</font>* mainFrame = <font color="#0000ff">new</font> <font color="#0000ff">MainFrame</font>(<font color="#a000a0">NULL</font>, <font color="#a000a0">_</font>(<font color="#008080">"MainFrame</font></font><font color="#008080"> </font><font color="#000080"><font color="#008080">by<font color="#000080"> </font>liigo<font color="#000080">.</font>com"</font>));<br>&#160;&#160;&#160; </font>mainFrame<font color="#000080">-></font><font color="#880000">Show </font><font color="#000080">();<br>&#160;&#160;&#160; </font><font color="#880000">SetTopWindow</font><font color="#000080">(</font>mainFrame<font color="#000080">);<br>&#160;&#160;&#160; </font><font color="#0000ff">return</font><font color="#000080"> </font><font color="#0000ff">true</font><font color="#000080">;<br>}</font></td>
        </tr>
    </tbody>
</table>
<p>在类定义的上方增加 wxWidgets App 定义：<font color="#a000a0">IMPLEMENT_APP</font><font color="#000080">(</font><font color="#0000ff">App</font><font color="#000080">)</font></p>
<p>最终 app.cpp 的内容如下（其中经过手工改写的地方已用<span style="background-color: #ffff00;" twffan="done">黄色背景</span>突出显示）：</p>
<table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">#include </font><font color="#008080">"app.h"<br><br></font><font color="#a000a0"><span style="background-color: #ffff00;" twffan="done">IMPLEMENT_APP</span></font><span style="background-color: #ffff00;" twffan="done"> <font color="#000080">(</font><font color="#0000ff">App</font></span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br><br></font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#0000ff"> App</font><font color="#000080">()<br>{<br>}<br><br></font><font color="#0000ff">App</font><font color="#000080">::~</font><font color="#0000ff">App</font><font color="#000080">()<br>{<br>}<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#880000">OnInit</font><font color="#000080">()<br>{<br>&#160;&#160;&#160; </font><font color="#000080"><font color="#0000ff">MainFrame</font>* mainFrame = <font color="#0000ff">new</font> <font color="#0000ff">MainFrame</font>(<font color="#a000a0">NULL</font>, <font color="#a000a0">_</font>(<font color="#008080">"MainFrame </font></font><font color="#008080">by <a  href="http://liigo.com/"><font color="#366217">liigo.com</font></a></font><font color="#000080"><font color="#008080">"</font>));<br>&#160;&#160;&#160; </font>mainFrame<font color="#000080">-></font><font color="#880000"> Show</font><font color="#000080">();<br>&#160;&#160;&#160; </font><font color="#880000">SetTopWindow</font><font color="#000080">(</font>mainFrame<font color="#000080">);<br>&#160;&#160;&#160; </font><font color="#0000ff">return</font><font color="#000080"> </font><font color="#0000ff">true</font><font color="#000080">;<br>}</font></span></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>　</p>
<h1>创建wxFrame子类</h1>
<p>点击菜单 Insert -> New
Class...，新建一个名称为"MainFrame"的类（类名称可以随意），考虑到代码的跨平台性，建议将其所在文件的名称修改为全部使用小写字母
（如 mainframe.h/mainframe.cpp）。此操作将生成文件 mainframe.h 和 mainframe.cpp。 </p>
<p>下面对VC生成的类代码进行相应的修改：</p>
<p>mainframe.h</p>
<blockquote>
<p>增加预编译头文件的包含：<font color="#0000ff">#include </font><font color="#008080">"wx_pch.h"</font></p>
<p>指定MainFrane类的父类为wxFrame：<font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080"> : </font><font color="#0000ff">public</font><font color="#000080"> </font><font color="#0000ff">wxFrame</font></p>
<p>修改构造函数的声明：<font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font> <font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">);</font></p>
<p>在类定义的末尾增加事件表声明：<font color="#a000a0">DECLARE_EVENT_TABLE</font><font color="#000080">()</font></p>
<p>最终 mainframe.h 的内容如下（其中经过手工改写的地方已用<span style="background-color: #ffff00;" twffan="done">黄色背景</span>突出显示）：</p>
<table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">#if </font><font color="#000080">!</font>defined<font color="#000080">(</font><font color="#a000a0">AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_</font><font color="#000080"> )<br></font><font color="#0000ff">#define </font><font color="#a000a0">AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_<br><br></font><font color="#0000ff">#if _MSC_VER</font><font color="#000080"> > </font><font color="#800000">1000<br></font><font color="#0000ff">#pragma </font>once<br><font color="#0000ff">#endif </font><font color="#008000">// _MSC_VER > 1000<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">#include </font></span><font color="#008080"><span style="background-color: #ffff00;" twffan="done">"wx_pch.h"</span><br><br></font><font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">MainFrame </font><font color="#000080"><span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">public</font><font color="#000080"> </font></span><font color="#0000ff"><span style="background-color: #ffff00;" twffan="done">wxFrame</span><br></font><font color="#000080">{<br></font><font color="#0000ff">public</font><font color="#000080">:<br>&#160;&#160;&#160; </font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><span style="background-color: #ffff00;" twffan="done"> <font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080"> & </font>title</span><font color="#000080">);<br>&#160;&#160;&#160; </font><font color="#0000ff">virtual</font><font color="#000080"> ~</font><font color="#0000ff">MainFrame</font><font color="#000080">();<br><br>&#160;&#160;&#160; </font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">DECLARE_EVENT_TABLE</font></span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">()</span><br>};<br></font><font color="#0000ff">#endif </font><font color="#008000">// !defined(AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_) </font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>mainframe.cpp</p>
<blockquote>
<p>修改构造函数的定义：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br>&#160;&#160;&#160; </font><font color="#008000">//wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text")); <br></font><font color="#000080">}</font></td>
        </tr>
    </tbody>
</table>
<p>增加事件表定义（BEGIN_EVENT_TABLE 与 END_EVENT_TABLE 之间保留空白，留待以后绑定事件）：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#a000a0">BEGIN_EVENT_TABLE<font color="#000080">(</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080">)<br><br></font>END_EVENT_TABLE<font color="#000080">()</font></font></td>
        </tr>
    </tbody>
</table>
<p>最终 mainframe.cpp 的内容如下（其中经过手工改写的地方已用<span style="background-color: #ffff00;" twffan="done">黄色背景</span>突出显示）：</p>
<table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">#include </font><font color="#008080">"mainframe.h"<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">BEGIN_EVENT_TABLE</font><font color="#000080"> (</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080">)<br><br></font><font color="#a000a0">END_EVENT_TABLE</font><font color="#000080">()</font> </span><font color="#a000a0"><span style="background-color: #ffff00;" twffan="done"><br></span><br></font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">( </font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title</span><font color="#000080">) <span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">wxFrame</font><font color="#000080"> (</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title</span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br>{<br></font><font color="#000080">&#160;&#160;&#160; </font><font color="#008000"><span style="background-color: #ffff00;" twffan="done">//wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text"));</span><br></font><font color="#000080">}<br><br></font><font color="#0000ff">MainFrame</font><font color="#000080"> ::~</font><font color="#0000ff">MainFrame</font><font color="#000080">()<br>{<br>}</font></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>　</p>
<p>至此，一个wxWidget的空白Project已经创建完毕</p>
<p><br></p>
<p>编译生成的 exe 文件的大小：</p>
<table border="1" cellpadding="2" cellspacing="0" width="53%">
    <tbody>
        <tr>
            <td width="32%">可执行文件大小</td>
            <td width="35%">Debug</td>
            <td width="46%">Release</td>
        </tr>
        <tr>
            <td width="32%">Unicode</td>
            <td width="35%">3.78M</td>
            <td width="46%">956K</td>
        </tr>
        <tr>
            <td width="32%">非Unicode</td>
            <td width="35%">3.60M</td>
            <td width="46%">932K</td>
        </tr>
    </tbody>
</table>
<p>此数据全部是静态链接wxWidgets的结果。动态链接的话，EXE的大小没有意义——别忘了wxWidgets的版DLLs的大小总共约4到5M（Release版）。</p>
<p>&#160;</p>
<h1>添加子控件</h1>
<p>向 wxFrame 或 wxDialog 中添加子控件是比较容易的，只需在其子类的构造函数中 new 相应的子控件就可以了。</p>
<p>这是最简单的情况：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br>&#160;&#160;&#160; </font><font color="#000080"><font color="#0000ff">wxTextCtrl </font><font color="#000080">* </font>text<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxTextCtrl</font><font color="#000080">(</font><font color="#0000ff"> this</font><font color="#000080">, </font>wxID_ANY<font color="#000080">, </font><font color="#a000a0">_</font><font color="#000080">(</font><font color="#008080">"some text"</font><font color="#000080">));<br></font></font><font color="#000080">}</font></td>
        </tr>
    </tbody>
</table>
<p>没错，只要"new"一下就搞定了，控件会自动出现在wxFrame中。这是运行结果：</p>
<p><br></p>
<p>如果界面再复杂一些，上面这种方法就行不通了，我们需要引入"Sizer"（详见<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a>（Sizer一览））：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br></font><font color="#000080">&#160;&#160;&#160; </font><font color="#0000ff">wxTextCtrl </font><font color="#000080">* </font>textCtrl<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxTextCtrl</font><font color="#000080">(</font><font color="#0000ff"> this</font><font color="#000080">, </font>ID_TEXTCTRL<font color="#000080">, </font><font color="#a000a0">_T</font><font color="#000080">(</font><font color="#008080">"some text"</font><font color="#000080">), </font>wxDefaultPosition<font color="#000080">, </font>wxDefaultSize<font color="#000080">, </font><font color="#a000a0">wxTE_MULTILINE</font><font color="#000080"> );<br>&#160;&#160;&#160; </font><font color="#0000ff">wxButton</font><font color="#000080"> * </font>button<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxButton</font><font color="#000080">(</font><font color="#0000ff">this</font><font color="#000080"> , </font>ID_BUTTON<font color="#000080">, </font><font color="#a000a0">_</font><font color="#000080">(</font><font color="#008080">"测试按钮"</font><font color="#000080">), </font>wxDefaultPosition<font color="#000080"> , </font>wxDefaultSize<font color="#000080">, </font><font color="#800000">0</font><font color="#000080"> );<br><br>&#160;&#160;&#160; </font><font color="#0000ff">wxBoxSizer</font><font color="#000080">* </font>vBoxSizer<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxBoxSizer</font><font color="#000080">(</font>wxVERTICAL<font color="#000080">);<br>&#160;&#160;&#160; </font><font color="#0000ff">this</font> <font color="#000080">-></font><font color="#880000">SetSizer</font><font color="#000080">(</font>vBoxSizer<font color="#000080">);<br><br>&#160;&#160;&#160; </font>vBoxSizer<font color="#000080">-></font><font color="#880000">Add </font><font color="#000080">(</font>textCtrl<font color="#000080">, </font><font color="#800000">1</font><font color="#000080">, </font>wxALL<font color="#000080">|</font>wxEXPAND<font color="#000080">, </font><font color="#800000">5</font><font color="#000080">);<br>&#160;&#160;&#160; </font>vBoxSizer<font color="#000080">-></font><font color="#880000">Add</font><font color="#000080">(</font>button<font color="#000080">, </font><font color="#800000">0</font><font color="#000080"> , </font>wxALIGN_CENTER_HORIZONTAL<font color="#000080">|</font>wxALL<font color="#000080">|</font>wxALIGN_BOTTOM<font color="#000080">, </font><font color="#800000">5</font><font color="#000080">);</font><font color="#000080"> <br></font><font color="#000080">}</font></td>
        </tr>
    </tbody>
</table>
<p>上面是多行编辑框控件，下面是按钮控件，当窗口大小变化时，编辑框控件将在水平和垂直方向上自动扩展，而按钮始终位于窗口底部居中。</p>
<p><br></p>
<p>上述代码中涉及的控件ID（ID_TEXTCTRL，ID_BUTTON）是我们在 mainframe.cpp 中自行定义的（定义控件ID的目的是为了下一步了事件处理）：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">enum</font><font color="#000080"> </font>CtrlID<br><font color="#000080">{<br>&#160;&#160;&#160; </font>ID_TEXTCTRL<font color="#000080">, </font>ID_BUTTON<br><font color="#000080">};</font></td>
        </tr>
    </tbody>
</table>
<p>&#160;</p>
<p>参考文档：<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a>（Sizer一览）</p>
<p>采用XML格式文件（XRC文件）定义程序界面也是不错的方式，详见：<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_xrcoverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_xrcoverview.html</font></a>（基于XML的资源系统一览）。</p>
<p>无论如何，手工进行界面布局总是很繁杂，我们需要（可视化）工具的帮助：<a  href="http://www.wxwidgets.org/apps2.htm"><font color="#366217">http://www.wxwidgets.org/apps2.htm</font></a></p>
<p>　</p>
<h1>处理事件</h1>
<p>在wxWidgets中处理事件，主要有两个步骤：编写"事件处理函数（方法）"，填写"事件表（EVENT_TABLE）"。</p>
<p>事件处理函数（方法）视事件的不同而有所不同，但也有规律：没有返回值，只有一个引用型参数（且一定是<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxevent.html#wxevent"><font color="#366217">wxEvent</font></a>的子类），不是虚方法（virtual method）。事件处理函数（方法）的名称没有特殊规定，可以自行命名。</p>
<p>作为示例，我们来处理上图中"测试按钮"被按下的事件。</p>
<p>根据wxWidgets文档，要处理按钮事件，需在自己的类中添加如下事件处理函数（方法）：<font color="#0000ff">void</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#880000">OnButtonClick</font> <font color="#000080">(</font><font color="#0000ff">wxCommandEvent</font><font color="#000080"> &</font>event<font color="#000080">)</font></p>
<p>具体说来就是，在 mainframe.h 文件中的 MainFrame 类中增加新的 OnButtonClick() 方法声明：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">private</font><font color="#000080">:<br>&#160;&#160;&#160; </font><font color="#0000ff">void</font><font color="#000080"> </font><font color="#880000">OnButtonClick</font><font color="#000080">(</font> <font color="#0000ff">wxCommandEvent</font><font color="#000080">& </font>event<font color="#000080">);</font></td>
        </tr>
    </tbody>
</table>
<p>并在 mainframe.cpp 文件中增加 OnButtonClick() 方法的定义：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#0000ff">void</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#880000">OnButtonClick</font><font color="#000080">(</font> <font color="#0000ff">wxCommandEvent</font><font color="#000080"> &</font>event<font color="#000080">)<br>{<br>&#160;&#160;&#160; </font><font color="#008000">//取编辑框中的文本并用信息框显示出来<br></font><font color="#000080">&#160;&#160;&#160; </font><font color="#0000ff">wxString</font><font color="#000080"> </font>text<font color="#000080"> = ((</font><font color="#0000ff">wxTextCtrl</font><font color="#000080">*)</font><font color="#0000ff">this</font><font color="#000080">-></font><font color="#a000a0"> FindWindow</font><font color="#000080">(</font>ID_TEXTCTRL<font color="#000080">))-></font><font color="#880000">GetValue</font><font color="#000080">();<br>&#160;&#160;&#160; </font><font color="#880000">wxMessageBox</font><font color="#000080"> (</font>text<font color="#000080">);<br>}</font></td>
        </tr>
    </tbody>
</table>
<p>下面需要在 mainframe.cpp 中填写"事件表（EVENT_TABLE）"，以便我们的"事件处理函数（方法）"能在适当的时机（即事件触发时）被调用：</p>
<table border="1" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="100%"><font color="#a000a0">BEGIN_EVENT_TABLE</font><font color="#000080">(</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080"> )<br>&#160;&#160;&#160; </font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">EVT_BUTTON</font><font color="#000080">(</font>ID_BUTTON<font color="#000080">, </font><font color="#0000ff">MainFrame</font><font color="#000080"> ::</font>OnButtonClick</span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br></font><font color="#a000a0">END_EVENT_TABLE</font><font color="#000080">()</font></td>
        </tr>
    </tbody>
</table>
<p>在这个事件表中，我们使用宏 EVT_BUTTON 指定了按钮的ID，以及"事件处理函数（方法）"。</p>
<p>注：上面一直讲"事件处理函数（方法）"，其实是"方法（method）"不是"函数（function）"，只是"方法"这个词在编程领域和在日
常生活中可以有不同的理解（"方法"也可以理解为"方式"），我如果说成"事件处理方法"，难免会产生歧义。当然，"事件处理函数（方法）"似乎也并不十
分合适，应称为"事件处理'方法'"或"事件处理方法（method）"？再深究下去就有咬文嚼字的嫌疑了，聪明的读者早已明白我的意思了吧？</p>
<br>
<p><br></p>
<p>　</p>
<p>如何处理其它事件？</p>
<p>说白了，关键要知道两点：事件处理函数（方法）的参数是什么类型，填写参数表时用哪一个宏（EVT_*）。</p>
<p>再补充一点：要知道"什么控件"在"什么时机"会触发"什么事件"。</p>
<p>要知道这些，就需要对wxWidgets的事件处理有一个比较全面的了解。</p>
<p>建议看一下wxWidgets官方文档中的这篇文章：<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html</font></a>（事件处理一览）</p>
<p>尤其是其中的 <a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html#eventmacros"><font color="#366217">Event macros summary</font></a>（事件宏概要）一段。</p>
<p>电子书《<a  href="http://www.phptr.com/content/images/0131473816/downloads/0131473816_book.pdf"><font color="#366217">Cross-Platform GUI Programming with wxWidgets</font></a>》附录9（Appendix I, 617页）中对事件处理时所涉及的事件类型（wxXXXEvent）和事件宏（EVT_*）有比较好的总结，建议看一下，最好打印出来放在手边，以便随时参考。 </p>
<p>本文所涉及的完整源代码可在此下载：<a  href="http://liigo.diy.myrice.com/article/wxProject/wxProject.zip"><font color="#366217">http://liigo.diy.myrice.com/article/wxProject/wxProject.zip</font></a></p>
<p>&#160;</p>
<h1>更进一步</h1>
<p>了解 Sizer，熟悉界面设计：<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a></p>
<p>了解 事件处理：<a  href="http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html"><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html</font></a></p>
<p>了解 wxWidgets 提供了哪些控件，它们各自的属性、方法、事件，以及它们的用法。</p>
<p>去 wxWidgets.org 上找第三方的控件/库：<a  href="http://www.wxwidgets.org/contrib2.htm#classes"><font color="#366217">http://www.wxwidgets.org/contrib2.htm#classes</font></a></p>
<p>去 <a  href="http://www.wxwidgets.org/wiki/index.php/Main_Page"><font color="#366217">wxWiki</font></a> 上找第三方的控件/库：<a  href="http://www.wxwidgets.org/wiki/index.php/Table_Of_Contents#Pages_about_classes.2C_functions_or_macros"><font color="#366217">http://www.wxwidgets.org/wiki/index.php/Table_Of_Contents#Pages_about_classes.2C_functions_or_macros </font></a></p>
<p>GUI库嘛？无非就是控件（component）的使用：布局、操作、事件处理。</p> <img src ="http://www.cppblog.com/kenlistian/aggbug/65986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-11-05 00:55 <a href="http://www.cppblog.com/kenlistian/archive/2008/11/05/65986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidgets框架例子</title><link>http://www.cppblog.com/kenlistian/archive/2008/06/03/52087.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 03 Jun 2008 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/06/03/52087.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/52087.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/06/03/52087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/52087.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/52087.html</trackback:ping><description><![CDATA[wxWidgets框架例子。<br>直接粘贴到vc中，运行即可。当然需要安装好wxwidgets及其配置好lib和include设置。<br><br>其解释部分非常详细，基本上wxwidgets和mfc差不了多少，但是扩充性和跨平台性是大于mfc，同时<br>也对熟悉ruby下的wxruby和wxpython是非常快速的。<br><br>#include "wx/wx.h"<br><br>// 定义应用程序类<br>class MyApp : public wxApp<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; virtual bool OnInit();<br>};<br><br>// 定义主窗口类<br>class MyFrame : public wxFrame<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; // 主窗口类的构造函数<br>&nbsp;&nbsp;&nbsp; MyFrame(const wxString&amp; title);<br><br>&nbsp;&nbsp;&nbsp; // 事件处理函数<br>&nbsp;&nbsp;&nbsp; void OnQuit(wxCommandEvent&amp; event);<br>&nbsp;&nbsp;&nbsp; void OnAbout(wxCommandEvent&amp; event);<br><br>private:<br>&nbsp;&nbsp;&nbsp; // 声明事件表<br>&nbsp;&nbsp;&nbsp; DECLARE_EVENT_TABLE()<br>};<br><br>// 有了这一行就可以使用 MyApp&amp; wxGetApp()了<br>DECLARE_APP(MyApp)<br><br>// 告诉wxWidgets主应用程序是哪个类<br>IMPLEMENT_APP(MyApp)<br><br>bool MyApp::OnInit()<br>{<br>&nbsp;&nbsp;&nbsp; // 创建主窗口<br>&nbsp;&nbsp;&nbsp; MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));<br><br>&nbsp;&nbsp;&nbsp; // 显示主窗口<br>&nbsp;&nbsp;&nbsp; frame-&gt;Show(true);<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>// MyFrame类的事件表<br>BEGIN_EVENT_TABLE(MyFrame, wxFrame)<br>&nbsp;&nbsp;&nbsp; EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)<br>&nbsp;&nbsp;&nbsp; EVT_MENU(wxID_EXIT,&nbsp; MyFrame::OnQuit)<br>END_EVENT_TABLE()<br><br>void MyFrame::OnAbout(wxCommandEvent&amp; event)<br>{<br>&nbsp;&nbsp;&nbsp; wxString msg;<br>&nbsp;&nbsp;&nbsp; msg.Printf(wxT("Hello and welcome to %s"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wxVERSION_STRING);<br><br>&nbsp;&nbsp;&nbsp; wxMessageBox(msg, wxT("About Minimal"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wxOK | wxICON_INFORMATION, this);<br>}<br><br>void MyFrame::OnQuit(wxCommandEvent&amp; event)<br>{<br>&nbsp;&nbsp;&nbsp; Close();<br>}<br><br>MyFrame::MyFrame(const wxString&amp; title)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : wxFrame(NULL, wxID_ANY, title)<br>{<br>&nbsp;&nbsp;&nbsp; // 设置窗口图标<br>&nbsp;&nbsp;&nbsp; //SetIcon(wxIcon(mondrian_xpm));<br><br>&nbsp;&nbsp;&nbsp; // 创建菜单条<br>&nbsp;&nbsp;&nbsp; wxMenu *fileMenu = new wxMenu;<br><br>&nbsp;&nbsp;&nbsp; // 添加&#8220;关于&#8221;菜单项<br>&nbsp;&nbsp;&nbsp; wxMenu *helpMenu = new wxMenu;<br>&nbsp;&nbsp;&nbsp; helpMenu-&gt;Append(wxID_ABOUT, wxT("&amp;About...\tF1"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wxT("Show about dialog"));<br><br>&nbsp;&nbsp;&nbsp; fileMenu-&gt;Append(wxID_EXIT, wxT("E&amp;xit\tAlt-X"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wxT("Quit this program"));<br><br>&nbsp;&nbsp;&nbsp; // 将菜单项添加到菜单条中<br>&nbsp;&nbsp;&nbsp; wxMenuBar *menuBar = new wxMenuBar();<br>&nbsp;&nbsp;&nbsp; menuBar-&gt;Append(fileMenu, wxT("&amp;File"));<br>&nbsp;&nbsp;&nbsp; menuBar-&gt;Append(helpMenu, wxT("&amp;Help"));<br><br>&nbsp;&nbsp;&nbsp; // ...然后将菜单条放置在主窗口上<br>&nbsp;&nbsp;&nbsp; SetMenuBar(menuBar);<br><br>&nbsp;&nbsp;&nbsp; // 创建一个状态条来让一切更有趣些。<br>&nbsp;&nbsp;&nbsp; CreateStatusBar(2);<br>&nbsp;&nbsp;&nbsp; SetStatusText(wxT("欢迎使用wxWidgets!"));<br>}<br><br><br><br>注意的是：<br>1.必须是windows框架而不是control程序框架<br>2.通过向导生成的stdafx.h 可以通过project/set/ "c/c++"中选择无编译头来去掉<br>stdafx.h<br>3.直接拷贝这些lib到工程设置<br>wxmsw28d_aui.lib wxmsw28d_html.lib wxmsw28d_xrc.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib <br>kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib <br>4.附加该lib的位置,或者把以上lib放置到vc6可以找到地方.<br>5.如果报有LIBCD.lib重复定义,填到ignore lib中<br>6.以上都是在vc6环境测试下通过。<br><br><br>
<img src ="http://www.cppblog.com/kenlistian/aggbug/52087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-06-03 22:54 <a href="http://www.cppblog.com/kenlistian/archive/2008/06/03/52087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>