2010-02-01 127 views
0

我的客户希望我改变默认的最大化按钮功能,以最大化客户拥有的所有屏幕上的窗体。我已经写了一些代码来测量正确的矩形来放置表单,但是当我将它分配给表单的MaximisedBounds属性时,会出现一些问题:屏幕(在我的2屏幕测试中)表单未打开点击之前只能得到一个油漆,如果你点击另一个屏幕上的表单,就好像你已经点击“下方”到下一个窗口。将屏幕最大化为2屏幕

当然,还有其他方法可以解决这个问题(如Event when a window gets maximized/un-maximized),如果描述的行为是一个错误,或者我的错误,我会发现它。在更改MaximisedBounds属性以使其工作之前,有什么可做的吗?

回答

0

我同意马特。设置“MaximizedBounds”不是一个好主意。 正如在Event when a window gets maximized/un-maximized中所写,我会覆盖WndProc方法。在那里你可以自己处理来自窗口的不同的接收命令。

要做的主要事情是编写自己的代码“SC_MAXIMIZE”-windowcommand(如上面引用的文章中所写)。您可以手动设置表单的大小,例如在这种情况下,表单不会真正达到最大化。实际上它仍然在正常的WindowState中。为了防止用户改变这个状态,你需要“捕捉”一些其他的窗口命令。

重写的WndProc方法可能是这样的:

protected override void WndProc(ref Message m) 
    { 
     if(m.Msg == 0x0112) // WM_SYSCOMMAND 
     { 
      if(m.WParam == new IntPtr(0xF012)) //TITLE_CLICK_ONCE 
      { 
       // catch, this command can occur, when form starts to move 
      } 

      if(m.WParam == new IntPtr(0xF001) // RESIZE_ON_EDGE 
      || m.WParam == new IntPtr(0xF002) 
      || m.WParam == new IntPtr(0xF003) 
      || m.WParam == new IntPtr(0xF004) 
      || m.WParam == new IntPtr(0xF005) 
      || m.WParam == new IntPtr(0xF006) 
      || m.WParam == new IntPtr(0xF007) 
      || m.WParam == new IntPtr(0xF008)) 
      { 
       // catch the resizing 
      } 

      if(m.WParam == new IntPtr(0xF032)) // SECOND_CLICK_ON_TITLEBAR 
      { 
       // catch. causes a maximization (or resuming to normal window-mode) 
      } 

      if(m.WParam == new IntPtr(0xF030)) //SC_MAXIMIZE 
      { 
       // the actual point, where to enter your code 
       // this command occurs, when the "Maximize"-button is pressed 
      } 
     } 

     // maybe abort calling of the base-method at specified window-commands, 
     // when you want to make your own code by simply "return;" 
     base.WndProc(ref m); 
    } 
+0

Gk,你猜这是要走的路。 – Stimpatch 2010-02-03 15:13:37

0

我已经能够通过直接设置Size属性而不是MaximisedBounds值来使表格填充2个整个屏幕。

+0

是的,我也认为是本为有效选项(这是我的问题当前的解决方案),但它也是良好的编码风格?我想知道如何正确使用MaximisedBounds。 – Stimpatch 2010-02-02 11:56:22