我的申请表有两种:主窗口和一个覆盖层。覆盖层可以最小化(通过控制它的大小)到屏幕顶部,主窗口可以最小化到任务栏或系统托盘。
点击覆盖层上的按钮,可以切换最小化和不最小化。点击此按钮时,主窗口输入FormWindowSate.Normal
。
我希望这不仅在点击控制按钮时有效,而且在覆盖层失去焦点时也有效。因此我的问题是:如果我把隐藏覆盖层的代码添加到一个事件处理程序中,我可以很好地隐藏覆盖层。但是当我试图添加将主窗口返回到其原始状态的代码时,该代码在任何地方都停止工作。以下是相关代码:
在覆盖表中:
public event System.EventHandler OnShowOverlay;
public event System.EventHandler OnHideOverlay;
private void ShowOverlay()
{
OnShowOverlay(this, null);
this.Focus();
OverlayPanel.Visible = true;
this.Height = 70;
this.InfoPanel.Location = new Point(25, 35);
this.OverlayShowButton.Location = new Point(0, 35);
}
private void HideOverlay()
{
if(OnHideOverlay != null)
{
OnHideOverlay(this, null); //!!!
this.Focus();
this.OverlayPanel.Visible = false; //***
this.OverlayShowButton.Location = new Point(0, 0); //***
this.InfoPanel.Location = new Point(25, 0); //***
this.Height = 35; //***
}
}
private void OverlayShowButton_Click(object sender, MouseEventArgs e)
{
OverlayPanel.Visible = !OverlayPanel.Visible;
if (OverlayPanel.Visible)
{
ShowOverlay();
}
else
{
HideOverlay();
}
}
public void OverlayNoFocus(object sender, EventArgs e)
{
HideOverlay(); //!!!
}
在覆盖设计器中:
this.Deactivate += new System.EventHandler(OverlayNoFocus);
主要形式为:
public MainForm()
{
//irrelevant code here.
this.overlay.OnShowOverlay += new System.EventHandler(onOverlayShow);
this.overlay.OnHideOverlay += new System.EventHandler(onOverlayHide);
this.overlay.Show();
//irrelevant code here.
}
FormWindowState saveWinState = new FormWindowState();
void onOverlayShow(object sender, EventArgs e)
{
saveWinState = this.WindowState;
this.Show();
this.WindowState = FormWindowState.Normal;
}
void onOverlayHide(object sender, EventArgs e)
{
this.WindowState = saveWinState;
}
//!!!当OnHideOverlay
位于OverlayNoFocus
中时,会出现问题。//***只要OnHideOverlay
不在OverlayNoFocus
中,这些行就会按预期运行
有人能告诉我我做错了什么吗?
1条答案
按热度按时间sqyvllje1#
据我所知,应用程序的初始状态可能包含一个可见的
MainForm
,其中覆盖按钮为:[...]最小化(通过控制其大小)到屏幕顶部。
(我相信你的话,你的意思是在 * 屏幕 * 的顶部,而不仅仅是在主窗体的顶部。)
点击[覆盖]([Overlay])会使应用程序进入一种状态,其中覆盖被展开,主窗体可能是:
[...]最小化到任务栏或系统托盘。
我相信您关于这个问题的意图。停用是指任何焦点丢失都会导致恢复到原始状态,并且在以下情况下叠加应最小化:
我的第一个建议是通过引用主窗体来示例化
OverlayForm
,使其自治。同时,我将避免在Show()
方法中使用this
指针,因为如果主窗体是覆盖窗体的Owner
,那么当主窗体最小化时,它会将覆盖窗体也一起删除!所以要避免这样做。覆盖窗体
在这个方案中,消息传递被简化了,因为
OverlayForm
可以直接作用于MainForm
,Deactivate
事件所要做的就是取消选中Overlay
按钮。