none
想要在PictureBox上畫圖 RRS feed

  • 問題

  • 前輩好,目前在PictureBox上畫圖出現了瓶頸,希望前輩能指點,

    期望情況:會讀Json檔,Json檔包含Image和一些資訊,會將Image放入Panel裡面的PictureBox中,

    使用者看到那張圖片後,再自動依據那些資訊在PictureBox上面畫畫給使用者看。

    而以下是我的情況:

    能讀取Json檔,也能把Image放入Panel裡面的PictureBox中。

      private void BindingfxcBackGround(string filePath)
            {
                var replacePath = filePath.Replace("fxc", "jpg");
    
                _picture.Image = Image.FromFile(replacePath);
                _picture.SizeMode = PictureBoxSizeMode.Zoom;
                _picture.Dock = DockStyle.Fill;
                //_picture.DoubleClick += _picture_DoubleClick;
                _picture.KeyDown += _picture_KeyDown;
    
                panel1.Dock = DockStyle.Fill;
                panel1.AutoScroll = true;
                panel1.Controls.Add(_picture);
            }

    接著去讀Json檔案中的某些資訊,但無法畫在剛剛讀出來的圖上

    private readonly PictureBox _picture = new PictureBox();

     private readonly Graphics _graPanel;

    public Form1() { InitializeComponent(); this.AutoScroll = true; this.KeyPreview = true; _graPanel = _picture.CreateGraphics(); }

    事件,不管是PictureBox_1_Paint或是Panel1_Paint事件都試過了

        private void panel1_Paint(object sender, PaintEventArgs e)
            {
                DrawWebSign();
            }

    //開始畫線

         private void DrawWebSign()
            {
                if (_trackInfos != null)
                {
                    foreach (var subItem in _trackInfos.item)
                    {
                        for (int i = 0; i < subItem.points.Count - 1; i++)
                        {
                            var timeStart = PadLeftMillSeconds(subItem.points[i].t);
                            var timeEnd = PadLeftMillSeconds(subItem.points[i + 1].t);
    
                            var millisecondsTimeout =
                                Convert.ToInt32(timeEnd.TimeOfDay.TotalMilliseconds - timeStart.TimeOfDay.TotalMilliseconds);
    
                            Thread.Sleep(millisecondsTimeout);
    
                            var x1 = subItem.points[i].x;
                            var x2 = subItem.points[i + 1].x;
                            var y1 = subItem.points[i].y;
                            var y2 = subItem.points[i + 1].y;
                            _graPanel.DrawLine(_pen, x1, y1, x2, y2);
                        }
                    }
                }
            }

    我的程式邏輯是先做

    BindingfxcBackGround();

    才做

    DrawWebSign();

    也就是我先動態產生出PictureBox畫板,才在畫板上面畫畫。

    但實際跑出來卻像是先畫畫才產生出PictureBox。

    (這點不確定,我是把_graPanel改成綁定MainForm成為畫板,看到會先在Form上畫畫,才顯示選取圖片才猜測的。)

    是我哪裡邏輯搞錯了嗎?

    希望前輩能指點,謝謝

    2020年2月3日 上午 05:56

解答

所有回覆