InvalidateRect() wie bzw wo aufrufen???



  • Hallo zusammen,

    habe mich in der letzten Zeit mal etwas mit WINAPI beschaeftigt.
    Habe es auch schon hinbekommen das ich ein Fenster erzeuge welches
    sich in der Groesse nicht veraendern laesst und nur das "Schliessen
    Kreuzchen" hat. In diesem Fenster wird momentan ein Text ausgegeben.

    Mein ziehl ist es eigentlich den auzugebenden Text periodisch zu
    veraendern und erneut anzeigen zu lassen. Dazu wollte ich eine
    Endlosschleife nutzten in welcher der Text veraendert und
    danach die Funktion InvalidateRect() aufgerufen wird um das Fenster neu
    zu zeichnen.

    Hier erst mal der Code:

    /* Creation of a simple Windows API program */
    
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI
    WinMain (HINSTANCE hThisInstance,
             HINSTANCE hPrevInstance,
             LPSTR lpszArgument,
             int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;   /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use actual Windows's color as the background of the window */
        wincl.hbrBackground = (HBRUSH) GetSysColorBrush(COLOR_WINDOW); //rueckgabewert von GetSysColorBrush wird gecastet
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Nicos Alter 4",       /* Title Text */
               WS_BORDER | WS_SYSMENU, /* thin border, size can't be change with close button */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               200,                 /* The programs width */
               120,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    
        //fenster wird immer wieder neu gezeichnet
        while(1)
        InvalidateRect(hwnd, NULL, TRUE);
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK
    WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    HDC hdc;		/* A device context used for drawing */
    PAINTSTRUCT ps;	/* Also used during window drawing */
    RECT rc;		/* A rectangle used during drawing */
    
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
    
            case WM_PAINT:
                /* The window needs to be painted (redrawn). */
                hdc = BeginPaint (hwnd, &ps);
                GetClientRect (hwnd, &rc);
    
                /* Draw "Hello, World" in the middle of the upper
                 * half of the window. */
                rc.bottom = rc.bottom / 2;
    
                //Hintergrund der Schriftart transparent machen
                SetBkMode(hdc,TRANSPARENT);	
    
                //den Text ausgeben
                DrawText (hdc, "Alter in berechneten Zahlen", -1, &rc, 
               	DT_SINGLELINE | DT_CENTER | DT_VCENTER );
    
                EndPaint (hwnd, &ps);
                return 0;
                break;
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    Nun meine Frage: 😕

    Wo koennte man hier mit der Endlosschleife ansetzen, bzw wo sollte/muss man diese eintragen? 🙄

    Eventuell kann mir ja jemand einen Denkanstoss geben da das mein erstes
    WinAPI Programm ist.



  • Endlosschleife in einem Win32-GUI Programm ist böse böse böse!

    Schau Dir mal die Funktion SetTimer bzw. die Nachricht WM_TIMER an...



  • Hepi schrieb:

    Endlosschleife in einem Win32-GUI Programm ist böse böse böse!

    wieso? sowas ähnliches ist doch schon drin. dieses 'while (GetMessage....'. da könnte er seinen code mit reinbasteln



  • Hallo,

    vielen Dank erstmal fuer die Antworten. 👍
    Habe mir die Funktion SetTimer und WM_TIMER mal naeher angesehen,
    und auch ein beispiel dafuer im Forum gefunden.

    Laesst sich damit recht leicht bewerkstelligen. 😃


Log in to reply