質問

たいります。Windowsの場合です。ます。形の場合、ユーザーをクリックでもどこでも外します。たって使用IMessageFilterもし】なしのメッセージに渡されるPreFilterMessage.どうかをクリックの外形のウィンドウ?

役に立ちましたか?

解決 2

さま p-パパこの質問, 私がその場で発音を確認することがこのソリューションで使えるようになったのでShowDialog:

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    this.Capture = true;
}

protected override void OnCaptureChanged(EventArgs e)
{
    if (!this.Capture)
    {
        if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
        {
            this.Close();
        }
        else
        {
            this.Capture = true;
        }
    }

    base.OnCaptureChanged(e);
}

他のヒント

フォームのDeactivateイベントに、「quot.this.Close()」を入れます。 Windowsの他の場所をクリックするとすぐにフォームが閉じます。

更新:現在持っているのはボリュームボタンだと思います。Clickイベント内でVolumeSliderフォームのインスタンスを作成し、ユーザーがポップアップフォームを閉じるまでブロックするShowDialog()を呼び出してインスタンスを表示します。 。次の行では、ユーザーが選択したボリュームを読み取り、プログラムで使用します。

これは問題ありませんが、お気づきのとおり、メインプログラムに戻るためにユーザーがポップアップを明示的に閉じることを強制します。 Show()はポップアップフォームでここで本当に使用したいメソッドですが、Show()はブロックしません。つまり、メインフォームでのClickイベントは新しいボリュームが何であるかを知らずに終了します。

簡単な解決策は、メインフォームに次のようなパブリックメソッドを作成することです。

public void SetVolume(int volume)
{
    // do something with the volume - whatever you did before with it
}

次に、ボリュームボタンのクリックイベント(メインフォームでも同様)で、VolumeSliderを次のように表示します。

VolumeSlider slider = new VolumeSlider();
slider.Show(this); // the "this" is needed for the next step

VolumeSliderフォームでは、ユーザーがスクロールバーを操作すると(推測)、このコードをスクロールバーのValueChangedイベントに配置します(それが何だと思います):

MainForm owner = (MainForm)this.Owner;
owner.SetVolume(scrollbar.Value);

そして、VolumeSliderフォームのDeactivateイベントに、上記のようにthis.Close()を配置します。フォームは期待どおりに動作します。

Simonのソリューションでは、Noamによる同じ問題記述がありました。次のコードでは、「クリックスルー」を回避しています。問題...

protected override void WndProc(ref Message m)
{    
    base.WndProc(ref m);

    // if click outside dialog -> Close Dlg
    if (m.Msg == NativeConstants.WM_NCACTIVATE) //0x86
    {
        if (this.Visible)
        {
            if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
                this.Close();
        }
    }
}

それがMDIアプリケーションの子フォームである場合、親フォームでクリックをトラップできます。そうしないと、解決策が乱雑になります。

とにかく直感的なUIの動作を表すものをあなたが提案することを確信していません。それが最高のデザインですか?

コントロールの操作を可能にすることを除き、メニューのように動作するポップアップウィンドウを作成しようとしている場合は、ツールストリップドロップダウン内でユーザーコントロールをホストしてみてください。

単純な方法: Form1では、次のコードを使用してform2を呼び出します。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles     Button1.Click
    Form2.Owner = Me
    Form2.Show()
End Sub

その後、form1でこのコードを再度使用します。

Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    If Form2.IsHandleCreated = True Then
        Form2.Close()
    End If
End Sub

これは簡単です:

private void button1_Click(object sender, EventArgs e)
    {
        Form f = new Form();
        f.LostFocus +=new EventHandler(f_LostFocus);
        f.Show();
    }

    void f_LostFocus(object sender, EventArgs e)
    {
        Form f = sender as Form;
        f.Close();
        f.Dispose();
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top