views:

35

answers:

1

When PictureBox have parent ListView and ListView RightToLeft set to true/yes I received some artifacts on drawing.

Why this happens and how remove this artifacts?

Images

http://i.imgur.com/kx0zQ.png http://i.imgur.com/E5il3.png

public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
  }

  void DrawOnPictureBox(PictureBox pc)
  {  
   int delta;
   int.TryParse((string)comboBox1.SelectedItem, out delta);
   pc.Width = 100;
   pc.Height = 40;

   if (pc.Image == null)
    pc.Image = new Bitmap(pc.Width, pc.Height);
   else
    if (pc.Image.Width != pc.Width || pc.Image.Height != pc.Height)
     pc.Image = new Bitmap(pc.Width, pc.Height);

   Graphics gr = Graphics.FromImage(pc.Image);
   gr.Clear(Color.White);

   int paintWidth = pc.Width - 1;
   int paintHeight = pc.Height - 1;
   PointF[] points = new PointF[4];

   points[0] = new PointF(delta, paintHeight - 1);
   points[1] = new PointF(paintWidth - delta, paintHeight - 1);
   points[2] = new PointF(paintWidth - delta, 0);
   points[3] = new PointF(delta, 0);

   //gr.DrawPolygon(new Pen(Color.Black), points);
   /**/
   gr.DrawLine(new Pen(Color.Black), points[0], points[1]);
   gr.DrawLine(new Pen(Color.Black), points[1], points[2]);
   gr.DrawLine(new Pen(Color.Black), points[2], points[3]);
   gr.DrawLine(new Pen(Color.Black), points[3], points[0]);
   /**/

   gr.DrawString("1", this.Font, new SolidBrush(Color.Black), 10, 10);
  }

  private void button1_Click(object sender, EventArgs e)
  {
   pictureBox1.Parent = listView1;
   DrawOnPictureBox(pictureBox1);

   pictureBox2.Parent = listView2;
   DrawOnPictureBox(pictureBox2);

   pictureBox3.Parent = listView3;
   DrawOnPictureBox(pictureBox3);   
  }

  private void checkBox1_CheckedChanged(object sender, EventArgs e)
  {
   if (checkBox1.Checked)
   {
    listView1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
    listView1.RightToLeftLayout = true;

    listView2.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
    listView2.RightToLeftLayout = true;

    listView3.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
    listView3.RightToLeftLayout = true;
   }
   else
   {
    listView1.RightToLeft = System.Windows.Forms.RightToLeft.No;
    listView1.RightToLeftLayout = false;

    listView2.RightToLeft = System.Windows.Forms.RightToLeft.No;
    listView2.RightToLeftLayout = false;

    listView3.RightToLeft = System.Windows.Forms.RightToLeft.No;
    listView3.RightToLeftLayout = false;
   }
  }
 }



    namespace WindowsFormsApplication2
{
 partial class Form1
 {
  /// <summary>
  /// Required designer variable.
  /// </summary>
  private System.ComponentModel.IContainer components = null;

  /// <summary>
  /// Clean up any resources being used.
  /// </summary>
  /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  protected override void Dispose(bool disposing)
  {
   if (disposing && (components != null))
   {
    components.Dispose();
   }
   base.Dispose(disposing);
  }

  #region Windows Form Designer generated code

  /// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>
  private void InitializeComponent()
  {
   this.button1 = new System.Windows.Forms.Button();
   this.checkBox1 = new System.Windows.Forms.CheckBox();
   this.listView1 = new System.Windows.Forms.ListView();
   this.pictureBox1 = new System.Windows.Forms.PictureBox();
   this.listView2 = new System.Windows.Forms.ListView();
   this.pictureBox2 = new System.Windows.Forms.PictureBox();
   this.listView3 = new System.Windows.Forms.ListView();
   this.pictureBox3 = new System.Windows.Forms.PictureBox();
   this.comboBox1 = new System.Windows.Forms.ComboBox();
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
   this.SuspendLayout();
   // 
   // button1
   // 
   this.button1.Location = new System.Drawing.Point(357, 23);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(75, 23);
   this.button1.TabIndex = 1;
   this.button1.Text = "button1";
   this.button1.UseVisualStyleBackColor = true;
   this.button1.Click += new System.EventHandler(this.button1_Click);
   // 
   // checkBox1
   // 
   this.checkBox1.AutoSize = true;
   this.checkBox1.Location = new System.Drawing.Point(481, 35);
   this.checkBox1.Name = "checkBox1";
   this.checkBox1.Size = new System.Drawing.Size(80, 17);
   this.checkBox1.TabIndex = 2;
   this.checkBox1.Text = "checkBox1";
   this.checkBox1.UseVisualStyleBackColor = true;
   this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
   // 
   // listView1
   // 
   this.listView1.Location = new System.Drawing.Point(2, 263);
   this.listView1.Name = "listView1";
   this.listView1.Size = new System.Drawing.Size(317, 364);
   this.listView1.TabIndex = 3;
   this.listView1.UseCompatibleStateImageBehavior = false;
   // 
   // pictureBox1
   // 
   this.pictureBox1.Location = new System.Drawing.Point(24, 280);
   this.pictureBox1.Name = "pictureBox1";
   this.pictureBox1.Size = new System.Drawing.Size(130, 99);
   this.pictureBox1.TabIndex = 0;
   this.pictureBox1.TabStop = false;
   // 
   // listView2
   // 
   this.listView2.Location = new System.Drawing.Point(394, 55);
   this.listView2.Name = "listView2";
   this.listView2.Size = new System.Drawing.Size(538, 426);
   this.listView2.TabIndex = 4;
   this.listView2.UseCompatibleStateImageBehavior = false;
   // 
   // pictureBox2
   // 
   this.pictureBox2.Location = new System.Drawing.Point(407, 69);
   this.pictureBox2.Name = "pictureBox2";
   this.pictureBox2.Size = new System.Drawing.Size(130, 397);
   this.pictureBox2.TabIndex = 5;
   this.pictureBox2.TabStop = false;
   // 
   // listView3
   // 
   this.listView3.Location = new System.Drawing.Point(2, 3);
   this.listView3.Name = "listView3";
   this.listView3.Size = new System.Drawing.Size(183, 155);
   this.listView3.TabIndex = 6;
   this.listView3.UseCompatibleStateImageBehavior = false;
   // 
   // pictureBox3
   // 
   this.pictureBox3.Location = new System.Drawing.Point(2, 3);
   this.pictureBox3.Name = "pictureBox3";
   this.pictureBox3.Size = new System.Drawing.Size(183, 155);
   this.pictureBox3.TabIndex = 7;
   this.pictureBox3.TabStop = false;
   // 
   // comboBox1
   // 
   this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
   this.comboBox1.FormattingEnabled = true;
   this.comboBox1.Items.AddRange(new object[] {
            "0",
            "1",
            "5",
            "10"});
   this.comboBox1.Location = new System.Drawing.Point(216, 55);
   this.comboBox1.Name = "comboBox1";
   this.comboBox1.Size = new System.Drawing.Size(120, 21);
   this.comboBox1.TabIndex = 8;
   // 
   // Form1
   // 
   this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
   this.ClientSize = new System.Drawing.Size(951, 627);
   this.Controls.Add(this.comboBox1);
   this.Controls.Add(this.pictureBox2);
   this.Controls.Add(this.pictureBox1);
   this.Controls.Add(this.pictureBox3);
   this.Controls.Add(this.listView2);
   this.Controls.Add(this.listView1);
   this.Controls.Add(this.checkBox1);
   this.Controls.Add(this.button1);
   this.Controls.Add(this.listView3);
   this.Name = "Form1";
   this.Text = "Form1";
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
   ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
   this.ResumeLayout(false);
   this.PerformLayout();

  }

  #endregion

  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.CheckBox checkBox1;
  private System.Windows.Forms.ListView listView1;
  private System.Windows.Forms.PictureBox pictureBox1;
  private System.Windows.Forms.ListView listView2;
  private System.Windows.Forms.PictureBox pictureBox2;
  private System.Windows.Forms.ListView listView3;
  private System.Windows.Forms.PictureBox pictureBox3;
  private System.Windows.Forms.ComboBox comboBox1;
 }
}
A: 

I noticed that artefacts appeared only when draw near the borders of picturebox. I don't agree that is border-artefacts.

Temporary (approximately for 100 years :) solved with this hack

pictureBox.Location = new Point(-1, -1);
int delta = 2;
int paintWidth = pictureBox.Width - delta;
int paintHeight = pictureBox.Height - delta;
...
points[0] = new PointF(hLenL + delta, paintHeight);
points[1] = new PointF(paintWidth - hLenR, paintHeight);    
points[2] = new PointF(paintWidth, delta);          
points[3] = new PointF(delta, delta);           
Sopholos