Kleine GUI-Herausforderung

pschilling

Erfahrenes Mitglied
Hallo,

eine knifflige Aufgabe für GUI-Freaks.

Ich habe für einen Kunden eine von Grund auf konfigurierbare Applikation geschrieben.

Dabei hatte ich folgendes Problem.

Damit die Dialoge auch gut aussehen, sollten die CStatics ja Transparent sein, da der Hintergrund beliebigen Ursprungs sein kann.

Das mach ich mit WM_CTLCOLOR...

Sieht auch super aus und t.

Jetzt bietet die App aber auch an, dass mann auf Tastendruck augenblicklich die Sprache wechselt, so dass ich auch den Text der CStatics zur Laufzeit ändern muss. Dabei hat mir die Transparenz sehr zu schaffen gemacht.

Meine Probleme hatt ich damit, das die transparenten CStatic Controls den alten Fensterinhalt nicht gelöscht haben. Habe so ziemlich alle Varianten von ShowWindow über UpdateWindow() , Invalidate(), SetWindowPos... u.s.w. ausprobiert, aber es wollte sich einfach nicht sauber neu zeichnen !


Ich habe mal für VS2005 hier
http://www.karena-fotografie.de/images/private/peter/dlg.rar
ein sehr schmales Demoprojekt (Dialogbasierend) hinterlegt, welches das Problem verdeutlicht.

Ich habe zwar schon eine funktionierende Lösung gefunden, bin aber noch nicht allzu zufrieden mit dieser.

Übrigens habe ich das Programm für Windows CE 5.0 entwickelt. Dort bin ich ja gezwungen, die Dialoge immer übereinander zu zeichnen, weil nur 240x320 pixel da sind.

Bei Mehreren Transparenten CStatics kommen die wildesten zeicheneffekte bei rum :)

Vielleicht hat ja einer ne gute Idee oder hat genau dies schon mal gemacht.

Bin für jeden Tipp dankbar !!


Peter
 
Hallo,

leider weiß ich nicht, was sich alles auf dem Dialog befindet. Und mit Windows CE hab ich noch nie was gemacht. Aber ich sehe nur eine Variante. In PreTranslateMessage vor dem Ändern der Beschriftung OnEraseBkgnd() aufrufen oder den Hintergrund für den bestimmten Bereich von Hand neu zeichnen. In deinem Beispiel-Dlg funktioniert das, wenn man
if( pMsg->wParam == VK_F2) {
CClientDC dc(this);
OnEraseBkgnd(&dc);
if( m_bGerman ) {
schreibt.

Mfg

langer
 
Damit habe ich mich auch schon mal rumgeärgert. Das Ganze lief auf einen fürchterlichen Hack raus:

Das Static Owner-Draw gemacht; beim Erstellen das HWND des Dialoges übergeben. Jedesmal, wenn sich etwas ändert (SetWindowText überladen), wird zunächst das RECT auf die Koordinates des Dialoges umgerechnet.
Mit der Funktion ::RedrawWindow wird dann das Dialog-HWND aufgefordert, das Rect zu invalidieren und sofort neu zu zeichnen. Dann habe ich mit RedrawWindow das Static selbst aufgefordert, sich sofort neu zu zeichnen (Das Static stellt ja nur seinen Text dar).

Fürchterlich, hackig dreckig, aber läuft halbwegs vernünftig.
 
Vielen Dank erstmal für eure Ansätze.

@langer1801 : Dein Ansatz funktioniert auf win32 wunderbar, aber leider nicht auf dem CE-Gerät.
Aber wenn ich vor dem Aufruf OnEraseBkgnd() die Statics erstmal unsichtbar mache, und anschließend wieder sichtbar, funktioniert es auch dort :)

Sieht dann in etwa so aus :

Code:
    GetDlgItem(IDC_STATIC_TITLE)->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_STATIC_COUNT)->ShowWindow(SW_HIDE);
    CClientDC dc(this);
    OnEraseBkgnd(&dc);
    GetDlgItem(IDC_STATIC_TITLE)->ShowWindow(SW_SHOW);
    GetDlgItem(IDC_STATIC_COUNT)->ShowWindow(SW_SHOW);

Ist aber immer noch besser als meine Lösung, in der ich mit nem Timer arbeite! ;-)

@Endurion : Ich denke, deine Lösung funktioniert auch, aber der Auswand ist bei der eben beschriebenen geringer.

Vielen Dank nochmal.

Peter
 

Neue Beiträge

Zurück