2011-08-04 5 views
7

私はC#でWindowsフォームを使用しています。フォームとプロセスボタンのクリックを同時にアクティブにしますか?

私はtoolStarsButtonsを含むいくつかのツールバーを持つメインフォームを持っています。データを含む別のフォームを使用した後、メインフォームはフォーカスを失い、toolStripButtonをクリックしてもOnClickイベントは発生しません。最初のクリックでメインフォームがアクティブになり、2回目のクリックだけが実際にボタンを押します。 Clickイベントを発生させるためにボタンを1回だけクリックする必要があります。ありがとう。

注:

  • 私はMDIを使用していたし、親のフォームのボタンをクリックして何も問題はありませんでした。しかし今や最も重要なのは、複数のディスプレイに自由に浮かぶフォームを持つことです。
  • ワーカーフォームは、メインフォームを所有者プロパティとして持ちます。このように、メインフォームの上にとどまります。
  • 無効なフォームのボタンをクリックすると、MouseHover、MouseEnter、MouseDown、MouseUpのいずれも起動しません。これは主フォームのActivateイベントです。
  • メインフォーム上のツリービュー(タブコントロール内部、スプリットコンテナ内、パネル内)があります。その項目は、メインフォームが非アクティブであっても、最初のマウスクリックで選択されます。私はすべてのコントロールが等しいとは思わない!

答えて

6

ToolStripを継承し、WndProcを継承するクラスを作成する必要があります。これはそれを行う一つの方法です。他にもあります。

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

私は私が思いついた解決策は、より後者のように働いたと思うが、私ドン、私が働いていた最後の場所で、このに走った:私もこのソリューションを見てきました

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

私が使用した正確なコードにアクセスできません。

+2

私は第二の溶液を使用していますし、それは素晴らしい作品を内蔵。ありがとうございました! –

+0

ちょうどメモ、それはbase.WndProc(ref m)でなければなりません。 –

+0

申し訳ありませんが、私はVBからその1つを自動変換しました。私はそれを修正します。 – dwidel

-4

uが国境なしでフォームを持っているので、このロジックはあなたのために働いていた場合:)

form.FormBorderStyle = FormBorderStyle.None 
+4

あなたの答えは質問とは関係がないようです。 – LarsTech

関連する問題