首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 開發 MDI 多文件文書編輯器

     編輯:關於C++

MDI 應用程式架構簡介

MDI (Multiple Document Interface) 允許單一應用程式同時開啟多個文件視窗。C++ Builder 透過設定表單 FormStyle 屬性即可輕鬆實作:

  • 主框架視窗:fsMDIForm
  • 子視窗:fsMDIChild

亦可使用專案範本 File | New | Projects | MDI Application 快速產生框架。

完整開發步驟與程式碼

1. 專案建立與命名

  • 選擇 MDI Application 範本
  • 主視窗存為 MDIMain.cpp,子視窗存為 MDIChild.cpp,專案存為 MDI

2. 主視窗 (FrameForm) 設定

  • Caption:「MDI演示程式---可開啟多檔案的文字編輯器」
  • 選單項目與事件對應:
    選單項目事件
    檔案新建New1Click
    開啟Open1Click
    退出Exit1Click
    視窗層疊Tile1Click
    平鋪Cascade1Click
    排列圖示ArrangeIcons1Click
  • 工具列按鈕 (TSpeedButton) 對應相同事件,並設定 Glyph 圖示
  • OpenDialog 過濾器設定:Rich Text (*.rtf)、Text (*.txt)、All Files (*.*)

3. 子視窗 (ChildForm) 設定

  • FormStyle = fsMDIChild
  • 事件:OnClick=FormClick, OnClose=FormClose, OnCloseQuery=FormCloseQuery, OnCreate=FormCreate
  • 選單項目完整編輯、檔案、列印、格式功能 (見原文表格)
  • 放置 TRichEdit (Name=doc, Align=alClient) 與各種對話框元件 (SaveDialog, PrintDialog, PrinterSetupDialog, FontDialog)

4. 核心程式碼節錄

MDIMain.cpp

void __fastcall TFrameForm::New1Click(TObject *Sender)
{ ChildForm = new TChildForm(this); } // 新建子視窗

void __fastcall TFrameForm::Open1Click(TObject *Sender)
{
    if (OpenFileDialog->Execute()) {
        ChildForm = new TChildForm(this);
        ChildForm->Open(OpenFileDialog->FileName);
    }
}

MDIChild.cpp 關鍵方法

void __fastcall TChildForm::Open(const AnsiString AFileName)
{
    PathName = AFileName;
    Caption = ExtractFileName(AFileName);
    doc->Lines->LoadFromFile(PathName);
    doc->SelStart = 0;
    doc->Modified = false;
}

void __fastcall TChildForm::Save1Click(TObject *Sender)
{
    if (Caption == DefaultFileName) Saveas1Click(Sender);
    else { doc->Lines->SaveToFile(PathName); doc->Modified = false; }
}

void __fastcall TChildForm::FormClose(TObject *Sender, TCloseAction &Action)
{ Action = caFree; } // 關閉時釋放記憶體

void __fastcall TChildForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    if (doc->Modified) {
        switch (MessageDlg("Save changes to " + PathName, mtConfirmation,
            TMsgDlgButtons() << mbYes << mbNo << mbCancel, 0)) {
            case mrYes: Save1Click(this); break;
            case mrCancel: CanClose = false; break;
        }
    }
}

5. 執行結果

編譯執行後可同時開啟多個文件視窗,支援 RTF/TXT 格式、工具列快捷鍵、列印、字型設定、對齊、自動換行等完整編輯器功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved