2014-02-19 48 views
1

IDE:visual studio,c#,Windows應用程序如何在其他面板重疊的面板上畫一條線?

我試圖在面板上劃一條線。點擊它就可以在panel1上畫線。

//Code 

public partial class Form1 : Form 
{ 
    static int px=5, py=5; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawLine(Pens.Red, 5, 5, px, py); 
    } 

    private void panel1_MouseDown(object sender, MouseEventArgs e) 
    { 
     initilizeXY(e.X, e.Y); 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 

    } 
    private void initilizeXY(int pxx, int pyy) 
    { 
     px = pxx; 
     py = pyy;   

    } 

    private void panel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     panel1.Refresh(); 
    } 

    private void panel2_MouseDown(object sender, MouseEventArgs e) 
    { 
     initilizeXY(e.X, e.Y); 
    } 
} 

//由此代碼我能夠繪製鼠標上的線向下面板1

上,但由於一些要求改變存在另一面板(是Panel2),其是部分重疊PANEL1。

現在我想在panel1上繪製相同的線條,如果用戶點擊panel1或panel2。

請建議如何完成這項工作?

+0

所以,你要線路從PANEL1繼續PANEL2? –

+0

是的,我想,因爲在panel1上有一個小面板panel2,我想如果我點擊panel2我想在panel2上有相同的功能(畫線)(實線)。 – yogeshkmrsoni01

+0

這我相信涉及一些數學。找到你的線和麪板2之間的交點。然後畫兩條線。可能有一個更簡單的解決方案,但我現在不能想到其他的東西 –

回答

0

編輯:修復代碼以正常工作。 在panel1與panel1右側的panel1重疊的情況下進行了測試,開始時略低於panel1的頂端。

寫這段代碼我認爲panel2的X和Y座標大於panel1的座標。也許你應該扭轉抵消計算,如果是相反的方式。

public partial class Form1 : Form 
{ 
    static int px = 5, py = 5; 
    static int p2x = 0, p2y = 0; 
    int offsetX; 
    int offsetY; 

    public Form1() 
    { 
     InitializeComponent(); 
     offsetX = panel2.Location.X - panel1.Location.X; 
     offsetY = panel2.Location.Y - panel1.Location.Y; 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawLine(Pens.Red, 5, 5, px, py); 
    } 

    private void panel1_MouseDown(object sender, MouseEventArgs e) 
    { 
     initilizeXY(e.X, e.Y); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
    } 

    private void initilizeXY(int pxx, int pyy) 
    { 
     px = pxx; 
     py = pyy; 
    } 

    private void initilizeXY2(int pxx, int pyy) 
    { 
     p2x = pxx; 
     p2y = pyy; 
    } 

    private void panel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     panel1.Refresh(); 
     panel2.Refresh(); 
    } 

    private void panel2_MouseDown(object sender, MouseEventArgs e) 
    { 
     initilizeXY(e.X+offsetX, e.Y+offsetY); 
     initilizeXY2(e.X, e.Y); 
    } 

    private void panel2_Paint(object sender, PaintEventArgs e) 
    { 
     if (px > offsetX && py > offsetY) 
     { 
      int p2start = findIntersectFromLineEquation(new Point(5, 5), new Point(px, py)); 

      e.Graphics.DrawLine(Pens.Red, 0, p2start - offsetY, p2x, p2y); 
     } 
    } 

    private int findIntersectFromLineEquation(Point start, Point end) 
    { 
     if (start.X == end.X || start.Y == end.Y) 
      return 0; 

     double a = (double)(end.Y - start.Y)/(double)(end.X - start.X); 
     double b = (double)(start.Y) - (double)(a * start.X); 

     return (int)(a * offsetX + b); 
    } 
} 

請記得訂閱相應的事件。

0

此代碼:

Point bgn1 = new Point(5, 5); 
Point end1 = new Point(5, 5); 
Point bgn2 = new Point(0, 0); 
Point end2 = new Point(0, 0); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Point pnt, pntscr; 

    pnt.X = 5; 
    pnt.Y = 5; 

    pntscr = Panel1.PointToScreen(pnt); 

    bgn2 = Panel2.PointToClient(pntscr); 
    end2 = bgn2; 
} 

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    end1.X = e.X; 
    end1.Y = e.Y; 

    Point pntscr; 

    pntscr = Panel1.PointToScreen(end1); 

    end2 = Panel2.PointToClient(pntscr); 
} 

private void panel1_MouseUp(object sender, MouseEventArgs e) 
{ 
    panel1.Refresh(); 
    panel2.Refresh(); 
} 

private void panel2_MouseDown(object sender, MouseEventArgs e) 
{ 
    end2.X = e.X; 
    end2.Y = e.Y; 

    Point pntscr; 

    pntscr = Panel2.PointToScreen(end2); 

    end1 = Panel1.PointToClient(pntscr); 
} 

private void panel2_MouseUp(object sender, MouseEventArgs e) 
{ 
    panel1.Refresh(); 
    panel2.Refresh(); 
} 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(Pens.Red, bgn1, end1); 
} 

private void panel2_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(Pens.Red, bgn2, end2); 
} 

瓦爾特