Vierecke, Kreise ...



  • Hi @ All.

    ich wollte jetzt ein Viereck/Kreis... (is egal) zeichnen.

    Rectangle(hdc,left,top,right,bottom)
    

    so. wie kann ich die Farbe bestimmen?

    und wie kann ich die maximale breite/höhe (pixeln) des bildschirm s ermitteln?

    mein code: (funktioniert nicht.)

    // At first define for including the windows headers
    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    
    // C RunTime Header Files
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>
    
    // Local Header Files
    
    #include <commdlg.h>
    #include <ocidl.h>
    #include <olectl.h>
    #include <crtdbg.h>
    
    // The Window Procedure
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	switch (msg)
    	{
    	case WM_CREATE:
    		break;
    	case WM_PAINT:
    		hdc = GetDC(hwnd);
    		Rectangle(hdc,0,0,500,500);
    		break;
    	case WM_CLOSE:
    		DestroyWindow(hwnd);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hwnd, msg, wParam, lParam);
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    					LPSTR lpCmdLine, int nCmdShow)
    {
    	WNDCLASSEX wc;
    	HWND hwnd;
    	MSG Msg;
    	static char appName[] = "Your Application";
    
    	// Registering the Window Class
    	wc.cbSize		 = sizeof(WNDCLASSEX);
    	wc.style		 = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc	 = WndProc;
    	wc.cbClsExtra	 = 0;
    	wc.cbWndExtra	 = 0;
    	wc.hInstance	 = hInstance;
    	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszMenuName  = NULL;
    	wc.lpszClassName = appName;
    	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
    
    	if (!RegisterClassEx(&wc))
    	{
    		MessageBox(NULL, "Window Registration Failed!", "Error!",
    			MB_ICONERROR | MB_OK);
    		return 0;
    	}
    	// Creating the Window
    	hwnd = CreateWindowEx(
    		WS_EX_CLIENTEDGE | WS_EX_LAYERED,
    		appName,
    		"Your Window Title",
    		WS_BORDER,
    		CW_USEDEFAULT, CW_USEDEFAULT, 400, 400,
    		NULL, NULL, hInstance, NULL);
    
    	if (hwnd == NULL)
    	{
    		MessageBox(NULL, "Window Creation Failed!", "Error",
    			MB_ICONERROR | MB_OK);
    		return 0;
    	}
    
    	ShowWindow(hwnd, nCmdShow);
    
    	UpdateWindow(hwnd);
    
    	// The Message Loop
    	while (GetMessage(&Msg, NULL, 0, 0) > 0)
    	{
    		TranslateMessage(&Msg);
    		DispatchMessage(&Msg);
    	}
    	return int(Msg.wParam);
    }
    

    danke..



  • Script-Styler schrieb:

    so. wie kann ich die Farbe bestimmen?

    bestimmen oder vielmehr die zu zeichnende Farbe festlegen?

    SelectObject(hdc, hpen);
    SelectObject(hdc, hbrush);
    Rectangle(...);
    

    Script-Styler schrieb:

    und wie kann ich die maximale breite/höhe (pixeln) des bildschirm s ermitteln?

    So wie es in deinem Code aussieht, meinst du sicherlich die Dimensionen des Clientbereichs des Fensters

    GetClientRect(hwnd, &rc);
    

    Beispiel:

    case WM_PAINT:
      RECT rc;
      PAINTSTRUCT ps;
      HDC hdc;
      HPEN hpen;
      HBRUSH hbrush;
      GetClientRect(hwnd, &rc);
      hdc = BeginPaint(hwnd, &ps);
      hpen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
      hbrush = CreateSolidBrush(RGB(0, 0, 255));
      SelectObject(hdc, hpen);
      SelectObject(hdc, hbrush);
      Rectangle(hdc, rc.left + 10, rc.top + 10, rc.right - 10, rc.bottom - 10);
      EndPaint(hwnd, &ps);
      DeleteObject(hbrush);
      DeleteObject(hpen);
      break;
    }
    

    Nicht vergessen bei Bearbeitung der Message WM_PAINT, BeginPaint und EndPaint verwenden.



  • Nicht vergessen: Alle Objekte, die in ein HDC via SelectObject eingesetzt werden, müssen nicht nur gelöscht werden..., sondern der alte Inhalt muss (oder besser 'sollte' - eben guter Programmierstil) für den jeweiligen Objekttyp auch wieder hergestellt werden 😉 . Siehe MSDN zu SelectObject.


Anmelden zum Antworten