当您最大化表单或取消最大化时,是否会触发事件?
在你说Resize
或SizeChanged
之前:只有在Size
实际发生变化时才会被解雇。如果您的窗口大小与最大化窗口大小相等,则它们不会触发。位置看起来是下一个最好的选择,但这再次感觉就像是巧合赌博。
答案 0 :(得分:58)
没有人提到内置的.NET方法。
这样您就不需要覆盖窗口消息处理处理程序。
它甚至可以捕获双击窗口标题栏导致的最大化/恢复事件,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!
}
}
}
答案 1 :(得分:41)
您可以通过覆盖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);
}
这应该在任何窗口上处理事件。如果您需要这些常量,则SC_RESTORE
为0xF120
,SC_MINIMIZE
为0XF020
。
答案 2 :(得分: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();
}
}
}
希望得到这个帮助。
答案 3 :(得分:4)
我有同样的问题,我可以解决它而不会覆盖。 因为我在停靠模式“填充”中有 PictureBox ,所以我可以使用它的 SizeChanged 事件,该事件也会在最大化窗口时触发。
答案 4 :(得分:4)
我相信代码甚至更简单。您不需要保存lastState,因为在触发事件时会随时检查WindowState。
private void MainForm_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Maximized)
{
spContainer.SplitterDistance = 1000;
}
if (WindowState == FormWindowState.Normal)
spContainer.SplitterDistance = 500;
}
答案 5 :(得分:1)
如果没有明显的事件需要监听,您可能需要挂钩到Windows API并捕获相应的消息(Google发现您需要拦截WM_SYSCOMMAND消息:http://www.codeguru.com/forum/archive/index.php/t-234554.html )。
答案 6 :(得分:1)
我希望这部分代码有用。
function arrayMaximalAdjacentDifference(arr) {
var dif = 0;
var max = 0;
for(var i = 0; i < arr.length; i++){
dif = Math.abs(arr[i] - arr[i+1]);
if(dif > max){
max = dif;
}
}
return max;
}
答案 7 :(得分:0)
' Great tip. So if it helps to VisualBasic In Code
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
' # WndProcess 루프함수
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg.Equals(WM_SYSCOMMAND) Then
If (m.WParam.ToInt32.Equals(SC_MAXIMIZE)) Then
Me.p_FullScreen()
Return
End If
End If
MyBase.WndProc(m)
End Sub
答案 8 :(得分:0)
我是新手,所以评论不允许,但这是对GeoTarget的干净答案的评论:
将第一行OUGHT略微更改为可为空,以便在表单启动时捕获最小化:
.glyphicon-map-marker{
position:absolute;
z-index:1000;
top:30%;
left:2%;
}
a.glyphicon-map-marker
{
text-decoration: none !important;
}
一个平庸的建议:在“if”之后将LastWindowState的赋值移动到,这样用户不仅可以轻松检查您的内容,还可以检查它的来源:
FormWindowState? LastWindowState = null;
答案 9 :(得分:0)
一个完整的解决方案,可以最大化,最小化,恢复和正确删除仅用于内部目的的低位比特。
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_MAXIMIZE = 0xF030;
const int SC_MINIMIZE = 0xF020;
const int SC_RESTORE = 0xF120;
// dependig on the needs may be called before, after or even never (see below)
// base.WndProc(ref m);
if (m.Msg == WM_SYSCOMMAND)
{
/// <see cref="https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand"/>
/// Quote:
/// In WM_SYSCOMMAND messages, the four low - order bits of the wParam parameter
/// are used internally by the system.To obtain the correct result when testing
/// the value of wParam, an application must combine the value 0xFFF0 with the
/// wParam value by using the bitwise AND operator.
int wParam = (m.WParam.ToInt32() & 0xFFF0);
Debug.WriteLine($"Received param: { Convert.ToString(wParam, 16) } ");
if (wParam == SC_MAXIMIZE)
{
}
if (wParam == SC_MINIMIZE)
{
}
if (wParam == SC_RESTORE)
{
}
}
// don't use when above call is uncommented
base.WndProc(ref m);
}