demo_win_manager.cpp

来自「ncbi源码」· C++ 代码 · 共 287 行

CPP
287
字号
/* * =========================================================================== * PRODUCTION $Log: demo_win_manager.cpp,v $ * PRODUCTION Revision 1000.0  2004/06/01 21:32:29  gouriano * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4 * PRODUCTION * =========================================================================== *//*  $Id: demo_win_manager.cpp,v 1000.0 2004/06/01 21:32:29 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Andrey Yazhuk * * File Description: *    Test application for demonstartion of Window Manager and CFrameWindow classes */#include <ncbi_pch.hpp>#include <corelib/ncbiapp.hpp>#include <corelib/ncbienv.hpp>#include <corelib/ncbiargs.hpp>#include <gui/utils/accel_table.hpp>#include <gui/widgets/workspace/frame_window.hpp>#include <gui/widgets/workspace/window_manager.hpp>#include <gui/widgets/workspace/test_client.hpp>#include <FL/Fl_Group.H>USING_NCBI_SCOPE;/// Commands specific for this applicationenum EWMDemoCommands   {    eCmdExit = 10000,    eCmdCreateFLClient,    eCmdCreateGLClient,    eCmdDestroyClient};///////////////////////////////////////////////////////////////////////////////  CWinManagerAppclass CWinManagerApp :  public CNcbiApplication,                        public CCommandTarget // application should be able to handle commands{private:    virtual void Init(void);    virtual int  Run(void);    virtual void Exit(void);    void    x_Create();    void    x_Destroy();    void    x_CreateWindowManager();            DECLARE_CMD_MAP()        void    OnExit();    void    OnCreateClient(TCmdID cmd); // range command handler	void    OnDestroyClient();    void    OnUpdateDestroyClient(ICmdUI* pCmdUI); // command update handlerprivate:    CFrameWindow    *m_Frame;    CWindowManager  *m_WindowManager;          list<IWMClient*>    m_Clients;    int m_ClientsCount;};void CWinManagerApp::Init(void){    // Create command-line argument descriptions class    auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);    // Specify USAGE context    arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),                              "Window Manager, Main Frame demo");    arg_desc->AddFlag("plastic", "Use the plastic scheme");    // Setup arg.descriptions for this application    SetupArgDescriptions(arg_desc.release());}int CWinManagerApp::Run(void){    CArgs args = GetArgs();    if (args["plastic"]) {        Fl::scheme("plastic");    }        char *argv[1];    argv[0] = "demo_win_manager";    x_Create();    m_Frame->show();//1, argv);    while(m_Frame->shown()) { // message loop        Fl::wait();    }    x_Destroy();            return 0;}void CWinManagerApp::Exit(void){    SetDiagStream(0);}///////////////////////////////////////////////////////////////////////////////  MAINint main(int argc, const char* argv[]){    // Execute main application function    return CWinManagerApp().AppMain(argc, argv, 0, eDS_Default, 0);}///////////////////////////////////////////////////////////////////////////////  Application logic/// Here we define static part of top-level menu. It contains empty submenus that/// will be later used as merge points for clientsDEFINE_MENU(BaseMenu)    SUBMENU("File")        MENU_ITEM(eCmdCreateFLClient, "Create FLTK Client")        MENU_ITEM(eCmdCreateGLClient, "Create OpenGL Client")        MENU_ITEM(eCmdDestroyClient, "Destroy Client")        MENU_SEPARATOR()        MENU_ITEM(eCmdExit, "Exit")    END_SUBMENU()    SUBMENU("Commands") // merge point for clients    END_SUBMENU()    SUBMENU("Window") // merge point for Window Manager    END_SUBMENU()END_MENU()BEGIN_CMD_MAP(CWinManagerApp, CCommandTarget)    ON_COMMAND_RANGE(eCmdCreateFLClient, eCmdCreateGLClient, &CWinManagerApp::OnCreateClient)	ON_COMMAND(eCmdDestroyClient, &CWinManagerApp::OnDestroyClient)    ON_UPDATE_COMMAND_UI(eCmdDestroyClient, &CWinManagerApp::OnUpdateDestroyClient)    ON_COMMAND(eCmdExit, &CWinManagerApp::OnExit)END_CMD_MAP()void    CWinManagerApp::x_Create(){    // initilize Resource Manager and Menu     CRef<CResourceManager> rm(new CResourceManager("<home>;<std>"));    CMenu::SetResourceManager(rm);        x_CreateWindowManager();        m_Frame = new CFrameWindow(800, 600, "");        /// create backbone of top-level menu    CMenuItem* root = CreateMenuItems(BaseMenu);    m_Frame->ResetMenu(*root);       delete root;        /// register hint for commands    CMenu::SetCmdHint(eCmdExit, "Exits application");    CMenu::SetCmdHint(eCmdCreateFLClient, "Creates new FLTK  window");    CMenu::SetCmdHint(eCmdCreateGLClient, "Creates new OpenGL window");    CMenu::SetCmdHint(eCmdDestroyClient, "Destroys current client window");    /// add Client and merge client menus    m_Frame->SetClient(m_WindowManager);    m_Frame->AddChildCmdTarget(this); // let application process commands    // register accelerators for commands defined by the applicatio    CAccelTable::RegisterAccelerator(FL_ALT  + 'X', eCmdExit);    CAccelTable::RegisterAccelerator(FL_CTRL + 'F', eCmdCreateFLClient);    CAccelTable::RegisterAccelerator(FL_CTRL + 'G', eCmdCreateGLClient);    CAccelTable::RegisterAccelerator(FL_CTRL + 'D', eCmdDestroyClient);}void    CWinManagerApp::x_CreateWindowManager(){    m_WindowManager = new CWindowManager();    // create clients       m_ClientsCount = 0;    for( int i = 1; i < 1; i++) {        OnCreateClient(eCmdCreateFLClient);    }}void    CWinManagerApp::x_Destroy(){    m_Frame->SetClient(NULL);    delete m_WindowManager;    delete m_Frame;        NON_CONST_ITERATE(list<IWMClient*>, it, m_Clients)  {        delete *it;    }}void CWinManagerApp::OnExit(){    m_Frame->hide();}void CWinManagerApp::OnCreateClient(TCmdID cmd){    int type = m_ClientsCount % 3 + 1;    string label = "Client " + NStr::IntToString(m_ClientsCount + 1);	IWMClient* client =  (cmd == eCmdCreateFLClient) ? (IWMClient*) new CFLTestClient(type, label.c_str())						   : (IWMClient*) new CGLTestClient(type, label.c_str());    m_Clients.push_back(client);    m_ClientsCount++;        // add client to Window Manager    m_WindowManager->AddClientInTab(client);}void    CWinManagerApp::OnUpdateDestroyClient(ICmdUI* pCmdUI){    pCmdUI->Enable(m_WindowManager  &&  m_WindowManager->GetActiveClient());}void    CWinManagerApp::OnDestroyClient(){    IWMClient* client = m_WindowManager ? m_WindowManager->GetActiveClient() : NULL;    if(client)  {        if(m_WindowManager->RemoveClient(client))   {            list<IWMClient*>::iterator it = find(m_Clients.begin(), m_Clients.end(), client);            m_Clients.erase(it);            delete client;        }    }}/* * =========================================================================== * $Log: demo_win_manager.cpp,v $ * Revision 1000.0  2004/06/01 21:32:29  gouriano * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4  2004/05/21 22:27:56  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.3  2004/05/20 12:43:09  dicuccio * Minor formatting change * * Revision 1.2  2004/05/13 17:37:36  yazhuk * Added support for menu hints, accelerators, command to create OpenGL client * * Revision 1.1  2004/05/07 14:27:53  yazhuk * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?