目前在Windows平台中有比较多的界面程序框架:GTK+、Qt、wxWidgets、MFC、WTL、WPF,而真正支持跨平台的只有Qt和wxWidgets两种。wxWidgets比较小巧学习成本稍低,实际上每种界面框架库都有自己的优缺点。选择wxWidgets作为界面库学习目标,主要是因为该库作为codeblocks默认的界面库与开发工具的结合比较紧密,仅此而已。
创建窗口界面程序
此处的#wx是全局变量,需要提前设定(参考之前的文章)
在Other linker options中添加如下静态链接库:
-lwx_mswu_xrc-3.2
-lwx_mswu_html-3.2
-lwx_mswu_qa-3.2
-lwx_mswu_core-3.2
-lwx_baseu_xml-3.2
-lwx_baseu_net-3.2
-lwx_baseu-3.2
-lwxexpat-3.2
-lwxjpeg-3.2
-lwxpng-3.2
-lwxregexu-3.2
-lwxtiff-3.2
-lwxzlib-3.2
-lwxscintilla-3.2
在Serch directories—Compiler中添加编译相关版本头文件目录
在Serch directories—Linker中添加编译相关版本库目录
在Serch directories—Resource Compiler中添加编译相关版本的资源库目录
编译程序
编译报错
问题原因是在Debug设置中添加了不存在的库文件,解决方法是在Debug配置中删除相关库文件配置即可。
再次编译程序
运行程序
窗口界面设置
通过资源编辑器窗口设置属性
重新编译运行程序可以看到修改结果
通过写代码设置属性
在SDKLearnMain.cpp中的初始化函数中添加如下代码:
//设置窗口名称
SetTitle("SDK学习");
//设置窗口图标
static const char *graph[] = {
// columns rows colors chars-per-pixel
"16 16 4 2",
" c black",
". c #BA1825",
"X c gray100",
"UX c None",
// pixels
"UX. . . . . . . . . . . . . . UX",
". . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . ",
". . . . . . . . . . . X X . . . ",
". . . . . . . . . . . X X . . . ",
". . . . . . . . . . . X X . . . ",
". . . . . X X . . . . X X . . . ",
". . . . . X X . . . . X X . . . ",
". . . . . X X . X X . X X . . . ",
". . . . . X X . X X . X X . . . ",
". . . . . X X . X X . X X . . . ",
". . . . . X X . X X . X X . . . ",
". . . X X X X X X X X X X . . . ",
". . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . ",
"UX. . . . . . . . . . . . . . UX"
};
SetIcon( wxIcon( graph ) );
//设置窗口大小
int cxScreen = wxSystemSettings::GetMetric(wxSYS_SCREEN_X)/1.5 +200; // wide
int cyScreen = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y)/1.5 ; // high
SetSize(cxScreen,cyScreen);
//窗口居中
Center();
通常对于拷贝来的代码段在代码编辑窗口中通常都是格式混乱的,我们可以通过右键菜单Format use AStyle完成代码的格式调整。
保存窗口修改,重新编译并运行程序
添加Notebook控件
通过资源编辑窗口设置Notebook窗口Tab位置和边框类型
向Notebook控件中添加Page页
可以在资源编辑窗口中直接通过Notebook控件上的Tab页位置右键菜单实现新Tab页的添加。
通过切换Tab页实现系统菜单变化可以通过wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED事件处理来实现。下面是实现的操作与代码:
首先在资源编辑窗口中选中Notebook控件
然后在控件事件列表中选中wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED事件并创建事件处理函数事件处理函数代码如下:
wxString curName=m_SDKLearnNotebook->GetPageText(event.GetSelection());
auto nm=GetMenuBar()->FindMenu(curName);
if(wxNOT_FOUND==nm)
{
if(curName.Contains(_("System")))
{
GetMenuBar()->SetMenuLabel(0,L"System");
}
else if(curName.Contains(_("Basic")))
{
GetMenuBar()->SetMenuLabel(0,L"Basic");
}
else if(curName.Contains(_("Network")))
{
GetMenuBar()->SetMenuLabel(0,L"Network");
}
else if(curName.Contains(_("Database")))
{
GetMenuBar()->SetMenuLabel(0,L"Database");
}
else if(curName.Contains(_("AI")))
{
GetMenuBar()->SetMenuLabel(0,L"AI");
}
else if(curName.Contains(_("Multimedia")))
{
GetMenuBar()->SetMenuLabel(0,L"Multimedia");
}
}
向Notebook控件中添加Panel页
实际上为了更加细致控制Notebook中的Tab页,可以通过创建新的Panel类来实现Tab页的完全控制。主要用于需要进行图形绘制或视频显示的场景。
添加Panel资源
向Notebook中添加Panel页
在SDKLearnMain.cpp中添加如下代码:
//引入Panel头文件
#include "SystemPanel.h"
//创建Panel指针变量
SystemPanel* m_SystemPanel;
//在初始化函数中添加Panel到NoteBook中
m_SystemPanel=new SystemPanel(m_SDKLearnNotebook);
m_SDKLearnNotebook->AddPage(m_SystemPanel,L"SystemPanel");
//在析构函数中删除Panel指针
if(NULL!=m_SystemPanel)
delete m_SystemPanel;
编译运行结果如下:
向Panel页中添加wxListCtrl控件
向Panel中添加右键菜单
完成菜单项添加后,在Resources窗口中选择新建菜单,在菜单属性区设置Var name
在Resources窗口中选择Panel页属性区{}按钮设置EVT_RIGHT_UP事件响应函数
设置EVT_RIGHT_UP事件响应函数名,编辑事件响应函数,显示右键菜单。
void SystemPanel::OnRightUp(wxMouseEvent& event)
{
PopupMenu( &m_SystemMenu, event.GetX(), event.GetY() );
}
编译运行,效果如下:
在右侧资源编辑窗口中,双击菜单图标进入菜单编辑窗口
点击New按钮添加菜单项
设置菜单ID和菜单名称,点OK按钮生成菜单项
在Resources窗口中选择新建菜单项,在菜单属性区设置Var name
在菜单属性区选择{}按钮设置菜单选中事件
设置菜单响应事件处理函数名
在事件处理函数中添加事件处理内容
#include <wx/msgdlg.h>
void SystemPanel::Onm_GetVersionSelected(wxCommandEvent& event)
{
wxMessageBox(msg, _("Welcome to..."));
}
编译并运行,结果如下:
至此,我们完成了通过codeblocks创建简单窗口界面程序的学习。