20.5 解析命令行参数

允许程序在初始化的时候分析命令行参数是很有用的,对于一个文档视图架构的程序来说,你应该允许程序通过这样的方式打开文件.也可能你想让你的程序可以从命令行启动,以便进行一些自动化的工作,这时候你可以通过命令行参数告诉你的应用程序不要显示用户界面.虽然通常应用程序的大部分工作都是通过用户界面完成的,但是有时候命令行参数还是很有用的,比如用它来打开程序的调试开关.

wxWidgets提供了wxCmdLineParser类用来简化这部分的编程工作,以避免你需要直接处理wxApp::argc和 wxApp::argv.这个可以处理开关类型参数(比如-verbose),选项类型参数(比如-debug:1)以及命令参数(比如 "myfile.txt")等.对于开关类型参数和选项类型参数,它允许你设置它们的长参数形式和短参数形式,你还可以给每个参数提供一个帮助字符串,这个字符串将在需要显示使用帮助的时候打印在当前的Log目标上.

下面的例子演示了怎样使用开关类型,选项类型等各种参数:

#include "wx/cmdline.h"
static const wxCmdLineEntryDesc g_cmdLineDesc[] =
{
    { wxCMD_LINE_SWITCH, wxT("h"), wxT("help"),    wxT("displays help on the command line
 parameters") },
    { wxCMD_LINE_SWITCH, wxT("v"), wxT("version"), wxT("print version") },
    { wxCMD_LINE_OPTION, wxT("d"), wxT("debug"), wxT("specify a debug level") },

    { wxCMD_LINE_PARAM,  NULL, NULL, wxT("input file"), wxCMD_LINE_VAL_STRING,
 wxCMD_LINE_PARAM_OPTIONAL },
    { wxCMD_LINE_NONE }
};
bool MyApp::OnInit()
{
    // 分析命令行
    wxString cmdFilename;
    wxCmdLineParser cmdParser(g_cmdLineDesc, argc, argv);
    int res;
    {
        wxLogNull log;
        // 传递False参数以便在分析命名行发生错误的时候不显示使用帮助对话框.
        res = cmdParser.Parse(false);
    }
    // 检查是否用户正在询问使用帮助
    if (res == -1 || res > 0 || cmdParser.Found(wxT("h")))
    {
        cmdParser.Usage();
        return false;
    }
    // 检查是否用户正在询问版本号
    if (cmdParser.Found(wxT("v")))
    {
#ifndef __WXMSW__
        wxLog::SetActiveTarget(new wxLogStderr);
#endif
        wxString msg;
        wxString date(wxString::FromAscii(__DATE__));
        msg.Printf(wxT("Anthemion DialogBlocks, (c) Julian Smart, 2005 Version %.2f, %s"),
 wbVERSION_NUMBER, (const wxChar*) date);
        wxLogMessage(msg);
        return false;
    }
    // 检查是否用户希望以调试模式启动
    long debugLevel = 0;
    if (cmdParser.Found(wxT("d"), & debugLevel))
    {
    }
    // 检查是否用户传递了一个工程名
    if (cmdParser.GetParamCount() > 0)
    {
        cmdFilename = cmdParser.GetParam(0);
        // 在windows系统上,如果通过资源管理器打开一个文件的时候,
        // 传递的是短格式的文件名
        // 因此我们可以把它变成长格式文件名
        wxFileName fName(cmdFilename);
        fName.Normalize(wxPATH_NORM_LONG|wxPATH_NORM_DOTS|
                      wxPATH_NORM_TILDE|wxPATH_NORM_ABSOLUTE);
        cmdFilename = fName.GetFullPath();
    }
    ...
    return true;
}

使用wxFileName对文件名进行正常化是必要的,因为有时候在以命令行方式启动程序的时候,windows会传递短格式的文件名.

正如我们在前面介绍的那样,在MacOSX上,当打开一个文档的时候不使用命令行参数,而使用直接调用wxApp:: MacOpenFile函数的方法.但是命令行参数的方法确实在多数系统上是被使用的,因此,为了让你开发的程序适用于各种[平台,你还是应该提供命令行参数的支持.