2011-06-24 39 views
0

所以我正在做一个覆盖,我需要它总是在最上面。要做到这一点,我只是设置C# - 窗口始终处于顶部问题

chackBox1.checked = true; 

private void checkChanged(object sender, EventArgs e) 
{ 
     this.TopMost = checkBox1.Checked; 
} 

,因为它是在许多地方建议。这里的问题是 1)我需要一个复选框按钮......但这不是一个问题,我可以设置为Visible = false。 2)它永远不会工作,直到我用我的鼠标手动检查框!即使我将它设置为检查,设置form1.isTopMost = true(在initComponents之后)并调用checkChanged事件,我总是必须手动选中该框,然后才能始终保持最佳状态!

请帮忙!我该如何做到这一点,以便覆盖总是在最上面?

我的下一步是使一个线程,将强制形式留在上面,但我想避免这种LOL

感谢,

戴夫

+4

你为什么不只是设置表单的属性检查器最上和最下降的复选框? –

+0

我对财产审查员不熟悉,你能给我更多的细节吗?我使用复选框控件,因为这就是所有使用的示例 –

+0

@David:他意味着Visual Studio中控件的属性。 – 2011-06-24 18:57:18

回答

1

还有别的东西错了。只要属性值发生变化,那些属性更改事件就会触发,无论这是由您的代码,控件自己的代码还是数据绑定完成的。如果选中状态为true,则在复选框状态更改之前,它可能不会触发处理程序。

你应该在你checkChanged(..)事件显示,当您编程设置checkBox1为true或手动选中复选框火了一个消息。这将有助于调试。由于checkChanged不是这种类型事件的典型默认名称,因此我猜测您已将其更改为可以完全指向不同的事件处理函数。

0

好吧,伙计们!感谢您的帮助,我会在触发它之后给出0A0D的答案!

我设置最顶层=在两个聚焦真实,对窗口无焦点的情况下,我用.Focus()和.Show初始化后,一切似乎工作!

谢谢!

+0

我欣赏接受,但你的是固定的。我很高兴我以任何方式帮助。 – 2011-06-24 19:06:40

2

设置Topmost = truegetfocuslostfocus直到你有一个消息框从你正在运行的某个EXE弹出来,点击弹出消息框的顶部栏会把你的窗口背景。

试试这个,实现这一目标的一个非常强大的方式:

namespace WindowsFormsApplication52 
{ 
    public partial class Form1 : Form 
    { 
     static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 
     static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2); 
     static readonly IntPtr HWND_TOP = new IntPtr(0); 
     static readonly IntPtr HWND_BOTTOM = new IntPtr(1); 
     const UInt32 SWP_NOSIZE = 0x0001; 
     const UInt32 SWP_NOMOVE = 0x0002; 
     const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 
     } 
    } 
} 
相关问题