1

2 つの winform があり、それらの間でデータを渡したいと考えています。

Form 1 は大きなピクチャーボックスにすぎません。

Form2 は、フォーム 1 の上で常に開いたままです。これは、Exit ボタンのある半透明のコントロールとして機能し、トラックバーを追加しました。終了ボタンは正常に機能しますが、値が変更された場合にトラックバーの値を読み取るのに問題があります。

私がしたいのは、トラックバーの値が変更された場合、値が最初のフォームに送信され、イベントがトリガーされることです。

これのどこが間違っているのですか?

Form1は

    public sbyte value
    {
        get { return Exitform.myValue; }
    }

    public Fullscreenpreview(string filename)
    {
        InitializeComponent();
        this.pictureBox1.MouseMove += this.pictureBox_MouseMove;

        pictureBox1.Image = new Bitmap(filename);
        pictureBox1.Refresh();

        //to show exit button which is a seperate form
        var frm3 = new Exitform();
        frm3.FormClosed += (o, e) => this.Close();

        frm3.Show();
        frm3.TopMost = true;
        //to show exit button which is a seperate form

        if (myValue != 0)
        {
            MessageBox.Show("zoinks the value is = " + value);
        }
    }

フォーム2は

public partial class Exitform : Form
{
    private const int CpNocloseButton = 0x200;

    private bool mouseIsDown = false;
    private Point firstPoint;

    public static sbyte myValue = 0;

    public Exitform()
    {
        InitializeComponent();
        this.TopMost = false;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams myCp = base.CreateParams;
            myCp.ClassStyle = myCp.ClassStyle | CpNocloseButton;
            return myCp;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        firstPoint = e.Location;
        mouseIsDown = true;
        //http://stackoverflow.com/questions/3441762/how-can-i-move-windows-when-mouse-down
    }

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseIsDown = false;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (mouseIsDown)
        {
            // Get the difference between the two points
            int xDiff = firstPoint.X - e.Location.X;
            int yDiff = firstPoint.Y - e.Location.Y;

            // Set the new point
            int x = this.Location.X - xDiff;
            int y = this.Location.Y - yDiff;
            this.Location = new Point(x, y);
        }
    }

    private void contrast_trackbar_Scroll(object sender, EventArgs e)
    {
        myValue = 1;
    }
}

ありがとうアンディ

4

2 に答える 2

1

Close イベントにバインドするのと同じ方法で、Trackbar Scroll イベントにバインドできます。Form1 と Form2 の間の「接続」を準備するだけです。

  1. トラックバーの実際の値を返すパブリック プロパティ (int TrackBarValue など) を Form2 に作成します。

  2. TrackBar の値が変更されたときに発生するパブリック カスタム イベント (EventHandler TrackBarValueChanged など) を Form2 に作成します。

  3. Form1 から TrackBarValueChanged イベントにバインドします。

それでも不明な場合は、コメントでお知らせください。

Form1.h

public Fullscreenpreview(string filename)
{
    InitializeComponent();
    this.pictureBox1.MouseMove += this.pictureBox_MouseMove;

    pictureBox1.Image = new Bitmap(filename);
    pictureBox1.Refresh();

    //to show exit button which is a seperate form
    frm3 = new Exitform();
    frm3.FormClosed += (o, e) => this.Close();
    frm3.OnTrackBarValueChanged += new EventHandler(TrackBarValueChanged_Event);

    frm3.Show();
    frm3.TopMost = true;
    //to show exit button which is a seperate form
}


private void TrackBarValueChanged_Event(Object sender, EventArgs e)
{
     ExitForm exit = (ExitForm)sender;
     MessageBox.Show("zoinks the value is = " + exit.TrackBarValue.ToString()); 
}

Form2.h

public partial class Exitform : Form
{
    private const int CpNocloseButton = 0x200;

    private bool mouseIsDown = false;
    private Point firstPoint;

    public event EventHandler OnTrackBarValueChanged;

    public Exitform()
    {
        InitializeComponent();
        this.TopMost = false;
    }

    public int TrackBarValue
    {
        get
        {
            return contrast_trackbar.Value;
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams myCp = base.CreateParams;
            myCp.ClassStyle = myCp.ClassStyle | CpNocloseButton;
            return myCp;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        firstPoint = e.Location;
        mouseIsDown = true;
        //http://stackoverflow.com/questions/3441762/how-can-i-move-windows-when-mouse-down
    }

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseIsDown = false;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (mouseIsDown)
        {
            // Get the difference between the two points
            int xDiff = firstPoint.X - e.Location.X;
            int yDiff = firstPoint.Y - e.Location.Y;

            // Set the new point
            int x = this.Location.X - xDiff;
            int y = this.Location.Y - yDiff;
            this.Location = new Point(x, y);
        }
    }

    private void contrast_trackbar_Scroll(object sender, EventArgs e)
    {
        OnTrackBarValueChanged(this, EventArgs.Empty);
    }
}
于 2013-05-04T23:33:58.317 に答える
0

Zoltan が提供する回答と、stackoverflow Zoom が 2 つのフォームを使用して提供する回答です。私が探していた答えを教えてくれました。タイトルからすぐにはわからなかった 2 つのフォームを使用したズーム。

これを回答として投稿する唯一の理由は、新しいコードを Zoltan の回答の下に別のエントリとして表示することです。コードの下にスクロールして回答を表示する必要はありません。

私がちょうど実験していたので、変数名は最初の投稿から変更されました。

フォーム1

public sbyte contrast
{
    get { return Exitform.contrastvalue; }
}

public Fullscreenpreview(string filename)
{
    InitializeComponent();
    this.pictureBox1.MouseMove += this.pictureBox_MouseMove;

    pictureBox1.Image = new Bitmap(filename);
    pictureBox1.Refresh();

    //to show exit button which is a separate form
    var frm3 = new Exitform();
    frm3.FormClosed += (o, e) => this.Close();
    frm3.TrackBarMoved += new Action<int>(ChangeContrast);//<< Added

    frm3.Show();
    frm3.TopMost = true;
    //to show exit button which is a separate form

    frm3.FormClosed -= (o, e) => this.Close();//<< for memory leaks
    frm3.TrackBarMoved -= new Action<int>(ChangeContrast);//<< for memory leaks
}

private void ChangeContrast(int contrastVal)
{
    MessageBox.Show("zoinks the value is = " + contrastVal);
}

フォーム 2

public partial class Exitform : Form
{
    private const int CpNocloseButton = 0x200;

    private bool mouseIsDown = false;
    private Point firstPoint;

    public static sbyte contrastvalue = 0;

    public Exitform()
    {
        InitializeComponent();
        this.TopMost = false;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams myCp = base.CreateParams;
            myCp.ClassStyle = myCp.ClassStyle | CpNocloseButton;
            return myCp;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        firstPoint = e.Location;
        mouseIsDown = true;
        //https://stackoverflow.com/questions/3441762/how-can-i-move-windows-when-mouse-down
    }

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseIsDown = false;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (mouseIsDown)
        {
            // Get the difference between the two points
            int xDiff = firstPoint.X - e.Location.X;
            int yDiff = firstPoint.Y - e.Location.Y;

            // Set the new point
            int x = this.Location.X - xDiff;
            int y = this.Location.Y - yDiff;
            this.Location = new Point(x, y);
        }
    }

    public event Action<int> TrackBarMoved;// << public event to sense if the trackbar is moved
    private void contrast_trackbar_Scroll(object sender, EventArgs e)
    {
        sbyte contrastVal = (sbyte)(this.contrast_trackbar.Value);//local variable just for use in trackbar

        TrackBarMoved(contrast_trackbar.Value);//pull value is trackbar moved

        string trackerbarvalue = Convert.ToString(contrastVal, CultureInfo.CurrentCulture);// convert to string to push to label
        contrastlabel.Text = trackerbarvalue;//actual push to label

        contrastvalue = (sbyte)contrast_trackbar.Value;
    }
}

変数の名前変更、内部のクリーンアップ、およびトラックバーの値のラベルへのレポートを除いて、コードには小さな変更がいくつかあります。Zoltan が正しく指摘したように、close イベントをバインドするのと同じ方法で、トラックバーのスクロール イベントをバインドする必要がありました。これはで行われます。

frm3.TrackBarMoved += new Action<int>(ChangeContrast);//<< Added

リソースリークを防ぐために、購読解除も追加しました

frm3.FormClosed -= (o, e) => this.Close();//<< for memory leaks
frm3.TrackBarMoved -= new Action<int>(ChangeContrast);//<< for memory leaks

別の形では

public event Action<int> TrackBarMoved;// << public event to sense if the trackbar is moved

イベントのブロードキャストに使用されます

ありがとうアンディ

于 2013-05-05T11:41:02.530 に答える