kostenloser Webspace werbefrei: lima-city


InvalidateRect() - Problem unter Vista ?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    progger

    Kostenloser Webspace von progger

    progger hat kostenlosen Webspace.

    Hallo,
    ich habe da mal wieder ein kleines Problem:
    Eigentlich hat es wohl mehr mit der WINAPI als mit C/C++ zu tun, aber egal.
    Undzwar wird folgender Code fehlerfrei kompiliert, aber bei der Ausführung des Programms wird ein Fehler angezeigt - Vista hat mich Updates runterladen lassen (natürlich vergeblich) und google konnte mir auch nicht helfen.
    Ich hoffe, Ihr könnt es :wink:

    #include <windows.h>
    #include <string.h>
    
    int mouseX = 0;
    int mouseY = 0;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    LPCSTR lpszAppName = "AppName";
    LPCSTR lpszTitle   = "Meine erste Applikation";
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         PSTR szCmdLine, int iCmdShow)
    {
        HWND       hWnd;
        MSG        msg;
        WNDCLASSEX wc;
    
        wc.cbSize        =  sizeof(WNDCLASSEX);
        wc.style         =  CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   =  WndProc;
        wc.cbClsExtra    =  0;
        wc.cbWndExtra    =  0;
        wc.hInstance     =  hInstance;
        wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
        wc.hIcon         =  LoadIcon(NULL, IDI_APPLICATION);
        wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszClassName =  lpszAppName;
        wc.lpszMenuName  =  lpszAppName;
        wc.hIconSm       =  LoadIcon(NULL, IDI_APPLICATION);
    
        if( RegisterClassEx(&wc) == 0)
            return 0;
    
        hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                              lpszAppName,
                              lpszTitle,
                              WS_OVERLAPPEDWINDOW,
                              0,
                              0,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);
    
        if( hWnd == NULL)
            return 0;
    
        ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
    
        while (GetMessage(&msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
        HDC hDC;
        RECT rc;
    
        switch (umsg)
        {
    
            case WM_MOUSEMOVE:
            {
                mouseX = LOWORD(lParam);
                mouseY = HIWORD(lParam);
                SetRect(&rc,mouseX,mouseY,mouseX+50,mouseY+70);
                InvalidateRect(hWnd,&rc,false);
                break;
            }
    
            case WM_PAINT:
            {
                hDC = BeginPaint(hWnd,&ps);
                TextOut(hDC,mouseX,mouseY,(const char*)mouseX,sizeof((const char*)mouseX));
                TextOut(hDC,mouseX,mouseY+20,(const char*)mouseY,sizeof((const char*)mouseY));
                EndPaint(hWnd,&ps);
                break;
            }
    
            case WM_DESTROY:
            {
                PostQuitMessage(0);
                break;
            }
        }
        return DefWindowProc(hWnd, umsg, wParam, lParam);
    }

    Wenn noch andere Fehler drin sind, darf man das bemerken, aber eigentlich geht es mir eben um die Funktion InvalidateRect(), ohne die das Programm "läuft", aber nichts anzeigen kann, weil ja nichts neu gezeichnet wird.

    Danke im voraus
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. d***********a

    Hi,

    dein Problem hat nichts mit InvalidateRect zu tun, geschweige denn was mit Vista. Bei mir funzt das ganze unter XP auch nicht.

    Der Fehler liegt hier:

    case WM_PAINT:
            {
                hDC = BeginPaint(hWnd,&ps);
                TextOut(hDC,mouseX,mouseY,(const char*)mouseX,sizeof((const char*)mouseX));
                TextOut(hDC,mouseX,mouseY+20,(const char*)mouseY,sizeof((const char*)mouseY));
                EndPaint(hWnd,&ps);
                break;
            }


    Du versuchst einen Integer "direkt" in ein char zu verwandeln - das ganze scheitert, wie du evtl selbst merkst.
    Probier das ganze mal mit sprintf (http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/) oder itoa (http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/).

    Also etwa so:
    case WM_PAINT:
            {
                hDC = BeginPaint(hWnd,&ps);
                sprintf(text,"%i - %i",mouseX,mouseY);
                TextOut(hDC,mouseX,mouseY,text,sizeof(text));
                EndPaint(hWnd,&ps);
                break;
            }



    Grüße Chris
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!