当您最大化表单或取消最大化时,是否会触发事件?
在你说Resize或之前SizeChanged:只有Size实际改变才会被解雇.如果您的窗口大小与最大化窗口大小相等,则它们不会触发.位置看起来是下一个最好的选择,但这再次感觉就像巧合赌博.
Rob*_*cks 61
令人惊讶的是,没有人提到内置的.NET方法.
这样您就不需要覆盖Window Message Processing处理程序.
它甚至可以捕获双击窗口标题栏导致的最大化/恢复事件,而WndProc方法则不会.
将其复制并将其链接到表单上的"Resize"事件处理程序.
FormWindowState LastWindowState = FormWindowState.Minimized;
private void Form1_Resize(object sender, EventArgs e) {
// When window state changes
if (WindowState != LastWindowState) {
LastWindowState = WindowState;
if (WindowState == FormWindowState.Maximized) {
// Maximized!
}
if (WindowState == FormWindowState.Normal) {
// Restored!
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 44
你可以通过覆盖WndProc来做到这一点:
protected override void WndProc( ref Message m )
{
if( m.Msg == 0x0112 ) // WM_SYSCOMMAND
{
// Check your window state here
if (m.WParam == new IntPtr( 0xF030 ) ) // Maximize event - SC_MAXIMIZE from Winuser.h
{
// THe window is being maximized
}
}
base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)
这应该在任何窗口上处理事件. SC_RESTORE是0xF120和SC_MINIMIZE是0XF020,如果你需要这些常数也.
Lor*_*ato 13
另一个小的添加,以检查最大化后恢复原始尺寸和位置:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
// WM_SYSCOMMAND
if (m.Msg == 0x0112)
{
if (m.WParam == new IntPtr(0xF030) // Maximize event - SC_MAXIMIZE from Winuser.h
|| m.WParam == new IntPtr(0xF120)) // Restore event - SC_RESTORE from Winuser.h
{
UpdateYourUI();
}
}
}
Run Code Online (Sandbox Code Playgroud)
希望这有帮助.
我遇到了同样的问题,我可以解决它而无需覆盖。因为我有一个处于停靠模式“填充”的PictureBox,所以我可以使用它的SizeChanged事件,该事件也会在最大化窗口时触发。
我相信代码比那更简单。您不需要保存 lastState,因为在触发事件时会随时检查 WindowState。
private void MainForm_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Maximized)
{
spContainer.SplitterDistance = 1000;
}
if (WindowState == FormWindowState.Normal)
spContainer.SplitterDistance = 500;
}
Run Code Online (Sandbox Code Playgroud)