wxWidgets应用程序:掌握参数解析技巧 - 实践
程序运行时的命令参数在程序启动前传入,用于动态修改程序配置,定义程序行为。命令参数是实用性程序的重要组成部分。wxWidgets在沿袭传统命令参数处理方式之外,采用对象化方式和工程化方式,提供了一个简洁高效的参数解析框架。
一、兼容C/C++
命令参数在程序启动前传入,用于动态修改程序配置,定义程序行为。与int main(int argc,char**argv)不同,wxWidgets程序不能从OnInit()函数中直接获取命令行参数。argc和argv参数存储在wxAppConsole的同名成员变量中,并在调用OnInit()之前完成初始化。您可以在wxApp子类中直接使用,也可以在wxApp类之外通过wxGetApp().argc或wxGetApp().argv访问。
bool MyApp::OnInit() {
std::cout<<"OnInit()"<
编译并运行实例:
./myapp a1 a2 a3 a4
程序将输出:

wxWidgets将c语言main函数的int argc,char**argv存储在类成员变量中,这样就可以像以往一样处理程序运行时的输入参数了。
二、框架化参数
除了直接使用wxApp中的argc和argv参数来操作初始化参数外,wxWidgets还提供了更简便的wxCmdLineParser类(<wx/cmdline.h>),它可以自动区分选项、开关和参数,允许选项分组,同时使用短和长选项,能够根据命令描述内容自动生成用法消息,还可以自动检查选项值的类型。它具有一个专业的应用程序解析命令行参数所需的全部功能。
命令行参数分为三种类型:
开关:布尔选项,不带任何值。例如,“-v”可能是一个开关,意思是“启用详细模式”。
选项:与开关参数类似,但附有参数相关的值。例如,“-o filename”可能是指定输出文件名的选项。
参数:必需的程序参数。
应用程序wxApp或wxAppConsole可以使用wxCmdLineEntryDesc数组描述程序支持的命令行参数,并通过wxCmdLineParser::SetDesc()传递给wxCmdLineParser对象并解析参数项。
wxCmdLineEntryDesc数组定义示例如下:
static const wxCmdLineEntryDesc cmdLineDesc[] ={
{ wxCMD_LINE_SWITCH, "h", "help", "show this help message",
wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
{ wxCMD_LINE_SWITCH, "d", "dummy", "a dummy switch",
wxCMD_LINE_VAL_NONE, 0 },
{ wxCMD_LINE_SWITCH, "s", "secret", "a secret switch",
wxCMD_LINE_VAL_NONE, wxCMD_LINE_HIDDEN },
// ... your other command line options here...
wxCMD_LINE_DESC_END
};
使用wxCommandParser的典型步骤为:1.构造wxCommandParser的对象;2.定义并调用SetDesc()设置命令行参数描述;3.设置用户命令行参数;4.调用Parse()解析用户命令行参数;5.使用Found()检索参数值。如下所示:
wxCmdLineParser parser;
parser.SetDesc(cmdLineDesc);
parser.SetCommnadLine(argc,argv);
//或 wxCmdLineParser parser(cmdLineDesc,argc,argv);
switch ( parser.Parse() ){
case -1:
//错误的参数格式,打印帮助信息
break;
case 0:
//正确解析
if (parser.Found("d")){
wxPrintf("Dummy...\n");
}
if (parser.Found("s")){
wxPrintf("Secret...\n");
}
break;
default:
break;
}
结构体wxCmdLineEntryDesc定义一个命令行参数的全部信息,包含:
1、kind:为枚举类型wxCmdLineEntryType,标识参数类型,其定义如下:
表 1wxCmdLineEntryType定义
wxCMD_LINE_SWITCH
浙公网安备 33010602011771号