一、文档/视图框架:
文档对象:是用来保存数据的。
视图对象:是用来显示和编辑数据的。
应用程序框架:框架是用来管理不同文档显示界面的。
二、使用Wx::MDI多文档界面的优点:所有文档窗口被限制在父窗口内,父窗口的菜单版条会被活动的文档窗口菜单条代替,减轻菜单条的及就用程序界面的杂乱性。
三、顶层窗口:
Wx::DocMDIParentFrame可以管理其他Frame类的类。
成员函数:ActivateNext和ActivatePrevious激活前一个或后一个文档窗口;
Cascade和Tile层叠或平铺所有子窗口,ArrangeIcons以图标方式平铺所有最小化的文档窗口;
GetActiveChild获取当前活动窗口的指针(如果存在的话);
GetClientWindow返回那个包含所有文档窗口的子窗口的指针。
Wx::DocMDIChildFrame可以被其父窗口管理的Frame类。
成员函数:Activate激活本窗口,并在其父窗口显示它的菜单;
Maximiz在父窗口范围内最大化;
Restore使其由最大化恢复到普通状态。
四、步骤:
1、使用Wx::MDI多文档界面,所有的子文档窗口被包含在一个父窗口内。
2、使用Wx::DocMDIParentFrame父窗口类,在OnInit函数中创建父窗口实例(对应于每个文档视图创建一个子窗口实例),使用标准的菜单标识符创建菜单,如wxID_NEW:$file_menu->Append(wxID_NEW, "&New\tCtrl+N")。
3、定义自己的文档和视图类,重载尽可能少的成员函数用于输入、输出、绘画及初始化。
4、定义任意子窗口用来显示视图,$child_frame =new Wx::DocMDIChildFrame;
5、在Wx::App的OnInit函数的开始部分创建一个Wx::DocManager实例以及足够多的Wx::DocTemplate实例,以便定义文档与视图之间的关系,对于简单应用一个Wx::DocTemplate实例就可以了。
以下代码从网上某位牛人的代码中节选而来,因下载时间过久找不到链接了。
- use Wx;
- use Wx::MDI;
- use Wx::DocView;
- package MyApp;
- use base qw(Wx::App);
- use Wx qw( :docview :frame :misc :id );
- use Wx::Event qw( EVT_MENU );
- our @id = ( 0 .. 10 ); # IDs array
- sub OnInit {
- my $self = shift;
- #步骤5:创建一个Wx::DocManager和Wx::DocTemplate实例
- $self->{'.docman'} = MyDocManager->new( wxDOC_MDI );
- Wx::DocTemplate->new($self->{'.docman'}, "Text Files", "*.txt", "", "txt",
- "Text Document", "Text View", "MyDoc", "MyView", 1 );
- #步骤2:创建父窗口实例
- my $frame = new Wx::DocMDIParentFrame( $self->{'.docman'},
- undef , -1, "DocView Demo" );
- #步骤2:使用标准的菜单标识符创建菜单
- my $file_menu = new Wx::Menu;
- $file_menu->Append(wxID_NEW, "&New\tCtrl+N");
- $file_menu->Append(wxID_OPEN, "&Open\tCtrl+O");
- #$file_menu->Append(wxID_SAVE, "&Save\tCtrl+S");
- #$file_menu->Append(wxID_CLOSE, "&Close\tCtrl+W");
- #历史文件访问记录的显未将使用这个菜单
- $self->{'.docman'}->FileHistoryUseMenu( $file_menu );
- $file_menu->AppendSeparator;
- $file_menu->Append($id[0], "&About");
- EVT_MENU( $frame, $id[0], \&OnAbout );
- my $menu_bar = new Wx::MenuBar;
- $menu_bar->Append($file_menu, "&File");
- $frame->SetMenuBar($menu_bar);
- $frame->Centre(wxBOTH);
- $frame->Show( 1 );
- $self->SetTopWindow( $frame );
- $self->{'.menubar'} = $menu_bar;
- $self->{'.frame'} = $frame;
- return 1;
- }
- #菜单About调出消息
- sub OnAbout
- {
- my $self = shift;
- use Wx qw( wxOK wxCENTRE);
- Wx::MessageBox(
- "Document / View Framework sample",
- "Wx::DocView",
- wxOK | wxCENTRE, $self
- );
- }
- #在OnInit函数中,定义子窗口子例程
- sub CreateChildFrame {
- my ($self, $doc, $view, $flags) = @_;
- # Get the filename for the window title
- my $filename = $doc->GetFilename;
- my $child_frame = new Wx::DocMDIChildFrame( $doc, $view,
- Wx::wxTheApp()->GetTopWindow(), -1,
- $filename, [10,10], [300,300],
- wxDEFAULT_FRAME_STYLE | wxMAXIMIZE );
- return $child_frame;
- }
- # ---- 定义Wx::DocManager类,供步骤5实例化: -------------------------------------------------------
- package MyDocManager;
- use base qw(Wx::DocManager);
- {
- my $count = 0;
- sub MakeDefaultName {
- my ($docmgr, $name) = @_;
- return "Untitled" . ++$count;
- }
- }
- # ---- 步骤3.1:定义文档类 Wx::Document--------------------------------------------
- package MyDoc;
- use base qw(Wx::Document);
- sub OnOpenDocument {
- my ($doc, $filename) = @_;
- my $view = $doc->GetFirstView();
- return 0 unless $view->{'.editor'}->LoadFile( $filename );
- $doc->UpdateAllViews();
- $doc->Modify(0);
- return 1;
- }
- # ---- 步骤3.2:定义视图类 Wx::View -------------------------------------------------------------
- package MyView;
- use base qw(Wx::View);
- use Wx qw( wxTE_MULTILINE wxDefaultPosition wxDefaultSize );
- sub OnCreate {
- my ($view, $doc, $flags) = @_;
- #步骤4:实例化子窗口显示视图
- my $child_frame = Wx::wxTheApp()->CreateChildFrame($doc, $view);
- $view->{'.editor'} = new Wx::TextCtrl($child_frame, -1, "", [0,0],
- [200,300], wxTE_MULTILINE);
- $view->Activate(1);
- return 1;
- }
- sub OnClose {
- my ($view, $deletewindow) = @_;
- if ($deletewindow) {
- $view->{'.editor'}->Show(0);
- delete $view->{'.editor'};
- $view->GetFrame->Destroy;
- my $app = Wx::wxTheApp();
- $app->{'.frame'}->SetMenuBar( $app->{'.menubar'} );
- } else {
- $view->GetDocument->Close();
- }
- $view->Activate(0);
- return 1;
- }
- package main;
- MyApp->new->MainLoop;
阅读(4547) | 评论(0) | 转发(0) |