Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225715
  • 博文数量: 36
  • 博客积分: 1188
  • 博客等级: 军士长
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 21:45
文章分类

全部博文(36)

文章存档

2020年(1)

2017年(2)

2015年(1)

2014年(1)

2013年(1)

2012年(3)

2011年(27)

分类: WINDOWS

2011-04-03 00:30:02

一、文档/视图框架:
文档对象:是用来保存数据的。  
视图对象:是用来显示和编辑数据的。  
应用程序框架:框架是用来管理不同文档显示界面的。
二、使用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实例就可以了。
以下代码从网上某位牛人的代码中节选而来,因下载时间过久找不到链接了。
  1. use Wx;
  2. use Wx::MDI;
  3. use Wx::DocView;

  4. package MyApp;
  5. use base qw(Wx::App);

  6. use Wx qw( :docview :frame :misc :id );
  7. use Wx::Event qw( EVT_MENU );
  8. our @id = ( 0 .. 10 ); # IDs array
  9. sub OnInit {
  10.      my $self = shift;

  11.      #步骤5:创建一个Wx::DocManager和Wx::DocTemplate实例
  12.      $self->{'.docman'} = MyDocManager->new( wxDOC_MDI );
  13.      Wx::DocTemplate->new($self->{'.docman'}, "Text Files", "*.txt", "", "txt",
  14.          "Text Document", "Text View", "MyDoc", "MyView", 1 );

  15.          #步骤2:创建父窗口实例
  16.          my $frame = new Wx::DocMDIParentFrame( $self->{'.docman'},
  17.          undef , -1, "DocView Demo" );

  18.          #步骤2:使用标准的菜单标识符创建菜单
  19.          my $file_menu = new Wx::Menu;
  20.          $file_menu->Append(wxID_NEW, "&New\tCtrl+N");
  21.          $file_menu->Append(wxID_OPEN, "&Open\tCtrl+O");
  22.      #$file_menu->Append(wxID_SAVE, "&Save\tCtrl+S");
  23.      #$file_menu->Append(wxID_CLOSE, "&Close\tCtrl+W");
  24.          #历史文件访问记录的显未将使用这个菜单
  25.      $self->{'.docman'}->FileHistoryUseMenu( $file_menu );

  26.      $file_menu->AppendSeparator;
  27.          $file_menu->Append($id[0], "&About");
  28.      EVT_MENU( $frame, $id[0], \&OnAbout );
  29.      my $menu_bar = new Wx::MenuBar;
  30.      $menu_bar->Append($file_menu, "&File");

  31.      $frame->SetMenuBar($menu_bar);
  32.      $frame->Centre(wxBOTH);
  33.      $frame->Show( 1 );
  34.      $self->SetTopWindow( $frame );

  35.      $self->{'.menubar'} = $menu_bar;
  36.      $self->{'.frame'} = $frame;

  37.      return 1;
  38. }
  39. #菜单About调出消息
  40. sub OnAbout
  41. {
  42.     my $self = shift;
  43.     use Wx qw( wxOK wxCENTRE);
  44.     Wx::MessageBox(
  45.         "Document / View Framework sample",
  46.         "Wx::DocView",
  47.         wxOK | wxCENTRE, $self
  48.     );

  49. }
  50. #在OnInit函数中,定义子窗口子例程
  51. sub CreateChildFrame {
  52.      my ($self, $doc, $view, $flags) = @_;

  53.      # Get the filename for the window title
  54.      my $filename = $doc->GetFilename;

  55.      my $child_frame = new Wx::DocMDIChildFrame( $doc, $view,
  56.          Wx::wxTheApp()->GetTopWindow(), -1,
  57.          $filename, [10,10], [300,300],
  58.          wxDEFAULT_FRAME_STYLE | wxMAXIMIZE );
  59.      return $child_frame;
  60. }

  61. # ---- 定义Wx::DocManager类,供步骤5实例化: -------------------------------------------------------
  62. package MyDocManager;
  63. use base qw(Wx::DocManager);

  64. {
  65.      my $count = 0;
  66.      sub MakeDefaultName {
  67.          my ($docmgr, $name) = @_;
  68.          return "Untitled" . ++$count;
  69.      }
  70. }

  71. # ---- 步骤3.1:定义文档类 Wx::Document--------------------------------------------
  72. package MyDoc;
  73. use base qw(Wx::Document);
  74. sub OnOpenDocument {
  75.      my ($doc, $filename) = @_;
  76.      my $view = $doc->GetFirstView();

  77.      return 0 unless $view->{'.editor'}->LoadFile( $filename );
  78.      $doc->UpdateAllViews();
  79.      $doc->Modify(0);
  80.      return 1;
  81. }

  82. # ---- 步骤3.2:定义视图类 Wx::View -------------------------------------------------------------
  83. package MyView;
  84. use base qw(Wx::View);
  85. use Wx qw( wxTE_MULTILINE wxDefaultPosition wxDefaultSize );

  86. sub OnCreate {
  87.      my ($view, $doc, $flags) = @_;
  88.          #步骤4:实例化子窗口显示视图
  89.      my $child_frame = Wx::wxTheApp()->CreateChildFrame($doc, $view);
  90.      $view->{'.editor'} = new Wx::TextCtrl($child_frame, -1, "", [0,0],
  91.          [200,300], wxTE_MULTILINE);

  92.      $view->Activate(1);
  93.      return 1;
  94. }

  95. sub OnClose {
  96.      my ($view, $deletewindow) = @_;

  97.      if ($deletewindow) {
  98.          $view->{'.editor'}->Show(0);
  99.          delete $view->{'.editor'};
  100.          $view->GetFrame->Destroy;

  101.          my $app = Wx::wxTheApp();
  102.          $app->{'.frame'}->SetMenuBar( $app->{'.menubar'} );
  103.      } else {
  104.          $view->GetDocument->Close();
  105.      }
  106.      $view->Activate(0);

  107.      return 1;
  108. }

  109. package main;
  110. MyApp->new->MainLoop;
阅读(4547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~