UpdateWindow Problem mit Childfenster

cyberds19

Grünschnabel
warum erhällt mein fenster kein command ?

winmain mein child

wndclass.lpfnWndProc=childProc;
wndclass.lpszClassName=L"testchild";
RegisterClassEx(&wndclass);

childtest=CreateWindow(L"test",
L"test",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,300,600,NULL,NULL,hInstance,NULL);

im childproc unter create:
_beginthread(testthread,0,NULL);

im testthread:

UpdateWindow(childtest);

das fenste malt sich aber nicht neu. was ist da faul ?
 

Endurion

Erfahrenes Mitglied
Ein Fenster gehört immer einem Thread. Jeder Thread muss seine eigene MessagePump haben (MessagePump ist Peek/GetMessage, Translate-,DispatchMessage).

Wird das Childfenster in einem Thread erzeugt? Versuche das Childfenster im Hauptthread zu erzeugen, das löst vermutlich die meisten Probleme.
 

cyberds19

Grünschnabel
wie gesagt ich
erzeuge in der winmein ein hauptfenster und ein childfenster.
die werden sofort angezeigt.

habe nur eine getmessage.

wird das childfester aufgerufen ruft der im create nen _beginthread auf.

daher verstehe ich ja nicht, dass auch nen sendmessage(hwndchild,wm_paint,0,0,);
nicht funktioniert.
habe jetzt rausgefunden, dass einzigste auf was das fenster reagiert ist:
InvalidateRgn
das kann aber doch nicht die lösung sein oder ?
eigentlich müssten doch sendmessage und updatewindow auch funktionieren.
 

Endurion

Erfahrenes Mitglied
UpdateWindow löst ja nur etwas aus, wenn das Fenster als "dirty" markiert ist. Sprich, jemand hat drauf rumgemalt oder etwas verändert.

Ein InvalidateRect (oder InvalidateRgn) machen das. Allein das sollte genügen. Wenn du nach Invalidatexxx direkt UpdateWindow aufrufst, müsste das Fenster danach neu dargestellt sein.
 

cyberds19

Grünschnabel
ok danke das klappt.
ich habe immer gedacht, nen updatwindow veranlasst immer zum neuzeichen.

warum geht sendmessage(fenster,WM_PAINT,0,0) nicht ?
das müsste doch auch nen repaint auslösen oder ?
 

Endurion

Erfahrenes Mitglied
Jein, WM_PAINT sollte man nie manuell senden. WM_PAINT ist ja "nur" die Aufforderung an das HWND, sich selbst neu darzustellen. Windows übernimmt die neue Zeichnung aber nur, wenn das HWND irgendwo auch einen Bereich als "dirty" gekennzeichnet hat. Alles zur Optimierung :)