Command-Line Arguments

From WxWiki
Jump to: navigation, search

Pitfalls

Given the below example, don't use parser.SetCmdLine(argc, argv);. This will set the parser to use a different command line parameters than what is passed to the program.

File Examples

#include <wx/wxprec.h>
#include <wx/cmdline.h>

#ifndef WX_PRECOMP
       #include <wx/wx.h>
#endif

class MyApp: public wxApp
{
public:

    // from wxApp
    virtual bool OnInit();
    virtual int OnExit();
    virtual int OnRun();
    virtual void OnInitCmdLine(wxCmdLineParser& parser);
    virtual bool OnCmdLineParsed(wxCmdLineParser& parser);

private:
    bool silent_mode;
};

static const wxCmdLineEntryDesc g_cmdLineDesc [] =
{
     { wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("displays help on the command line parameters"),
          wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
     { wxCMD_LINE_SWITCH, wxT("t"), wxT("test"), wxT("test switch"),
          wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_MANDATORY  },
     { wxCMD_LINE_SWITCH, wxT("s"), wxT("silent"), wxT("disables the GUI") },

     { wxCMD_LINE_NONE }
};

DECLARE_APP(MyApp)
#include "main.h"

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    // call default behaviour (mandatory)
    if (!wxApp::OnInit())
        return false;

    // some application-dependent treatments...

    // Show the frame
    wxFrame *frame = new wxFrame((wxFrame*) NULL, -1, _T("Hello wxWidgets World"));
    frame->CreateStatusBar();
    frame->SetStatusText(_T("Hello World"));
    frame->Show(TRUE);
    SetTopWindow(frame);
    return true;
}

int MyApp::OnExit()
{
    // clean up
    return 0;
}

int MyApp::OnRun()
{
    int exitcode = wxApp::OnRun();
    //wxTheClipboard->Flush();
    if (exitcode!=0)
        return exitcode;
}

void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
{
    parser.SetDesc (g_cmdLineDesc);
    // must refuse '/' as parameter starter or cannot use "/path" style paths
    parser.SetSwitchChars (wxT("-"));
}

bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
{
    silent_mode = parser.Found(wxT("s"));

    // to get at your unnamed parameters use
    wxArrayString files;
    for (int i = 0; i < parser.GetParamCount(); i++)
    {
            files.Add(parser.GetParam(i));
    }

    // and other command line parameters

    // then do what you need with them.

    return true;
}

You may also need to look for wxApp::CleanUp() and wxApp::ProcessIdle().