Win32 API Windows Prozedur wparam

Also :

Code:
LRESULT CALLBACK wndproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HDC         hdc;
	       PAINTSTRUCT ps;
	static HWND        list;
    static int         d;
	static int         max = 0;
	static int         rev;
	static char        bfr[32];
	int         count = 0;

	switch(message)
	{
	case WM_CREATE:
        hdc = GetDC(hwnd);
		list =  CreateWindow("listbox",NULL,
			                 WS_CHILD | WS_VISIBLE | LBS_STANDARD,
							 30,30,
							 200,100,
							 hwnd,(HMENU) 1,
							 ((LPCREATESTRUCT) lParam)->hInstance,
							 NULL);
		for(max = 0;max <=20;max++)
		{
			rev = 1 + rand() % 200;
			wsprintf(bfr,"%i",rev);
			SendMessage(list,LB_ADDSTRING,0,(LPARAM)bfr);
		}
		ReleaseDC(hwnd,hdc);
		return 0;

	case WM_PAINT:
		BeginPaint(hwnd,&ps);
		wsprintf(bfr,"%i",count);
		TextOut(hdc,200,200,bfr,lstrlen(bfr));
		EndPaint(hwnd,&ps);
		return 0;

    case WM_COMMAND:
		hdc = BeginPaint(hwnd,&ps);
		if (LOWORD (wParam) && HIWORD (wParam) == LBN_SELCHANGE)
		{
         count = SendMessage(list,LB_GETCURSEL,0,0);
		}
		InvalidateRect(hwnd,NULL,TRUE);
		EndPaint(hwnd,&ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

Normalerweise sollte der Return Wert von LBN_SELCHANGE aus HIWORD wParam den Wert zurückliefern, da es sich ja um den Aktionscode handelt, nachdem InvalidateRect WM_PAINT nun anweist den Anwenungsbereich zu aktualiseren, sollte der Wert durch TextOut ausgegeben werden, was er aber nicht wird , wieso ?
------------------------------------------------------------------------

Erster Beitrag und dann gleich sowas, count muss natürlich static sein, wie soll er den sonst den Wert kennen ....
 
Hiho,

ist zwar lange her das ich mit Windows programmiert hab, aber ich glaube das BeginPaint und EndPaint ist im WM_COMMAND Block total falsch, versuch einfach "InvalidateRect" und danach das Fenster einfach neuzeichnen lassen (gibt es direkt n Befehl für, weiß nur gerade nicht wie der heißt, zur Not SendMessage(hWnd,WM_PAINT,0,0); )
 
Original von ivegotmail
anhand der letzten zeile in Dawen's beitrag, würde ich sagen das sich das schon erledigt hat

wie was wo? :)

Es fehlt einfach der direkte Befehl zum Neuzeichnen des Fensters, InvalidateRect zeichnet nichts neu, sondern fügt nur einen Bereich des Client-Windows zur Aktualisierungsregion hinzu, WM_PAINT muss er dann schon noch veranlassen. Btw, wundert mich das sein Programm überhaupt irgendwas zeichnet... sowie man in der Fensterbotschaftsprozedur auch WM_PAINT bearbeitet sollte am Ende vom WM_PAINT Block nicht return 0; oder break; sondern: return DefWindowProc(hwnd,message,wParam,lParam); stehen... sonst zeichnet sich nämlich das Fenster insgesamt nicht mehr :)
 
Also, DefWindowProc steht am ende von switch(message), also übernimmt alle Sachen die ich nicht eingebunden habe.
Das Programm zeichnet auch problem los, da WM_PAINT dazu per InvalidateRect veranlasst wird , zweiter Parameter dann noch NULL und schon ganzer Anwendungsbereich ungültig, WM_PAINT legt los.

@darkdieter : Meine Programme sind immer recht merkwürdig !

@ivegotmail : Danke für das sorgfältige lesen !
 
Zurück
Oben