CrossPlatform GUI Programming with wxWidgets [Electronic resources]

Julian Smart; Kevin Hock; Stefan Csomor

نسخه متنی -صفحه : 261/ 163
نمايش فراداده

  • Parsing the Command Line

    Passing commands to the application to be read on initialization is often useful, and if the application is document-oriented, you should allow files to be loaded in this way. You also might want to let the application be run from the operating system command line, for example to automate tasks from a makefile, in which case command-line options can be used to tell the application that it should be run without a user interface. Although most configuration of an application will be done via the user interface, command-line configuration options can be appropriate in some cases, such as turning on a debug mode.[View full width]

    #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() { // Parse command line wxString cmdFilename; wxCmdLineParser cmdParser(g_cmdLineDesc, argc, argv); int res; { wxLogNull log; // Pass false to suppress auto Usage() message res = cmdParser.Parse(false); } // Check if the user asked for command-line help if (res == -1 || res > 0 || cmdParser.Found(wxT("h"))) { cmdParser.Usage(); return false; } // Check if the user asked for the version 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; } // Check for debug level long debugLevel = 0; if (cmdParser.Found(wxT("d"), & debugLevel)) { } // Check for a project filename if (cmdParser.GetParamCount() > 0) { cmdFilename = cmdParser.GetParam(0); // Under Windows when invoking via a document // in Explorer, we are passed the short form. // So normalize and make the long form. wxFileName fName(cmdFilename); fName.Normalize(wxPATH_NORM_LONG|wxPATH_NORM_DOTS| wxPATH_NORM_TILDE|wxPATH_NORM_ABSOLUTE); cmdFilename = fName.GetFullPath(); } ... return true; }

    The use of wxFileName for normalizing the file name is necessary because Windows sometimes passes the short form when the application is invoked from the command line.

    As we noted earlier in the chapter, Mac OS X doesn''''t use the command line when running an application by opening an associated document; instead, wxApp::MacOpenFile is called after the application has initialized. However, the command-line method is used by other operating systems. If you intend to write a document-based application for Mac OS X and other operating systems, you should allow for both methods.