Splashscreen und TextOut...
-
Hi,
also ich hab in meiner Anwendung einen Splashscreen, in dem ich beim Start der Applikation immer kurz die gerade ablaufende Aktion anzeigen will.
Ich hab dazu eine kleine Funktion:void CSplash::ChangeText(LPCTSTR lpszText) { RECT rect(m_rect); LOGFONT lf = { 16, 0, 0, 0, FW_THIN, TRUE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, lfPitchAndFamily, "Calibri"}; m_hdc = GetDC(m_hwnd); m_hFont = static_cast<HFONT>(::SelectObject(m_hdc, CreateFontIndirect(&lf))); ::SetBkColor(m_hdc, RGB(235, 235, 235)); ::SetTextAlign(m_hdc, TA_LEFT); TextOut(m_hdc, 15, rect.bottom - 20, lpszText, strlen(lpszText)); ::DeleteObject(::SelectObject(m_hdc, m_hFont)); ReleaseDC(m_hwnd, m_hdc); }Nur sieht man nach jedem Wechseln des Textes noch eine Art "Rest" des letzten Textes.
Ich nehme mal an, ich müsste diese Region vor jedem Setzen des Strings immer updaten oder auf die Hintergrundfarbe des Dialogs setzen (also "leeren" im Prinzip).Wie könnte ich das machen ?? Bin da etwas ratlos...
Schonmal Danke im Voraus !
-
Kann mir jemand einen Tipp geben ??

-
Einen Splash-Screen habe ich noch nie programmeiert.
Das von Dir verwendete TextOut() ist eine ganz normale WinAPI-Funktion, hat also m.E. gar nix mit Splash-Screen im Speziellen zu tun.
Es gibt mehrere Möglichkeiten:
-Vor Ausgabe mit TextOut() den betreffenden Bereich (Koordinaten in rect) komplett mit Hintergrundfarbe füllen. Das kann aber im ungünstigen Falle zum Flackern führen.
-Alternativ ExtTextOut() mit Parameter ETO_OPAQUE verwendenHTH,
MartinP.S.: Übrigens, ExtTextOut() mit Parameter ETO_OPAQUE (und ohne Text) ist die schnellere und einfachere Methode zum Füllen einer rechteckigen Fläche als über die klassische Methode mit CreateSolidBrush(), FillRect() und DeleteObject().
-
Hallo,
eine andere Möglichkeit wäre, den String zu speichern und ihn kurz vor dem Anzeigen des neuen String mit der Hintergrundfarbe zu überschreiben.
So etwa:SetTextColor(hDC, RGB(235, 235, 235)); ::TextOut( hDC, 90, 40, OldString.c_str(), OldString.Length() -1 ); SetTextColor(hDC, RGB(0, 0, 0)); ::TextOut( hDC, 90, 40, Text.c_str(), Text.Length() -1 ); OldString = Text;Bitte anpassen...

mfg
kpeter
-
Hi,
also erstmal danke für eure Antworten !!
Ich hab mich jetzt erstmal für die 2. Variante entschieden. So funktionierts auch !
Werde mir, wenns die Zeit wieder zulässt, nochmal die 1. Variante genau anschauen.Aber so passts erstmal !
Danke...
-
wesentlich einfacher wäre wohl ein Static-Control, von dem man lediglich den Text ändert...
das macht zwar am Ende auch nichts anderes, als sich leeren und dann den neuen Text zeichnen,
aber zumindest braucht man sich nicht selber mit GDI herumschlagen
-
Ja das stimmt, daran hab ich auch schon gedacht.
Nur ist es so: ich leite mein Splashscreen von einer Vorlage in einer DLL ab und die ist aber nicht von CWnd abgeleitet. Es wäre möglich, das mit einem Static zu realisieren, aber mal etwas GDI schadet auch nicht !
-
R3dNeXX schrieb:
die ist aber nicht von CWnd abgeleitet
ich wüsste nicht, wo hier das Problem liegt xD
CreateWindow mit "STATIC" als Fensterklasse und dem HWND als Parent...
sollte nicht das Ding sein, aber natürlich schadet GDI nicht