[c#] SetStyle toepassen voor Double Buffering

Pagina: 1
Acties:

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Ik ben er weer eens ;)

Nu met een vraagje over het gebruik van SetStyle ivm double buffering voor de flikkervrije weergave van controls (bv tijdens het resizen).

Met
code:
1
2
SetStyle(ControlStyles.AllPaintingInWmPaint
    | ControlStyles.DoubleBuffer, true);
kun je eenvoudig double buffering inschakelen. Dat werkt perfect voor al m'n user controls waarin ik dat stukje code heb toegevoegd.

Maar ook een paar bestaande .NET controls flikkeren tijdens het resizen. En dus zou ik die ook graag dubbel bufferen. Maar dat lukt me niet zonder omwegen. Bijvoorbeeld:
code:
1
2
3
TabControl tc = new TabControl();
tc.SetStyle(ControlStyles.AllPaintingInWmPaint
    | ControlStyles.DoubleBuffer, true);
Geeft tijdens compileren:

Cannot access protected member 'System.Windows.Forms.Control.SetStyle(System.Windows.Forms.ControlStyles, bool)' via a qualifier of type 'System.Windows.Forms.TabControl'; the qualifier must be of type 'namespace.Class' (or derived from it)

(namespace.Class is natuurlijk iets anders hier, maar ik heb het even vervangen voor de duidelijkheid)

Wanneer ik echter een nieuwe user control aanmaak die overerft van de TabControl en met enige verschil de regel die de double buffering voorziet, dan werkt het wel. SetStyle werkt dus enkel "binnen" de control waarvoor het bedoeld is.

Maar ik kan toch moeilijk elke standaard .NET control die flikkert gaan overerven gewoon voor die dubbel buffering? Is er geen andere methode om SetStyle te gebruiken waarbij ik geen overgerfde user control moet aanmaken?

  • SlowMeDown
  • Registratie: Mei 2003
  • Laatst online: 15-04 08:14
Idee?

Nadat alle controls gemaakt zijn, zou je de ControlsCollection van de Form (en van controls met een eigen ControlsCollection, zoals bijvoorbeeld een Panel) kunnen aflopen en via Reflection de SetStyle method kunnen aanroepen.

[ Voor 171% gewijzigd door SlowMeDown op 13-01-2006 16:57 ]


Verwijderd

Als je gebruik maakt van .Net 2.0 dan kun je met behulp van generics je probleem oplossen.
Aangezien ik momenteel geen VS 2005 bij de hand heb heb ik even een voorbeeldje in C++ in elkaar geklopt (C++ kent templates wat veel weg heeft van generics).
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>

template<class T>
class Override : public T {
private:
protected:
  virtual void SetStyle();
public:
  static T* NewInstance();
  Override();
};

template<class T>
void Override<T>::SetStyle()
{
  std::cout << "Hey it works!" << std::endl;
}

template<class T>
T* Override<T>::NewInstance()
{
  return new Override<T>();
}

template<class T>
Override<T>::Override()
: T()
{
  this->SetStyle();
}

class X {
public:
  X();
};

X::X()
{
  std::cout << "I'm created!" << std::endl;
}

int main(int argc, char* argv[])
{
  X* x = Override<X>::NewInstance();
  std::cin.get();
  return 0;
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:33
Lijkt me een designfout

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
volgens mij moet je gewoon de double buffer style zetten voor je form, en dan zijn alle controls double buffered.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com