📄 mdi.cpp
字号:
////////////////////////////////////////////////////////////////////////////// Name: mdi.cpp// Purpose: MDI sample// Author: Julian Smart// Modified by:// Created: 04/01/98// RCS-ID: $Id: mdi.cpp,v 1.20 2004/04/26 04:25:13 wq1977 Exp $// Copyright: (c) Julian Smart and Markus Holzem// Licence: wxWindows license/////////////////////////////////////////////////////////////////////////////// ===========================================================================// declarations// ===========================================================================// ---------------------------------------------------------------------------// headers// ---------------------------------------------------------------------------// For compilers that support precompilation, includes "wx/wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__ #pragma hdrstop#endif#ifndef WX_PRECOMP #include "wx/wx.h" #include "wx/mdi.h"#endif#include "wx/toolbar.h"#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) #include "mondrian.xpm"#endif#include "bitmaps/new.xpm"#include "bitmaps/open.xpm"#include "bitmaps/save.xpm"#include "bitmaps/copy.xpm"#include "bitmaps/cut.xpm"#include "bitmaps/paste.xpm"#include "icon1.xpm"#include "icon2.xpm"#include "icon3.xpm"#include "icon4.xpm"#include "icon5.xpm"#include <wx/treectrl.h>#include <wx/imaglist.h>#include <wx/datetime.h>#include "wx/grid.h"#include "wx/generic/gridctrl.h"#include "wx/grid.h"#include <wx/memory.h>#include <wx/config.h>#include <wx/accel.h>#include <wx/radiobox.h>#include "math.h"#include "mdi.h"IMPLEMENT_APP(MyApp)// ---------------------------------------------------------------------------// global variables// ---------------------------------------------------------------------------const char *gVersion="0.10";MyFrame *frame = (MyFrame *) NULL;wxList my_children;// For drawing lines in a canvasstatic long xpos = -1;static long ypos = -1;static int gs_nFrames = 0;#include <wx/listimpl.cpp>WX_DEFINE_LIST(MyXmlNodeList);WX_DEFINE_LIST(MonthDataList);WX_DEFINE_LIST(ColourDescList);WX_DEFINE_LIST(childvalueList);// ---------------------------------------------------------------------------// event tables// ---------------------------------------------------------------------------BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame) EVT_MENU(MDI_ABOUT, MyFrame::OnAbout) EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow) EVT_MENU(MDI_QUIT, MyFrame::OnQuit) EVT_MENU(POPUP_CREATEBROWSERWIN, MyFrame::OnCreateBrowserWin) EVT_MENU(POPUP_ADDMONEYTYPE, MyFrame::OnAddMoneyType) EVT_MENU(POPUP_DELETETYPE, MyFrame::OnDeleteMoneyType) EVT_MENU(POPUP_SETASDEFAULT, MyFrame::OnSetDefault) EVT_MENU(POPUP_SETBASE, MyFrame::OnSetIncomingBase) EVT_MENU(POPUP_CREATECUSTOMBROWSER, MyFrame::OnCreateCustomBrowser) EVT_MENU(POPUP_CREATECHART, MyFrame::OnCreateChart) EVT_MENU(POPUP_CREATECUSTOMCHART, MyFrame::OnCreateCustomChart) EVT_MENU(VIEW_MONTH_OUT, MyFrame::OnViewMonthOut) EVT_MENU(TOOL_CALCHOUSEFEE, MyFrame::OnCalcHouseFee) EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl,MyFrame::OnTreeItemRightClick) EVT_TREE_SEL_CHANGING(TreeTest_Ctrl,MyFrame::OnTreeItemSelChanging) EVT_CLOSE(MyFrame::OnClose) EVT_SIZE(MyFrame::OnSize)END_EVENT_TABLE()// Note that MDI_NEW_WINDOW and MDI_ABOUT commands get passed// to the parent window for processing, so no need to// duplicate event handlers here.BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame) EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit) EVT_MENU(MDI_REFRESH, MyChild::OnRefresh) EVT_MENU(MDI_CHANGE_TITLE, MyChild::OnChangeTitle) EVT_MENU(MDI_CHANGE_POSITION, MyChild::OnChangePosition) EVT_MENU(MDI_CHANGE_SIZE, MyChild::OnChangeSize) EVT_SIZE(MyChild::OnSize) EVT_MOVE(MyChild::OnMove) EVT_CLOSE(MyChild::OnClose)END_EVENT_TABLE()BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_MOUSE_EVENTS(MyCanvas::OnEvent)END_EVENT_TABLE()BEGIN_EVENT_TABLE(MyGridFrame, wxMDIChildFrame) EVT_MENU(NORMAL_UP_ID, MyGridFrame::OnUpKeyPress) EVT_MENU(NORMAL_DOWN_ID, MyGridFrame::OnDownKeyPress) EVT_MENU(NORMAL_TAB_ID, MyGridFrame::OnTabKeyPress) EVT_MENU(MDI_CHILD_QUIT, MyGridFrame::OnQuit) EVT_MENU(POPUP_DELETEREC, MyGridFrame::OnDeleteRec) EVT_SIZE(MyGridFrame::OnSize) EVT_CLOSE(MyGridFrame::OnClose) EVT_TEXT_ENTER(MTEXT_1, MyGridFrame::OnKeyDown) EVT_TEXT_ENTER(MTEXT_2, MyGridFrame::OnKeyDown) EVT_TEXT_ENTER(MTEXT_3, MyGridFrame::OnKeyDown) EVT_GRID_ROW_SIZE(MyGridFrame::OnRowSize) EVT_GRID_COL_SIZE(MyGridFrame::OnColSize) EVT_GRID_CELL_CHANGE(MyGridFrame::OnCellValueChanged ) EVT_GRID_CELL_RIGHT_CLICK(MyGridFrame::OnCellRightClick) END_EVENT_TABLE()BEGIN_EVENT_TABLE(MyCalendarDialog, wxDialog) EVT_BUTTON(-1, MyCalendarDialog::OnButton)END_EVENT_TABLE()BEGIN_EVENT_TABLE(MyCalcHouseFeeDialog, wxDialog) EVT_BUTTON(-1, MyCalcHouseFeeDialog::OnButton)END_EVENT_TABLE()BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar) EVT_LEFT_DCLICK(MyStatusBar::OnDbClick)END_EVENT_TABLE()// ===========================================================================// implementation// ===========================================================================// ---------------------------------------------------------------------------// MyApp// ---------------------------------------------------------------------------// Initialise this in OnInit, not staticallybool MyApp::OnInit(){ // Create the main frame window // initialize localisazion { /*Borland C++ 5.5 compiler has one error about setLocale.*/ wxLog *logger=new wxLogStderr(); wxLog *pOldLog = wxLog::SetActiveTarget(logger); m_locale.Init(); wxLog::SetActiveTarget(pOldLog); delete(logger); } m_locale.AddCatalog ("liliMoney"); frame = new MyFrame((wxFrame *)NULL, -1, _("MDI Demo"), wxPoint(-1, -1), wxSize(800, 600), wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL | wxMAXIMIZE); // Give it an icon#ifdef __WXMSW__ frame->SetIcon(wxIcon(_T("mdi_icn")));#else frame->SetIcon(wxIcon( mondrian_xpm ));#endif#if 0 frame->CreateStatusBar(); wxStatusBar *statbarOld = frame->GetStatusBar(); if ( statbarOld ) { statbarOld->Hide(); }#endif frame->statusbar = new MyStatusBar(frame,-1); frame->SetStatusBar(frame->statusbar); frame->UpdateStatusBar(); frame->Show(TRUE); frame->PositionStatusBar(); frame->stdata.recheight = 20; frame->stdata.colswidth[0] = 70; frame->stdata.colswidth[1] = 70; frame->stdata.colswidth[2] = 100; frame->GetAllConfig(&frame->stdata); SetTopWindow(frame); wxTreeItemId item = frame->textWindow->GetSelection(); if (item.IsOk()) { frame->CreateBrowserWindow(&item); } else { frame->CreateBrowserWindow(); } wxAcceleratorEntry entries[4]; entries[0].Set(wxACCEL_CTRL, (int) 'N', MDI_NEW_WINDOW); entries[1].Set(wxACCEL_CTRL, (int) 'X', MDI_QUIT); entries[2].Set(wxACCEL_CTRL, (int) 'A', MDI_ABOUT); entries[3].Set(wxACCEL_NORMAL, WXK_F3, VIEW_MONTH_OUT); wxAcceleratorTable accel(4, entries); frame->SetAcceleratorTable(accel); return TRUE;}// ---------------------------------------------------------------------------// MyFrame// ---------------------------------------------------------------------------// Define my frame constructorMyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long style) : wxMDIParentFrame(parent, id, title, pos, size, style | wxNO_FULL_REPAINT_ON_RESIZE){ textWindow = new wxTreeCtrl(this, TreeTest_Ctrl, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE); //init brush for (int i=0;i<MAX_COLOR_BRUSH_COUNT;i++) { gColorBrush[i]= new wxBrush(wxColour(colorbase[i][0],colorbase[i][1],colorbase[i][2]),wxSOLID); } wxImageList *images = new wxImageList(16, 16, TRUE); wxIcon icons[5]; icons[0] = wxIcon(icon1_xpm); icons[1] = wxIcon(icon2_xpm); icons[2] = wxIcon(icon3_xpm); icons[3] = wxIcon(icon4_xpm); icons[4] = wxIcon(icon5_xpm); textWindow->AssignImageList(images); for (int i=0;i<5;i++) images->Add(icons[i]); CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL); InitToolBar(GetToolBar()); moneybook = new MoneyBook("data//lili.xml",textWindow); moneybook->uiExpendAll(moneybook->rootitem);}MyFrame::~MyFrame(){ delete(moneybook); for (int i=0;i<MAX_COLOR_BRUSH_COUNT;i++) { delete(gColorBrush[i]); }}void MyFrame::UpdateStatusBar(void){ MyStatusBar *statbarTop = frame->statusbar; static const int widthsFor2Fields[] = { -1,150,150,-1}; wxDouble TotalCnt; wxDouble MonthRate; long terms; wxDateTime startdate; long PayMethod; if (moneybook->GetHousePay(&TotalCnt, &MonthRate, &terms, &startdate, &PayMethod)) { statbarTop->SetFieldsCount(4,widthsFor2Fields); wxDouble lastMonthIn=0,lastMonthOut=0,BaseAcount; moneybook->GetMonthTotalCnt(moneybook->InComingNode, &lastMonthIn, wxDateTime::Today()-wxDateSpan::Month()); moneybook->GetMonthTotalCnt(moneybook->OutGoingNode, &lastMonthOut, wxDateTime::Today()-wxDateSpan::Month()); BaseAcount = moneybook->GetTotalInComing() + moneybook->GetBaseInComing() - moneybook->GetTotalOutGoing() - moneybook->GetBaseOutGoing(); if (lastMonthIn <= lastMonthOut) { SetStatusText(_("You can neven payoff your house!"),3); } else { int i = moneybook->GetMonthCntForPayHouse(TotalCnt, MonthRate, terms, startdate, PayMethod, BaseAcount, lastMonthIn - lastMonthOut, terms); if (i==-1) { SetStatusText(_("Maybe you will delay to pay off your house!"),3); } else { SetStatusText((wxString::Format(_("You can pay off your house at %s"),((startdate + wxDateSpan::Months(i)).FormatISODate()).c_str())).mb_str(),3); } } } else { statbarTop->SetFieldsCount(3,widthsFor2Fields); } wxDouble monthtotal=0; moneybook->GetMonthTotalCnt(moneybook->OutGoingNode, &monthtotal); SetStatusText(wxString::Format(_("Month Total Out:%10.2f"),monthtotal),1); SetStatusText(wxString::Format(_("Total Acount Left:%9.2f"), moneybook->GetTotalInComing() + moneybook->GetBaseInComing() - moneybook->GetTotalOutGoing() - moneybook->GetBaseOutGoing()),2);}void MyFrame::OnClose(wxCloseEvent& event){ event.Skip();}void MyFrame::OnSetIncomingBase(wxCommandEvent& WXUNUSED(event)){ wxTextEntryDialog dialog(this, _("Set Base Acount"), _("Please Input the Base Acount:"), "0.00", wxOK | wxCANCEL); if (dialog.ShowModal() == wxID_OK) { wxTreeItemId id = textWindow->GetSelection(); if (id.IsOk()) { wxString str=dialog.GetValue(); wxDouble db; str.ToDouble(&db); if (!moneybook->SetBaseAcount(&id, db)) { wxLogError(_("Problem when set base count!")); } UpdateStatusBar(); } else { wxLogError(_("You Should Choose one base Type!")); } }}void MyFrame::OnSetDefault(wxCommandEvent& WXUNUSED(event)){ wxTreeItemId id; id = textWindow->GetSelection(); if (id.IsOk()) { if (!moneybook->SetDefault(&id)) { wxLogError(_("Problem when Set Default Type!")); } } }bool MyFrame::GetAllConfig(LiliMoneyConfigData *pstdata){ wxConfigBase *cfg = wxConfigBase::Get(); pstdata->recheight=cfg->Read("Record Height",pstdata->recheight); for (int i=0; i<3; i++) { pstdata->colswidth[i]=cfg->Read(wxString::Format("Col %d Width",i),pstdata->colswidth[i]); } pstdata->hintinmodify=cfg->Read("ModifyHint",TRUE); delete wxConfigBase::Set((wxConfigBase *) NULL); return TRUE;}bool MyFrame::SetAllConfig(LiliMoneyConfigData *pstdata){ wxConfigBase *cfg = wxConfigBase::Get(); cfg->Write("Record Height",pstdata->recheight); for (int i=0; i<3; i++) { cfg->Write(wxString::Format("Col %d Width",i),pstdata->colswidth[i]); } cfg->Write("ModifyHint",pstdata->hintinmodify); delete wxConfigBase::Set((wxConfigBase *) NULL); return TRUE;}void MyFrame::OnDeleteMoneyType(wxCommandEvent& WXUNUSED(event)){ wxTreeItemId id; wxMessageDialog dialog( NULL, _("Are you sure you want delete this type and all subtype and value?"), _("Message box text"), wxNO_DEFAULT|wxYES_NO|wxICON_INFORMATION); switch ( dialog.ShowModal() ) { case wxID_YES: id = textWindow->GetSelection(); if (id.IsOk()) { if (!moneybook->DeleteMoneyType(&id)) { wxLogError(_("Problem when delete money type!")); } } break; case wxID_NO: break; default: wxLogError(_("Unexpected wxMessageDialog return code!")); } }void MyFrame::CreateMainMenu(wxFrame *parent){ // Make a menubar wxMenu *file_menu = new wxMenu; file_menu->Append(MDI_CHILD_QUIT, _("&Close child"), _("Close this window")); file_menu->Append(MDI_QUIT, _("&Exit")); wxMenu *view_menu = new wxMenu; view_menu->Append(VIEW_MONTH_OUT, _("&MonthTotalOut\tF3")); wxMenu *help_menu = new wxMenu; help_menu->Append(MDI_ABOUT, _("&About")); wxMenu *tool_menu = new wxMenu; tool_menu->Append(TOOL_CALCHOUSEFEE, _("&CalcHouseFee")); wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, _("&File")); menu_bar->Append(view_menu, _("&View")); menu_bar->Append(tool_menu, _("&Tool")); menu_bar->Append(help_menu, _("&Help")); // Associate the menu bar with the frame parent->SetMenuBar(menu_bar); }void MyFrame::CreateChart(wxTreeItemId baseitem, const char* title){ wxTreeItemId item =baseitem; xmlNodePtr root = NULL;; if (item.IsOk()) { xmlnodeTreeItemData* pitemdata; pitemdata = (xmlnodeTreeItemData *)textWindow->GetItemData(item); if (NULL != pitemdata) root = pitemdata->xmlNode; } if (root == NULL) { root = moneybook->OutGoingNode; } MyChild *subframe = new MyChild(frame, title, wxPoint(-1, -1), wxSize(-1, -1), wxDEFAULT_FRAME_STYLE); MyXmlNodeList globelist;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -