Net有道

紫冠道人的求道历程

导航

RFID会议签到系统总结(十五)――管控端的窗体组织

 

本要接上一篇开始讲管控端程序的菜单与工具栏的加载,但发现还是先要讲一下整个管控端的窗体组织,否则会无法理解菜单事件为何要那么写。

多窗体组织很经典的模型就是MDI了,但MDI在窗体最大化、最小化、还原一些动作之后,窗体会乱掉,很乱七八糟。现在的程序很少有用那种原始的MDI来作界面的了,至少我不会去用,实在是难看。但开发工具在这里也是没有长进,如果我们直接用IDE只能生成那种原始的MDI窗体。

只能另想办法,其实也没多想,因为以前(一年多前)曾经为同学做过一个DEMO,当时也是基于难看的MDI,在SourceForge上找了这个DockPanel(从作者名字看象是一个华人的作品,现在已经是2.0了,我当时还是1.0。下面我所述的都是基于1.0的基础上的),做出了相对比较悦目的界面,这东西没有用GPL之类的开源协议,这次当然也就顺手用上了(其实即使它用了GPL,我用它了,公司也没人管我,他们只关心项目有没有按时完成。有否金玉其外、败絮其中都无瑕顾及,还会去顾及这个国人很少注意的Open Source License吗?)。

 

用这个DockPanel能做出什么界面这里不具体说了,基本可以用它做出如VS.net那样的界面,不过对我来说用不了那么多功能,用得最多的就是“多Tab显示窗体”。当然基于那个DockPanel我作了一些小小的修改。

当双击Tab时,原先是直接把当前Tab所表示的这个窗体,从主窗体的框架上分离现来,成为一个浮动的窗体。这不是我想要的,我把它改成了双击关闭。

DockPaneStripBaseWndProc方法里,对于左键双击消息重新作了处理(下面注释掉的一行是原先的写法,它下面那行是我改的):

           else if (m.Msg == (int)Win32.Msgs.WM_LBUTTONDBLCLK)

           {

             

              base.WndProc(ref m);

 

              int index = GetHitTest();

              if (DockPane.DockPanel.AllowRedocking && index != -1)

              {

                  IDockContent content = Tabs[index].Content;

                  try {  

//                   content.DockHandler.IsFloat = !content.DockHandler.IsFloat;

                     content.DockHandler.Close();

                  }  

                  catch  {   }

              }

 

              return;

           }

 

另外改的一个地方,这一次系统里没有派上用场,不过也顺便提一下。是关于主窗背景色(图)的,因为这次的管控端系统,系统运行中一般是会有一个窗体一直开启着的(就是那个签到统计显示的窗体),背景对于使用者反而是不可见的。

DockPanelOnPaint方法里,原来对于背景设置是不起作用的,我把它改了一下:

       protected override void OnPaint(PaintEventArgs e)

       {

           base.OnPaint(e);

 

           Graphics g = e.Graphics;

 

//         g.FillRectangle(SystemBrushes.AppWorkspace, ClientRectangle);

           if (this.BackgroundImage != null)

              g.FillRectangle(new TextureBrush(this.BackgroundImage),ClientRectangle);

           else

              g.FillRectangle(new SolidBrush(this.BackColor),ClientRectangle);

       }

 

 

posted on 2007-07-11 15:09  lichdr  阅读(606)  评论(1编辑  收藏  举报