UpdateWindow erzeugt keine WM_PAINT

saibot83

Grünschnabel
Hallo,

ich bin nun am nächsten Problem angelangt. Habe einen Timer, der jede Sekunde ein Event auslöst. Das funktioniert auch, ich kann damit eine Variable hochzählen und anzeigen. Nun soll bei jedem Aufruf auch die Grafik neu gezeichnet werden. Das soll in der Funktion OnPaint geschehen, welche durch eine WM_PAINT aufgerufen wird.

Leider passiert das aber nur beim Programmstart, beim minimieren/maximieren und nachdem eine Messagebox angezeigt wird. Aber nicht mit jedem Timer-Event.

Im Timer-Event habe ich
Code:
UpdateWindow();
stehen. Dies wird jede Sekunde aufgerufen.

In OnPaint steht das:

Code:
int MitteX=150, MitteY=150, Radius=125;
	COLORREF color1=0x00FFFFFF, color2=0x00000000;
	CBrush brush1(color1);
	CPen pen2_4(PS_SOLID, 4, color2);
	

	m_zaehler++;

	CPaintDC dc(this); // Gerätekontext für Zeichnen
	if (IsIconic())
	{
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Symbol in Client-Rechteck zentrieren
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Symbol zeichnen
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	dc.SelectObject(&brush1);	//Füllfarbe weiss
	dc.SelectObject(&pen2_4);		//Pinselfarbe schwarz, Dicke 4
	dc.Ellipse(MitteX-Radius,MitteY-Radius,MitteX+Radius,MitteY+Radius);	//Grund-Kreis zeichnen



An was kann das liegen dass UpdateWindow keine WM_PAINT erzeugt? Die MSDN-Erklärung hilft mir da leider nicht weiter. Das mit den Handles ist mir nicht so ganz klar.

Wäre über jede Hilfe dankar :)
 
UpdateWindow() löst nur dann eine WM_PAINT-Nachricht aus, wenn es was zu tun gibt, also z.B. das Fenster verdeckt wurde. Andernfalls passiert nichts. Du musst also erst das gesamte Fenster oder Teile davon mit Invalidate() oder InvalidateRect() für ungültig erklären und damit ein Neuzeichnen erzwingen.

Gruß
MCoder
 
oh, na das war ja einfach :) Danke :)

Kennt zufällig jemand eine gute Zusammenfassung zu MFC im Netz? Die MSDN ist ja gelinde gesagt nutzlos.
 
nochmal ne Frage

Wie kann ich manuell den Fokus auf ein anderes Element, z.B. auf einen Button setzen?

Wenn eine Eingabe aus einem Edit-Feld per <Enter> übernommen wird, will ich den Fokus auf einen Button setzen und nicht auf dem Edit-Feld lassen.

Wie kann ich das machen?
 
Dafür gibt es die Funktion SetFocus(). Dazu das Handle auf den Button holen (weil man ja meist nur die ID hat) und dann den Focus zuweisen.
Code:
CButton *pBtn =  (CButton*)pMeinParentFenster->GetDlgItem(IDC_MEINBUTTON);
//pMeinParentFenster ist Zeiger auf das Fenster, in dem sich der Button befindet
pBtn->SetFocus(true);

Mfg

langer
 
Zurück