0

次の問題があります。特定の色、たとえば赤のパネルがあります。ユーザーがマウスを押すと、このパネルの色が変数に格納されます。次に、ユーザーはマウスを押したまま別のパネルに移動します。そこでマウスを放すと、このパネルは、変数に格納された最初の背景色を取得するはずです。私のコードは次のようになります。

    public Color currentColor;
    private void ColorPickMouseDown(object sender, MouseEventArgs e)
    {
        Panel pnlSender = (Panel)sender;                   
        currentColor = pnlSender.BackColor;
    }

    private void AttempsColorChanger(object sender, MouseEventArgs e)
    {
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
    }

このイベントをトリガーできるパネルが多数あるため、最初に送信者を特定する必要があります。最初の MouseDown メソッドはまったく問題なく機能し、色は変数に適切に格納されています。ただし、ユーザーが上で説明したことを実行しても、2 番目のものはトリガーされません。ser が 2 番目のパネルをクリックすると、機能します (クリックには MouseUp 部分もあると思います)。

ここで何が問題なのですか?ユーザーが以前にマウス キーを押したままにすると、イベントがトリガーされないのはなぜですか?

4

4 に答える 4

1

マウスがターゲット コントロールに入ると、マウス ダウンがトリガーされ、ターゲットの BackColor が取得されます。コードにブール値フラグを追加する必要があります:

 public Color currentColor;       
 bool flag=false;
    private void ColorPickMouseDown(object sender, MouseEventArgs e)
    {
        if(flag==false)
        {
        flag=true
        Panel pnlSender = (Panel)sender;                   
        currentColor = pnlSender.BackColor;
       }
    }
    //assume mouse up for panles
    private void AttempsColorChanger(object sender, MouseEventArgs e)
    {
       if(flag==true)
       {  
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
        flag=flase;
       }
    }

また、 mouseMove( if ) でフラグを変更する必要があります

于 2013-04-20T19:47:49.520 に答える
0

DragDropコメントで述べたように、マウス イベントは元のコントロールによってキャプチャされます。おそらく、 Windows フォームに組み込まれている機能を使用する方がよいでしょう。このようなものがうまくいくはずです。共通のイベント ハンドラーを割り当てたので、それらをすべてのパネルに割り当てて機能させることができます。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void panel_MouseDown(object sender, MouseEventArgs e)
    {
       ((Control)sender).DoDragDrop(((Control)sender).BackColor,DragDropEffects.All);
    }

    private void panel_DragDrop(object sender, DragEventArgs e)
    {
        ((Control)sender).BackColor = (Color)e.Data.GetData(BackColor.GetType());
    }
    private void panel_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }

}
于 2013-04-20T21:12:52.663 に答える
0

古い質問であることは知っていますが、同じ問題があり、上記の回答はどれもうまくいきませんでした。私の場合、ターゲット コントロールで MouseMove イベントを処理し、マウスが解放されるかどうかを確認する必要がありました。万が一に備えて、ターゲットパネルに「BringToFront」を設定しました。

public Color currentColor;
private void ColorPickMouseDown(object sender, MouseEventArgs e)
{
    Panel pnlSender = (Panel)sender;                   
    currentColor = pnlSender.BackColor;
}

private void panelTarget_MouseMove(object sender, MouseEventArgs e)
{
    //the mouse button is released
    if (SortMouseLocation == Point.Empty)
    {
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
    }
}
于 2016-06-07T11:10:40.357 に答える