MFC: OnPait- und OnIdle-Probleme

Folgendes Problem, für das die Lösung nicht so einfach ist, oder doch ???

Ich hab eine Dialoganwendung geschrieben, MFC generiert mir dann 2 Klassen: CWinApp und CDialog (Basisklassen)
So, jetzt gibt es in der CWinApp eine tolle Methode: OnIdle. Die wird immer dann ausgeführt, wenn keine anderen Messages vorhanden sind. Wie sag ich aber von der OnIdle Methode aus, daß das Fenster neu gezeichnet werden muß. Invalidate() und UpdateWindow kann ich nämlich nur innerhalb der CDialog ausführen. Eine Möglichkeit wäre auch eine Message mit Hilfe von SendMessage zu schicken, aber dazu muß man den HWND der CDialog kennen. Ein scheinbar unlösbares Problem, aber vielleicht gehts ja doch, ich hab halt noch nix drüber gefunden.

mfg Marco

Ich hab eine Dialoganwendung geschrieben, MFC generiert mir
dann 2 Klassen: CWinApp und CDialog (Basisklassen)
So, jetzt gibt es in der CWinApp eine tolle Methode: OnIdle.
Die wird immer dann ausgeführt, wenn keine anderen Messages
vorhanden sind. Wie sag ich aber von der OnIdle Methode aus,
daß das Fenster neu gezeichnet werden muß. Invalidate() und
UpdateWindow kann ich nämlich nur innerhalb der CDialog
ausführen. Eine Möglichkeit wäre auch eine Message mit Hilfe
von SendMessage zu schicken, aber dazu muß man den HWND der
CDialog kennen. Ein scheinbar unlösbares Problem, aber
vielleicht gehts ja doch, ich hab halt noch nix drüber
gefunden.

Also erstmal würd ich davon abraten bei ONIDLE das Fenster neu zu zeichnen. Leg dir lieber ein Flag an, was du bei jeder Änderung des fensters setzt. Bei gesetzten Flag machst du ein Invalidate und löscht das Flag wieder.

Statt onidle kann man den Timer nehmen. Der läuft in der Dialogklasse und damit hat er auch zugang zu invalidate. Stell ihn einfach periodisch auf 200ms.

Wenn du es WIRKLICH mit ONIDLE machen willst:

guck dir mal die Methode …APP::InitInstance()
an, da wird das Dialogfenster angelegt und gestartet. Das Fenster wird temporär in der Variablen dlg zwischengespeichert. Diese Variable musst du dann nur global speichern, dann hast du auch von der App-Klasse per dlg.Invalidate() Zugang zu dem Dialog-Fenster.

cu
Steffen

Wenn du es WIRKLICH mit ONIDLE machen willst:
guck dir mal die Methode …APP::InitInstance()
an, da wird das Dialogfenster angelegt und gestartet. Das
Fenster wird temporär in der Variablen dlg
zwischengespeichert. Diese Variable musst du dann nur global
speichern, dann hast du auch von der App-Klasse per
dlg.Invalidate() Zugang zu dem Dialog-Fenster.

vergiss es, mach einfach:

m_pMainWnd->Invalidate();

cu
Steffen

OnPait- und OnIdle-Probleme

m_pMainWnd->Invalidate();

Danke das ist genau das wonach ich suchte.

Das Problem ist jetzt nur noch, daß mir das sch… Visual die OnIdle gar nicht aufruft. Tja, da werde ich wohl nochmal suchen. Wahrscheinlich hab ich irgendetwas falsch gemacht beim überschreiben der OnIdle.

mfg

Marco

Das Problem ist jetzt nur noch, daß mir das sch… Visual die
OnIdle gar nicht aufruft. Tja, da werde ich wohl nochmal
suchen. Wahrscheinlich hab ich irgendetwas falsch gemacht beim
überschreiben der OnIdle.

machs hat mit timern:

Einmal zur Initialisierung:
SetTimer( 1, 100 /*Periode in ms */ , NULL );

dann leitest du die ::open_mouth:nTimer() -Methode vom fenster ab

da kannst du das machen, was du sonst bei onidle machst.

Am Ende dann den Timer neu setzen:

void …::open_mouth:nTimer(UINT nIDEvent)
{

SetTimer( 1, 100 /*Periode in ms */ , NULL );
}

cu
Steffen