0

現在、完全に透明な背景を持つフォームがあります。現時点では、ユーザーがフォーム上のコントロールにカーソルを合わせたときにフォーラムの上部に表示されるボックスを描く必要があります。

スクリーンショット!

PictureBox にカーソルを合わせると、MouseEnterイベントが適切にトリガーされ、ボタンVisibleの状態が true に設定され、MouseLeaveイベントによって false に設定されます。ボタン自体には同じイベントがMouseEnterありMouseLeaveますが、Winforms はフォーム上の透明なスペースの下にあるフォームにマウス イベントを渡すため (ボタンで使用されている画像もそれらの周りで透明です)、ボタンをクリックすると消えます。フォームは、マウスがボタンまたはフォームの両方を「左」にしたと考えているためです。イベントのパススルーを停止する方法を知っている人はいますか?

あなたが尋ねるいくつかのコード?あなたが得るいくつかのコード:)

// Form Constructor!
// map = picturebox, this = form, move = first button, attach = second button
public Detached(PictureBox map)
{
    InitializeComponent();
    doEvents(map, this, this.attach, this.move);
}

// doEvents method! I use this to add the event to all controls
// on the form!
void doEvents(params Control[] itm)
{
    Control[] ctls = this.Controls.Cast<Control>().Union(itm).ToArray();
    foreach (Control ctl in ctls)
    {
        ctl.MouseEnter += (s, o) =>
        {
            this.attach.Visible = true;
            this.move.Visible = true;
        };
        ctl.MouseLeave += (s, o) =>
        {
            this.attach.Visible = false;
            this.move.Visible = false;
        };
    }
}
4

1 に答える 1

0

私を正しい方向に向けてくれた Hans Passant に感謝します。私は、マウスが50ミリ秒ごとに境界内にあるかどうかをチェックするスレッドを作成しました。

public Detached(PictureBox map)
{
    Thread HoverCheck = new Thread(() =>
    {
        while (true)
        {
            if (this.Bounds.Contains(Cursor.Position))
            {
                ToggleButtons(true);
            }
            else
            {
                ToggleButtons(false);
            }
            Thread.Sleep(50);
        }
    });
    HoverCheck.Start();
}

void ToggleButtons(bool enable)
{
    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(() => ToggleButtons(enable)));
        return;
    }

    this.attach.Visible = enable;
    this.move.Visible = enable;
    this.pictureBox1.Visible = enable;
}

ありがとう :)

于 2013-01-21T06:04:38.183 に答える