我的客户希望我更改默认的最大化按钮功能,以最大化客户拥有的所有屏幕上的表单。我已经编写了一些代码来测量正确的矩形来放置表单,但是当我将它分配给表单的MaximisedBounds属性时,有一些问题:屏幕(在我的2个屏幕测试中)表单没有打开在点击之前只获得一个油漆,如果你点击另一个屏幕上的表格,就好像你已经点击“下”它到下面的下一个窗口。
当然还有其他方法可以解决这个问题(比如在Event when a window gets maximized/un-maximized中),如果描述的行为是错误,或者我的错误,我会更加干净。在更改MaximisedBounds属性以使其工作之前有什么可做的吗?
答案 0 :(得分:0)
我已经能够通过直接设置Size
属性而不是MaximisedBounds
值来使表单填满整个屏幕。
答案 1 :(得分:0)
我同意马特的观点。设置“MaximizedBounds”并不是一个好主意。 正如Event when a window gets maximized/un-maximized中所写,我将覆盖WndProc方法。在那里,您可以自己处理窗口中收到的不同命令。
要做的主要事情是为“SC_MAXIMIZE” - 窗口命令编写自己的代码(如上面引用的文章中所述)。在那里你可以手动设置表单的大小,例如在这种情况下,表单不会真正最大化。实际上它仍处于正常的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);
}