0

長方形/楕円を含むpanel( System.Windows.Forms.Panel) を使用して UI を作成しています。形状のサイズ (幅/高さ) は、水平および垂直のスライダーに依存します。以下のコードは、望ましい動作をある程度実現します。ただし、スタイルのないパネルの中心を表す線は正常に機能しますが、スタイルDashDotまたはのスタイルDashは、指定されたポイント (startPoint、endPoint) ではなく、パネルの対角線と側面を横切る線になります。パネルのサイズに基づいて長方形を中央に配置する方法はありますか?

private void vScroll_Scroll(object sender, ScrollEventArgs e)
{
    this.vScrollValue.Text = vScrollBar.Value.ToString();
    panel.Invalidate(/*myRectangle*/);
}

private void hScrollBar_Scroll(object sender, ScrollEventArgs e)
{
    this.hScrollValue.Text = hScrollBar.Value.ToString();
    panel.Invalidate(/*myRectangle*/);
}

private void panel_Paint(object sender, PaintEventArgs e)
{
    myRectangle = new Rectangle(90, 90, hScrollBar.Value, vScrollBar.Value);
    System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();
    messageBoxCS.AppendFormat("panel.Location.X = {0} panel.Location.Y = {1} (panel.Size.Height/2) = {2}", panel.Location.X, panel.Location.Y, e.ClipRectangle);
    //MessageBox.Show(messageBoxCS.ToString(), "Panel Paint");
    //Panel's midpoint (location(x,y) = 88,44, Size(x,y) = 182,184)
    Point startPoint = new Point(e.ClipRectangle.Location.X, e.ClipRectangle.Location.Y + (e.ClipRectangle.Size.Height / 2));
    Point endPoint = new Point(e.ClipRectangle.Location.X + e.ClipRectangle.Size.Width,     e.ClipRectangle.Location.Y + (e.ClipRectangle.Size.Height / 2));

    Pen dashRed = Pens.Red;
    e.Graphics.DrawRectangle(Pens.Black, myRectangle);
    //dashRed.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
    e.Graphics.DrawLine(Pens.Red, startPoint, endPoint); 
}

メソッド内でInitializeComponent()、paintHandler イベントは次のように登録されます。

 this.panel.Paint += new System.Windows.Forms.PaintEventHandler(this.panel_Paint);

また、C# が初めてなのでMicorsoft.VisualBasic.Powerpack、WinForms.Panel を使用する代わりに、ShapeContainers/RectangleShape/EllipseShape を使用する必要がありますか?

4

1 に答える 1

0

これは正しいはずです:

private void panel_Paint(object sender, PaintEventArgs e)
{
    myRectangle = new Rectangle(90, 90, hScrollBar.Value, vScrollBar.Value);
    System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();
    messageBoxCS.AppendFormat("panel.Location.X = {0} panel.Location.Y = {1} (panel.Size.Height/2) = {2}", panel.Location.X, panel.Location.Y, e.ClipRectangle);
    //MessageBox.Show(messageBoxCS.ToString(), "Panel Paint");
    //Panel's midpoint (location(x,y) = 88,44, Size(x,y) = 182,184)
    e.Graphics.DrawRectangle(Pens.Black, myRectangle);
    if(e.ClipRectangle.Location.Y < this.Size.Height / 2 && e.ClipRectangle.Location.Y + e.ClipRectangle.Size.Height > this.Size.Height / 2)
    {
    Point startPoint = new Point(e.ClipRectangle.Location.X, this.Size.Height / 2);
    Point endPoint = new Point(e.ClipRectangle.Location.X + e.ClipRectangle.Size.Width,  this.Size.Height / 2);
    Pen dashRed = Pens.Red;
    dashRed.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
    e.Graphics.DrawLine(dashRed, startPoint, endPoint); 
    }  
}

これは、ClipRectangle で機能させる方法です。または、ハンスが指摘したように、それらを無視することもできます。おそらく、この単純なアプリでは、速度が低下することはありません.

于 2013-07-30T19:09:42.173 に答える