[C# winforms] Mouseover button

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:03
Ik ben bezig met een mouseover button in c#. Het is dus de bedoeling dat de bitmap van een button verandert als je er met je muis overheen gaat. Nah et lezen van het een en ander aan artikelen ben ik tot de volgende code gekomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected override void OnMouseHover( EventArgs ea )
{
    base.OnMouseHover ( ea );
    if ( this.BackgroundImage != null)
    {   
        Bitmap bm = new Bitmap( this.BackgroundImage );
        Graphics g = Graphics.FromImage( bm );
        g.PageUnit = GraphicsUnit.Pixel;                
        Size s = new Size( bm.Width/3, bm.Height );
        Rectangle rectDest = new Rectangle( this.Location, s);
        Rectangle rectSrc = new Rectangle( new Point( s.Width, 0 ), s );
    
        g.DrawImage( bm, rectSrc, rectDest, GraphicsUnit.Pixel );
    }
    Cursor = Cursors.Hand;
}
De bitmap van de button ziet er zo uit: Afbeeldingslocatie: http://img66.exs.cx/img66/4707/close.png
In de help van VS.NET staat een soortgelijk voorbeeld waar ik dit op heb geinspireerd. Als je met je muis over de knop gaat moet hij dus een ander gedeelte van het plaatje pakken, maar er gebeurt helemaal niks. Wat doe ik verkeerd?

Roomba E5 te koop


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Volgens mij moet je MouseEnter en MouseLeave, of MouseMove - events gebruiken i.p.v MouseHover.

En je kan natuurlijk even een breakpunt zetten om te checken welke functie wanneer wordt aangeroepen. Dus je override alle functies en dan even controleren welke functie voor jou geschikt is. :)
Ik gok op de MouseEnter en de MouseLeave...

Zie ook de help file van het MouseHover (e.d.) event voor de volgorde.

[ Voor 50% gewijzigd door MrSleeves op 01-11-2004 14:32 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 14:59

pjvandesande

GC.Collect(head);

MouseHover word getriggerd als de muis er op en er weer af is geweest. Maak dus gebruik van MouseEnter en MouseLeave event.

Of je moet dit juist willen dat de bitmap word verandert na een hover. Je kan ook altijd even www.msdn.com raadplegen.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:03
MouseHover is misschien niet helemaal het goede event, maar de code wordt wel uitgevoerd. (Cursor wordt wel een handje bijvoorbeeld). Waar het om gaat is dat het plaatje niet veranderd.

Edit: mouseEnter is beter ja, heb het even aangepast

[ Voor 14% gewijzigd door sig69 op 01-11-2004 14:48 ]

Roomba E5 te koop


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

sig69 schreef op 01 november 2004 @ 14:47:
MouseHover is misschien niet helemaal het goede event, maar de code wordt wel uitgevoerd. (Cursor wordt wel een handje bijvoorbeeld). Waar het om gaat is dat het plaatje niet veranderd.

Edit: mouseEnter is beter ja, heb het even aangepast
Ik denk wel dat ik weet waar het misgaat.
Je maakt namelijk een nieuwe instance Bitmap aan (aan de hand van de achtergrondimage)...
Maar die bitmap wordt nooit gekoppeld aan die achtergrondimage.
Je bent nu een beetje aan het tekenen op een bitmap waar je eigenlijk niks mee doet...

Of zit ik er compleet naast :? 8)7

Tip: Maak twee bitmaps (eentje voor normaal en eentje voor mouseover) en dan gewoon de achtergrondimage wijzigen aan de hand van de "muisstatus".

[ Voor 12% gewijzigd door MrSleeves op 01-11-2004 15:25 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:03
Dat zou natuurlijk ook wel kunnen, maar dit leek me juist wel een leuke manier (mede omdat je dan 1 bitmap kan gebruiken voor meerdere buttonstates).

Roomba E5 te koop


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 14:59

pjvandesande

GC.Collect(head);

sig69 schreef op 01 november 2004 @ 16:03:
Dat zou natuurlijk ook wel kunnen, maar dit leek me juist wel een leuke manier (mede omdat je dan 1 bitmap kan gebruiken voor meerdere buttonstates).
Je kan intern 3 bitmaps laden met de data van die ene bitmap. Dat is geen probleem.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:03
Ik heb het inmiddels opgelost: ik ging even wat experimenteren met DrawLine, en toen kwam ik er achter dat er binnen een mouseenter event geen lijn getrokken werd. Dit kwam dus doordat ik (zoals Chief.NET scherp opmerkte) ik in een graphics object zat te tekenen waar ik verder niks mee deed. Ik het het nu opgelost door in de events de button een bepaalde state te geven en dan in de oppaint event aan de hand van de buttonstate in de PaintEventArgs.Graphics te tekenen (de button dus).
Bedankt voor jullie hulp allemaal.

Roomba E5 te koop

Pagina: 1