[C#] Custom control paint/render probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bReChThOu
  • Registratie: Januari 2007
  • Laatst online: 14-09 11:50

bReChThOu

Team Belgium

Topicstarter
Hai mede-tweakerts!

Ik heb met c# een custom control gemaakt, namelijk een eigen groupbox zodat de borderkleur is aan te passen. Werkt netjes maar als ik mijn form verplaats zodat een deel uit het scherm valt en dan terug sleep hertekent hij deze control niet zodat er allemaal strepen etc op komen. Aanschouw volgende afbeelding van voor en na verslapen:

Afbeeldingslocatie: http://i36.tinypic.com/4v1mbp.jpg

De code: (deels schaamteloos gejat van internet)
C#: GrpBox.cs
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Projectshizzle
{
    public partial class GrpBox : Control
    {
        private Color borderColor;
        public Color BorderColor

        {
            get { return this.borderColor; }
            set { this.borderColor = value; }
        }
        public GrpBox()

        {
            this.borderColor = Color.Black;
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.UserPaint, true);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Size tSize = TextRenderer.MeasureText(this.Text, this.Font);
            Rectangle borderRect = e.ClipRectangle;
            borderRect.Y += tSize.Height / 2;
            borderRect.Height -= tSize.Height / 2;
            ControlPaint.DrawBorder(e.Graphics, borderRect, this.borderColor, ButtonBorderStyle.Solid);
            Rectangle textRect = e.ClipRectangle;
            textRect.X += 6;
            textRect.Width  = tSize.Width;
            textRect.Height = tSize.Height;
            e.Graphics.FillRectangle(new SolidBrush(this.BackColor), textRect);
            e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), textRect);
        }

    }
}

Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
En als je, op je control .Invalidate() aanroept zodra de gebruiker het scherm 'loslaat' (dus na het slepen). Wordt je control dan wel opnieuw getekend?

Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Razr schreef op zondag 29 augustus 2010 @ 17:14:
En als je, op je control .Invalidate() aanroept zodra de gebruiker het scherm 'loslaat' (dus na het slepen). Wordt je control dan wel opnieuw getekend?
Ik zou .Invalidate(true) doen, of in dat geval, .Refresh(), dan worden de childrens ook meegenomen.
Verder zou ik dit eerst ook proberen inderdaad.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik denk dat je verkeerd begrepen hebt hoe ClipRectangle werkt. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • bReChThOu
  • Registratie: Januari 2007
  • Laatst online: 14-09 11:50

bReChThOu

Team Belgium

Topicstarter
@Eerste 2 reacties: ja dat snap ik maar welke event is dat dan?
@ pedorus, geen idee, ik zal eens kijken (dacht dat die code wel ok was, kwam van een of ander forum maar ik dacht daar daar wel alles ok mee zou zijn), bedankt!

Update: Die ClipRectangle zorgt er inderdaad voor, het is nu opgelost, bedankt!

[ Voor 15% gewijzigd door bReChThOu op 29-08-2010 18:14 ]


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Nog even een tip, van:
C#:
1
2
3
4
5
6
7
private Color borderColor; 
public Color BorderColor 

{ 
    get { return this.borderColor; } 
    set { this.borderColor = value; } 
}

kun je een zogenaamde auto-property maken:
C#:
1
public Color BorderColor { get; set; }

Dat scheelt nogal behoorlijk in code :).

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
alex3305 schreef op zondag 29 augustus 2010 @ 20:00:
Nog even een tip, van:
C#:
1
2
3
4
5
6
7
private Color borderColor; 
public Color BorderColor 

{ 
    get { return this.borderColor; } 
    set { this.borderColor = value; } 
}

kun je een zogenaamde auto-property maken:
C#:
1
public Color BorderColor { get; set; }

Dat scheelt nogal behoorlijk in code :).
Het scheelt wat code inderdaad maar verder is het totaal niet boeiend; het compileert naar exact dezelfde IL (althans: dat beweert MS en ik heb geen reden dat niet aan te nemen noch de puf 't te verifiëren :) ). En ik prefereer soms de langere methode met het oog op aanpassingen die ik eventueel in een getter/setter wil gaan maken i.v.m. het raisen van events o.i.d. (PropertyChanged-achtige constructies). Anders moet ik dan alsnog de "korte" methode gaan omschrijven naar de "lange" en heb ik uiteindelijk meer werk.

[ Voor 19% gewijzigd door RobIII op 29-08-2010 21:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • bReChThOu
  • Registratie: Januari 2007
  • Laatst online: 14-09 11:50

bReChThOu

Team Belgium

Topicstarter
Anyway, het werkt nu prima, mag dus een slotje op!

[ Voor 0% gewijzigd door bReChThOu op 29-08-2010 23:55 . Reden: Typeaux ]

Pagina: 1