2009-06-19 16 views
4

ユーザーがメニュー項目の上を移動するたびに、モードレスメッセージボックスを表示する必要があります。 messagebox.show(...)はモーダルなので使用できません。だから私は、別のウィンドウフォームを作成し、メニュー項目のホバーイベントを使用してフォームを表示することでした。私は2つの問題があります:モードレスメッセージボックスをツールチップとして表示する方法の考え方

1)ウィンドウが表示されると、メニューは表示されなくなります。
2)ツールチップの表示方法のように、メニュー項目の横にウィンドウのフォームが表示されません。

コンポーネントのツールチップをどのように見せて、ウィンドウのように見えるようにするためのアイデアはありますか?あなたはFormStartPosition.Manualform.StartPositionプロパティを設定した場合、あなたは(たとえば)カーソルでフォームを配置することができます

form.StartPosition = FormStartPosition.Manual; 
form.Location = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1); 

これはあなたの最初の問題に役立つかもしれないあなたの第二の問題に答えるために

答えて

5

あまりにも。

フォームを使用すると、次のイベントハンドラコードを追加した場合、それが与えるかもしれないその後、ツールチップのように動作する場合は、あなたが欲しい欲しい:

private void Form_MouseLeave(object sender, EventArgs e) 
    { 
     // Only close if cursor actually outside the popup and not over a label 
     if (Cursor.Position.X < Location.X || Cursor.Position.Y < Location.Y || 
      Cursor.Position.X > Location.X + Width - 1 || Cursor.Position.Y > Location.Y + Height - 1) 
     { 
      Close(); 
     } 
    } 

これは、フォームの位置を設定する際に-1を説明します。これは、最初に表示されるときにカーソルが実際にフォーム上にあることを保証します。

5

Formクラスは、ネイティブウィンドウの周りだけのラッパーですので、あなたはほとんどのツールチップウィンドウとして見え、独自のポップアップフォームを作成するには、以下のスニペットを使用することができますが:

public class PopupForm : Form 
{ 
    private const int SWP_NOSIZE = 0x0001; 
    private const int SWP_NOMOVE = 0x0002; 
    private const int SWP_NOACTIVATE = 0x0010; 

    private const int WS_POPUP = unchecked((int)0x80000000); 
    private const int WS_BORDER = 0x00800000; 

    private const int WS_EX_TOPMOST = 0x00000008; 
    private const int WS_EX_NOACTIVATE = 0x08000000; 

    private const int CS_DROPSHADOW = 0x00020000; 

    private static readonly IntPtr HWND_TOPMOST = (IntPtr)(-1); 

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

    public PopupForm() 
    { 
     InitializeComponent(); 
     SetStyle(ControlStyles.Selectable, false); 
     Visible = false; 
    } 

    protected virtual void InitializeComponent() 
    { 
     FormBorderStyle = FormBorderStyle.None; 
     StartPosition = FormStartPosition.Manual; 
     ShowInTaskbar = false; 
     BackColor = SystemColors.Info; 

     // ... 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.Style |= WS_POPUP; 
      cp.Style |= WS_BORDER; 
      cp.ExStyle |= WS_EX_TOPMOST | WS_EX_NOACTIVATE; 
      //if (Microsoft.OS.IsWinXP && SystemInformation.IsDropShadowEnabled) 
      // cp.ClassStyle |= CS_DROPSHADOW; 
      return cp; 
     } 
    } 

    protected override bool ShowWithoutActivation 
    { 
     get { return true; } 
    } 

    public new void Show() 
    { 
     SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);  
     base.Show(); 
    } 

    public void Show(Point p) 
    { 
     Location = p; 
     Show(); 
    } 
} 

コントロールの表示と、このフォーム()とHide()メソッドを外部コードから削除します。

関連する問題