GDI-Frage(mehr oder weniger)



  • Hallo,
    ich hab eine Frage, und zwar ob es einen unterschied macht wenn ich PAINTSTRUCT ps; und HDC hDC; anstad in diesem Code einfach global zu erstelle?

    #include <windows.h>
    
    // Prototypen
    
    // Anwendungsfenster erzeugen
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    //Callback Funktion zur Nachrichtenbehandlung
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    // Das Fensterhandle
    HWND hWnd = 0;
    
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {   
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            MessageBox(0,"Fehler","Fehler",MB_OK);
            return 0;
        }
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg;
    
        // Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
        while(GetMessage(&msg,NULL,0,0))
    	{
        		// Nachricht an die Callback Funktion senden
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
        }
    
        // Rückgabewert an Windows
        return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass;                                   // WNDCLASSEX Struktur
    
        // Struktur initialisieren
        wndClass.cbSize        = sizeof(WNDCLASSEX);           // Größe angeben (nie vergessen!)
        wndClass.style         = CS_DBLCLKS | CS_OWNDC |
                                 CS_HREDRAW | CS_VREDRAW;      // Standard Stile
        wndClass.lpfnWndProc   = WindowFunc;                   // Die Callback Funktion angeben
    
        wndClass.cbClsExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
        wndClass.cbWndExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
        wndClass.hInstance     = hInstance;                    // Anwendungsinstanz
    
        wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  // Weisser Pinsel
        wndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);  // Normaler Cursor
        wndClass.lpszMenuName  = NULL;                         // Das Fenster hat kein Menü
        wndClass.lpszClassName = "WindowClass";                // Der Name der Klasse
        wndClass.hIcon         = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo
        wndClass.hIconSm       = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo
    
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "Ein einfaches Fenster",// Fenstertitel
                              WS_OVERLAPPEDWINDOW |   // Fenster
                              WS_VISIBLE,             // Eigenschaften
                              0, 0, 400, 300,         // Anfangsposition und Größe
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menüs
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benötigt
    }
    
    // Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
    // für Ihr Programm vorliegt
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // testen, um welche Nachticht es sich handelt
        switch(msg)
        {
            // das Fenster soll geschlossen werden
            case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
                    break;
    
            // das Fenster muss neu gezeichnet werden
            case WM_PAINT:
                        PAINTSTRUCT ps;
                        HDC hDC;
    
                        // Handle des Device Context anfordern
                        hDC = BeginPaint(hWnd,&ps);    
    
                        // 10 * Hallo in rot ausgeben
                        for(int i=0;i<200;i+=20)
                        {
                            // Farbe setzen
                            SetTextColor(hDC,RGB(i,0,0));
    
                            TextOut(hDC,i,i,"Hallo",5);
                        }
    
                        // mitteilen, dass die Zeichenoperationen abgeschlossen sind
                        EndPaint(hWnd,&ps);
    
                        return 0;
                    break;
        }
    
        // Wenn wir uns nicht um die Nachricht gekümmert haben
        // wird sie an die Standardnachrichtenverarbeitung von Windows
        // geschickt
        return (DefWindowProc(hwnd, msg, wParam, lParam));
    }
    


  • und was soll das bringen? 😕



  • naja das macht den unterschied das die sachen global sind was sollen Sie denn sonst für ein unterschied machen kannst halt auch an anderen stellen darauf zugreifen aber was das bringt eine ahnung 😉

    mfG LA



  • Das macht eigentlich garkeinen Unterschied. Aber so wie in diesem Code solltest du es nicht machen. Deklariere sie (wie es jeder macht) in der WindowProc als static.


Anmelden zum Antworten