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 + -
显示快捷键?