Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Winforms ownerdrawn TreeView

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een TreeView met Mode=OwnerDrawText waarvan ik de node-text dus zelf teken. Het idee is de tekst te kleuren. Gaat allemaal prima, tot het moment dat ik een node selecteer. De kleur van het font moet dan SystemColors.HighlightText worden. Zo gezegd zo gedaan, ik bouw die check in in de DrawNode handler, en iedereen is blij.

Maar toen kwam het moment dat iemand met de muis (ipv toetsenbord) een node selecteerde. Terwijl je nml de muis ingedrukt houdt op een node, ziet ie eruit als selected, maar e.State in de DrawNode handler is niet selected. Hetzelfde geldt voor de node die voorheen geselecteerd was, e.State uit de DrawNode handler is Selected, maar de node is helemaal niet meer geselecteerd.

En toen de muisknop losgelaten werd, was alles weer goed.

Ohja, dit hoort er altijd bij he :)
C#:
1
2
3
4
5
6
7
8
private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e) {
    if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected) {
        //Tekenen met HighlightText
    }
    else {
        //Tekenen met kleurtjes
    }
}

Bug in het framework? Bug ergens anders?

日本!🎌


Verwijderd

Selected state wordt pas geset bij MouseUp. Waarschijnlijk i.v.m. drag/drop functionaliteiten?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Zou maar zo kunnen, maar dat helpt me niet echt verder :)

日本!🎌


  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Kun je dan niet gewoon ook op 1 van de andere TreeNodeStates controleren (bv. Focus) ?

'Political Correctness is fascism pretending to be good manners.' - George Carlin


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
call vanuit de mousedown method de ownerdrawn method? (zo lukte dat in VB6 iig altijd prima :P )

~ Mijn prog blog!


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Kun je dan niet gewoon ook op 1 van de andere TreeNodeStates controleren
Natuurlijk heb ik dat al geprobeerd. Ik kan zelfs controleren of de state niet 0 is, maar dat helpt ook niet. Zoals ik al zei de state is neutraal als de node geselecteerd/gedeselecteerd wordt.
call vanuit de mousedown method de ownerdrawn method?
Grapje hoop ik? Ten eerste is het VIES, ten tweede hoe kom ik aan de juiste Graphics instance om aan de method handler mee te sturen? Er is een reden dat je zoiets niet hoort te doen. Er moet gewoon een betere manier zijn.

Net ontdekt dat de Capture property van de TreeView aanstaat als de muis ingedrukt wordt. Dus ik kan basically (selected ^ capture) testen. Alleen, uiteraard, doet dat een nieuw probleem reizen: capture staat ook aan tijdens scrollen...

[ Voor 17% gewijzigd door _Thanatos_ op 08-10-2007 02:46 ]

日本!🎌


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:46

Reptile209

- gers -

_Thanatos_ schreef op maandag 08 oktober 2007 @ 01:49:
[...]

Grapje hoop ik? Ten eerste is het VIES, ten tweede hoe kom ik aan de juiste Graphics instance om aan de method handler mee te sturen? Er is een reden dat je zoiets niet hoort te doen. Er moet gewoon een betere manier zijn.
Kijk eens naar de drag and drop properties van je control en of je die uit kunt schakelen (of, zoals onder Delphi, op dmManual kunt zetten). Misschien helpt dat. Zo niet, dan heb je een "alternatieve" onMouseDown in het BeginDrag event waar je misschien wat mee kan om je control bij te werken.

Zo scherp als een voetbal!


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ik vrees dat er geen DnD properties zijn. Wel een stuk of 6 events die daarmee te maken hebben, maar die worden nooit afgevuurd in mijn situatie.

日本!🎌


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Zelf de TreeNode selecteren in de OnMouseDown?
C#:
1
TreeNode tn = (TreeNode)GetNodeAt(e.Location);

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Een node behoort geselecteerd te worden bij MouseUp.

En dan nog, daarmee weet ik nog niks meer in het DrawNode event. Het probleem bestaat juist bij het selecteren van een node.

日本!🎌


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11 13:15

Korben

() => {};

In het voorbeeld op MSDN handelen ze MouseDown af en zetten ze daar de SelectedNode property:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Selects a node that is clicked on its label or tag text.
private void myTreeView_MouseDown(object sender, MouseEventArgs e)
{
    TreeNode clickedNode = myTreeView.GetNodeAt(e.X, e.Y);
    if (NodeBounds(clickedNode).Contains(e.X, e.Y))
    {
        myTreeView.SelectedNode = clickedNode;
    }
}

// Returns the bounds of the specified node, including the region 
// occupied by the node label and any node tag displayed.
private Rectangle NodeBounds(TreeNode node)
{
    // Set the return value to the normal node bounds.
    Rectangle bounds = node.Bounds;
    if (node.Tag != null)
    {
        // Retrieve a Graphics object from the TreeView handle
        // and use it to calculate the display width of the tag.
        Graphics g = myTreeView.CreateGraphics(); 
        int tagWidth = (int) g.MeasureString
        (node.Tag.ToString(), tagFont).Width + 6;

        // Adjust the node bounds using the calculated value.
        bounds.Offset(tagWidth/2, 0);
        bounds = Rectangle.Inflate(bounds, tagWidth/2, 0); 
    }
    return bounds;
}

[ Voor 3% gewijzigd door Korben op 17-10-2007 10:26 . Reden: Linkje ]

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
_Thanatos_ schreef op dinsdag 16 oktober 2007 @ 20:18:
Een node behoort geselecteerd te worden bij MouseUp.

En dan nog, daarmee weet ik nog niks meer in het DrawNode event. Het probleem bestaat juist bij het selecteren van een node.
Ik bedoelde inderdaad wat Korben ook verder zegt. Wat je dan toch verder weet in het DrawNode event is de bounds van het geselecteerde node omdat de geklikte dan ook daadwerkelijk de geselecteerde is?!

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1