Textausgabe



  • Hallo,

    ich habe noch nicht so die Ahnung von WinAPI, will aber im Rahmen meiner Diplomarbeit damit arbeiten. Es geht um folgendes Problem. Ich öffne 2 Fenster, ein Hauptfenster und ein kleines Fenster in dem ich später ein paar Informationen ausgeben möchte. Textausgaben habe ich bisher per TextOut nur in der Callback-Funktion des jeweiligen Fensters hinbekommen. Nun möchte ich aber eine Funktion implementieren, die ich an beliebiger Stelle aufrufen kann. Diese Funktion soll eine Zeichenkette übergeben bekommen, welche dann in meinem kleinen Fenster ausgegeben werden soll. Bsp.: infoOut("bla");. In diesem Fall soll halt "bla" in meinem kleinen Fenster ausgegeben werden.
    Vielleicht kann mir ja jemand weiterhelfen und sagen, wie ich das machen könnte. Ich wäre sehr dankbar. 🙂

    MfG, Steve



  • 2 Dinge:

    Zum einen brauchst du einen Zwischenpuffer, damit der Text zu jeder Zeit neu gezeichnet werden kann, falls mal der Fensterinhalt verdeckt wurde oder sonstwie ungültig wurde und dann neu gezeichnet wurde.

    Deine Funktion ändert also den Inhalt des Puffers entsprechend.

    Damit der Text auch gezeichnet wird, wann du es willst, kannst du z.B. dem Fenster mitteilen, dass sein Fensterinhalt veraltet ist und es bitte neu gezeichnet werden soll. (Hieß glaub ich irgendwas mit "invalidate" die entsprechende Message/Funktion)



  • Das mit dem Zwischenpuffer hatte ich mir schon gedacht und soweit auch schon implementiert. Ich habe eine globale variable (TCHAR*) die ich im Falle der Message ON_PAINT in der Callback-Funktion ausgebe. Sobald ich das Fenster nun verdecke und wieder freilege, sehe ich auch den geänderten Text. Also habe ich versucht per SendMessage ein ON_PAINT abzusenden, passiert aber irgendwie nichts. Und das mit dem invalidate scheint auch nicht zu funktionieren. Laut Hilfe ist das eine Methode für Controls auf einer Form, es ist jedenfalls kein Member irgendeiner Instanz, die ich in meiner WinAPI-Anwendung benutze.
    Irgendwelche anderen Vorschläge? 🙂



  • Ich meinte im letzten Beitrag natürlich WM_PAINT

    Ich habe es jetzt einigermaßen hinbekommen, bin aber noch nicht ganz zufrieden.

    void infoOut(TCHAR *info)
    {
    	wcsncpy(szInfo, info, MAX_LOADSTRING);
    	HDC hDC = GetWindowDC(infoHwnd);
    	TextOut(hDC, 0, 0, szInfo, wcsnlen(szInfo, MAX_LOADSTRING));
    	ReleaseDC(infoHwnd, hDC);
    }
    

    szInfo ist golbal deklariert, sozusagen mein Puffer den ich auch im Falle eines WM_PAINT ausgebe (Falls das Fenster überdeckt oder vergrössert/verkleinert wird).
    Das Problem ist, ich bekomme mit GetWindowDC den absoluten Ursprung des Fensters, schreibe meinen Text also in dem Fall in die Titelleiste. Das selbe TextOut, was bei WM_PAINT in der Callbackfunktion ausgelöst wird, setzt den Text aber in den eigentlichen Fensterbereich, was ja auch besser ist.

    Das geschieht so...

    LRESULT CALLBACK infoWndProc(HWND infoHwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case ...
    	case WM_PAINT:
    		hdc = BeginPaint(infoHwnd, &ps);
    		TextOut(hdc, 0, 0, szInfo, wcsnlen(szInfo, MAX_LOADSTRING));
    		EndPaint(infoHwnd, &ps);
    		break;
    	case ...
    	}
    	return 0;
    }
    

    Nun habe ich versucht auch in meiner Funktion "infoOut" mit BeginPaint zu arbeiten. infoHwnd habe ich global deklariert, ist also auch dieser Funktion bekannt.

    void infoOut(TCHAR *info)
    {
    	PAINTSTRUCT ps;
    	wcsncpy(szInfo, info, MAX_LOADSTRING);
    	HDC hdc = BeginPaint(infoHwnd, &ps);
    	TextOut(hdc, 0, 0, szInfo, wcsnlen(szInfo, MAX_LOADSTRING));
    	EndPaint(infoHwnd, &ps);
    	UpdateWindow(infoHwnd);
    }
    

    Da passiert aber leider garnichts. Hat jemand eine Idee.


Log in to reply