0

私はmaの形で2つのパネルを持っています。位置x:10、y:10にボタン1が付いたpanel1と、位置x:10、y:10にボタン2が付いたpanel2とします。

実際のbutton1の機能:-panel1を非表示にし、同じ場所にpanel2を表示します。

しかし、プロセスの完了後にbutton1を2回クリックすると、button2clickイベントが発生します。

plzは私をできるだけ早く助けてくれます

以下のリンクが私の問題を明確に示すことを願っています

http://www.youtube.com/watch?v=bpojl4XMweo&feature=g-upl

編集:

これまでに使用されたコード

void hidepanel()
{
    panel1.Visible = false;
    panel2.Visible = false;
}

private void Form1_Load(object sender, EventArgs e)
{
    hidepanel();
    panel1.Visible = true;
    panel2.Location = new Point(262,19);
    panel1.Location = new Point(0, 0);
}

private void button1_Click(object sender, EventArgs e)
{
    hidepanel();
    panel2.Location = new Point(0, 0);
    panel2.Visible = true;
}

private void button2_Click(object sender, EventArgs e)
{
    MessageBox.Show("2");
}
4

1 に答える 1

3

反対側のコンポーネントを非表示/再表示して有効/無効にするロジックを追加するだけです。ちょうどこのような:

    private void button1_Click(object sender, EventArgs e)
    {
        addLog("Button 1 clicked");
        button1.Enabled = false;
        button2.Enabled = false;
        panel1.Visible = false;
        panel2.Visible = true;
        button2.Enabled = true;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        addLog("Button 2 clicked");
        button2.Enabled = false;
        panel2.Visible = false;
        panel1.Visible = true;
        button1.Enabled = true;

    }

チャームのように私のために働きます:

ここに画像の説明を入力してください ここに画像の説明を入力してください

よろしく

ジョセフ

編集:今、私は問題を確認しました、あなたが無効/非表示のボタン1をクリックしたにもかかわらず、マウスクリックがWindowsメッセージキューにエンキューされ、ボタン2でクリックイベントを発生させます。

私はここで解決策を見つけました:キューに入れられたマウスイベントを無視する

コードを次のように変更しました。

        public static void ClearMouseClickQueue()
    {
        win32msg.NativeMessage message;
        while (win32msg.PeekMessage(out message, IntPtr.Zero, (uint)win32msg.WM.WM_MOUSEFIRST, (uint)win32msg.WM.WM_MOUSELAST, 1))
        {
        }
    }
    ...
            private void button1_Click_1(object sender, EventArgs e)
    {
        addLog("Button 1 clicked");
        button1.Enabled = false;
        button2.Enabled = false;
        panel1.Visible = false;
        System.Threading.Thread.Sleep(2000);
        ClearMouseClickQueue();
        panel2.Visible = true;
        button2.Enabled = true;
    }

ここで、PeekMessageなどは別のクラスで定義されています。

    using System;

    using System.Collections.Generic;
    using System.Text;

    using System.Runtime.InteropServices;

    namespace PanelTest
    {
        public static class win32msg
        {
            [DllImport("coredll.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);

            public enum WM : uint{
                /// <summary>
                /// Use WM_MOUSEFIRST to specify the first mouse message. Use the PeekMessage() Function.
                /// </summary>
                WM_MOUSEFIRST = 0x0200,
                /// <summary>
                /// Use WM_MOUSELAST to specify the last mouse message. Used with PeekMessage() Function.
                /// </summary>
                WM_MOUSELAST = 0x020E,
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct NativeMessage
            {
                public IntPtr handle;
                public uint msg;
                public IntPtr wParam;
                public IntPtr lParam;
                public uint time;
                public System.Drawing.Point p;
            }
        }
    }

テストしてください。

〜josef

于 2012-11-20T14:30:54.947 に答える