Schlecht gelöst?



  • Hi!
    Ich habe ein Programm geschrieben,mit dem man Striche zeichnen kann.Man kann maximal einen Zeichnen.
    Ist der COde eher schlecht oder gut?

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	TCHAR szAppName[] = TEXT("HELLOWINXP");
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wndclass;
    
    	wndclass.style = CS_HREDRAW | CS_VREDRAW;
    	wndclass.lpfnWndProc = WndProc;
    	wndclass.cbClsExtra = 0;
    	wndclass.cbWndExtra = 0;
    	wndclass.hInstance = hInstance;
    	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wndclass.lpszClassName = szAppName;
    	wndclass.lpszMenuName = 0;
    
    	RegisterClass(&wndclass);
    
    	hwnd = CreateWindow(szAppName,
    		TEXT("Zeichenoperationen"),
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
            CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		NULL,
    		NULL,
    		hInstance,
    		NULL);
    
    	ShowWindow(hwnd, nShowCmd);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&msg, NULL, 0, 0)) {
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    
    	HDC hdc;
    	PAINTSTRUCT ps;
    	static POINT mousepos[2];
    
    	switch(message) {
    
    case WM_LBUTTONDOWN:
    	mousepos[0].x = LOWORD(lParam);
    	mousepos[0].y = HIWORD(lParam);
    
    	return 0;
    
    case WM_MOUSEMOVE:
    
    	if(wParam & MK_LBUTTON) {
    	mousepos[1].x = LOWORD(lParam);
    	mousepos[1].y = HIWORD(lParam);
    
    	hdc = GetDC(hwnd);
    	MoveToEx(hdc, mousepos[0].x , mousepos[0].y, NULL);
    	LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
    	ReleaseDC(hwnd, hdc);
    	InvalidateRect(hwnd, NULL, TRUE);
    	}
    	return 0;
    
    case WM_LBUTTONUP:
    	InvalidateRect(hwnd, NULL, TRUE);
    	return 0;
    
    case WM_PAINT:
    	hdc = BeginPaint(hwnd, &ps);
    
    	MoveToEx(hdc, mousepos[0].x, mousepos[0].y, NULL);
    	LineTo(hdc, mousepos[1].x, mousepos[1].y);
    	EndPaint(hwnd, &ps);
    	return 0;
    
    case WM_DESTROY:
    	PostQuitMessage(0);
    	return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    


  • Naja, so mal schnell überflogen...
    Scheint ziemlich viel kopiert zu sein, aber egal mach ich meistens auch so 🙂

    Ich hätte es auch so gemacht, jedenfalls wenns nur ein Strich sein soll. Ansonsten hätt ich vl ne Klasse für die Striche geschrieben oder so. Ich glaub ich hätte das POINT-Array global gemacht, weil du dann auch von anderen Funktionen darauf zugreifen kannst.



  • In WM_MOUSEMOVE selbst solltest du nichts zeichnen - und ist auch völlig überflüssig, wenn du es in WM_PAINT eh nochmal machst 😉



  • flenders schrieb:

    In WM_MOUSEMOVE selbst solltest du nichts zeichnen - und ist auch völlig überflüssig, wenn du es in WM_PAINT eh nochmal machst 😉

    Ne, andersherum. In WM_PAINT sollte er nichts machen!



  • WebFritzi schrieb:

    Ne, andersherum. In WM_PAINT sollte er nichts machen!

    Wie? Was? Wieso? Damit der Fensterinhalt garantiert nicht neu gezeichnet wird, wenn das Fenster zuvor verdeckt war? Oder wie oder was?

    Ich sehe das jedenfalls so wie flenders.



  • Huh? schrieb:

    Ich sehe das jedenfalls so wie flenders.

    Dann siehst du das richtig so. 😉 Ich hatte vergessen, dass InvalidateRect() u.a. WM_PAINT aufruft. Wo war ich nur wieder in meinen Gedanken... 😮


Anmelden zum Antworten