Написание приложений MDI
Для отображения данных из файлов приложение MDI использует дочерние окна, так что пользователь может открывать, просматривать и редактировать сразу несколько документов и легко переходить от одного документа к другому. Каждое приложение MDI состоит из трех основных компонент:
- Окно обрамления служит главным окном программы. Главная функция – управление окном-клиентом и обеспечение визуальных компонент главного окна программы. В приложении MDI имеется только одно обрамляющее окно. Класс – TMDIFrame – mdi.h
- Окно-клиент, которым владеет обрамляющее окно, обслуживает операции, относящиеся к приложению в целом и создающие новые окна документов. Окно-клиент прикрепляется к обрамлению и обслуживает все глобальные операции, относящиеся к приложения в целом или создающие новые дочерние окна и открывающие существующие файлы. В приложении MDI имеется только одно окно-клиент. Класс – TMDIClient – mdi.h
- Одно или несколько окон документов (дочерние окна MDI) отображают файловую или другую информацию. Обычно каждый открытый файл, называемый документом, закрепляется за индивидуальным окном документа. Класс – TMDIChild – mdichild.h
mdidemo.rh
#define ID_MENU 100
#define CM_FILEEXIT 24338
#define CM_FILESAVEAS 24334
#define CM_FILESAVE 24333
#define CM_FILEOPEN 24332
mdidemo.rc
#include <owl\window.rh>
#include <owl\mdi.rh>
#include "mdidemo.rh"
ID_MENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New", CM_CREATECHILD
MENUITEM "&Open", CM_FILEOPEN
MENUITEM "&Save", CM_FILESAVE
MENUITEM "Save &as", CM_FILESAVEAS
MENUITEM SEPARATOR
MENUITEM "E&xit", CM_EXIT
END
POPUP "&Window"
BEGIN
MENUITEM "&Cascade", CM_CASCADECHILDREN
MENUITEM "&Tile", CM_TILECHILDREN
MENUITEM "&Arrange icons", CM_ARRANGEICONS
MENUITEM SEPARATOR
MENUITEM "Close &all", CM_CLOSECHILDREN
END
END
mdidemo.cpp
//MDI application
#include <owl\applicat.h>
#include <owl\mdi.h>
#include <owl\mdichild.h>
#include <owl\mdi.rh>
#include <cstring.h>
#pragma hdrstop
#include "mdidemo.rh"
//The MDI child window class
class TDemoChild: public TMDIChild {
public:
TDemoChild(TMDIClient& parent); //Default constructor
TDemoChild(TMDIClient& parent, const char far *name);
void ChangeName(const char far *name);
int Unnamed() { return filename.length() == 0; }
int OpenFile() { return TRUE; }
int SaveFile() { return TRUE; }
private:
string filename;
};
//Default constructor for File|New
TDemoChild::TDemoChild(TMDIClient& parent)
: TMDIChild(parent, "Untitled")
{
filename = "";
}
//Alternate constructor for File|Open
TDemoChild::TDemoChild(TMDIClient& parent, const char far *name)
: TMDIChild(parent, name)
{
filename = name;
}
//Change window file name
void
TDemoChild::ChangeName(const char far *name)
{
filename = name;
SetCaption(name);
}
//The MDI client window class
class TDemoClient: public TMDIClient {
public:
TDemoClient(): TMDIClient() {}
protected:
virtual TMDIChild* InitChild();
void CmFileOpen();
void CmFileSave();
void CmFileSaveAs();
DECLARE_RESPONSE_TABLE(TDemoClient);
};
DEFINE_RESPONSE_TABLE1(TDemoClient, TMDIClient)
EV_COMMAND(CM_FILEOPEN, CmFileOpen),
EV_COMMAND(CM_FILESAVE, CmFileSave),
EV_COMMAND(CM_FILESAVEAS, CmFileSaveAs),
END_RESPONSE_TABLE;
//Construct a child window object for File|New command
TMDIChild*
TDemoClient::InitChild()
{
return new TDemoChild(*this);
}
//Open an existing file for File|Open command
void
TDemoClient::CmFileOpen()
{
TMDIChild* cp = new TDemoChild(*this, "File Name");
cp->Create();
}
//Save window's information for File|Save command
void
TDemoClient::CmFileSave()
{
TDemoChild* cp = (TDemoChild*)GetActiveMDIChild();
if (!cp) return;
if(cp->Unnamed())
CmFileSaveAs();
else
cp->SaveFile();
}
//Name and save window's information for File|Save as command
void
TDemoClient::CmFileSaveAs()
{
TDemoChild* cp = (TDemoChild*)GetActiveMDIChild();
if (!cp) return;
cp->ChangeName("Save as name");
cp->SaveFile();
}
// the MDI application class
class TDemoApp: public TApplication {
public:
TDemoApp(const char far* name)
: TApplication(name){}
void InitMainWindow();
private:
TDemoClient* client;
};
//Initialize the program's main window
void
TDemoApp::InitMainWindow()
{
client = new TDemoClient;
MainWindow = new TMDIFrame("MDI Application Demo",
ID_MENU, *client);
}
#pragma argsused
//Main program
int
OwlMain(int argc, char* argv[])
{
TDemoApp app("MDIDemoApp");
return app.Run();
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.