Just nu i M3-nätverket
Jump to content

Graphics.Drawline( över en listView


arbin

Recommended Posts

Hej

 

Jag skulle behöva rita en linje som går över en listView, alltså linjen skall synas på listViewn. ListView ligger på en panel, jag kan rita en linje på panelen när jag satt Paint eventet för denna, men linjen ligger då bakom listViewn. Har även försökt att sätt ett DrawItem event på min listView, dock kommer aldrig ett event för denna.

 

Lite flummig förklaring kanske, men hoppas att ni förstår vad jag är ute efter.

 

/Fredrik

 

Link to comment
Share on other sites

jerker olofsson

Hej,

 

DrawItem anropas bara om kontrollen är OwnerDraw.

 

DrawItem ritar bara, så vitt jag vet, ett item i en listView, inte hela kontrollen. Om du hade implementerat en händelsehanterare för DrawItem så hade den alltså anropats en gång per objekt du lagrar i din ListView.Items-collection.

 

Prova det här:

1) Skapa en ny klass "MyListView" som ärver från ListView

2) Kör en override på OnPaint som ser ut så här:

protected override void OnPaint( PaintEventArgs e )

{

base.OnPaint( e );

e.Graphics.DrawLine( ...... );

}

 

Instantiera sedan "MyListView" istället för en vanlig ListView.

 

[inlägget ändrat 2006-01-09 20:00:53 av jerker olofsson]

Link to comment
Share on other sites

Lyckas inte få den att köra OnPaint, har testat att köra Invalidate() och this.SetStyle(ControlStyles.ResizeRedraw, true);

 

Har satt en breakpoint inne i OnPaint metoden, men den exekverar aldrig den metoden.

 

class ListViewGuide : ListView

{

private System.ComponentModel.Container components = null;

 

public ListViewGuide(Panel targetPanel)

{

this.SetStyle(ControlStyles.ResizeRedraw, true);

targetPanel.Controls.Add(this);

InitializeComponent();

}

 

private void InitializeComponent()

{

this.GridLines = true;

this.Dock = DockStyle.Top;

this.HeaderStyle = ColumnHeaderStyle.None;

this.Scrollable = false;

this.Size = new System.Drawing.Size(452, 40);

this.View = View.Details;

this.BringToFront();

 

}

 

protected override void Dispose(bool disposing)

{

if (disposing)

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose(disposing);

}

 

protected override void OnPaint(PaintEventArgs e)

{

 

base.OnPaint(e);

System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red);

e.Graphics.DrawLine(pen, 0, 0, 200, 200);

//DrawLine();

}

}

 

Link to comment
Share on other sites

jerker olofsson

Mitt fel.

 

En ListView anropar aldrig OnPaint som de flesta andra kontroller gör.

Prova denna koden istället:

 

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 20)
{
System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red);
e.Graphics.DrawLine(pen, 0, 0, 200, 200);
}
}

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...