Linie unterbrochen



  • Ich hab einen einfachen Code, der eigentlich nur eine durchgehende Linie zeichnen sollte. Ich hab ihn unten mal reinkopiert:

    #include <windows.h>
    #include <tchar.h>
    
    // Initial declaration of global variables:
    
    static int y=10;				//y-position of line remains y=10
    
    // Initial declaration of functions:
    
    void drawline (HDC);			//Initial declaration of function which draws the line 
    
    // The main window class name.
    static TCHAR szWindowClass[] = _T("win32app");
    
    // The string that appears in the application's title bar.
    static TCHAR szTitle[] = _T("Draw Line");
    
    HINSTANCE hInst;
    
    // Forward declarations of functions included in this code module:
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	WNDCLASSEX wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    
        if (!RegisterClassEx(&wcex))
        {
            MessageBox(NULL,
                _T("Call to RegisterClassEx failed!"),
                _T("Win32 Guided Tour"),
                NULL);
    
            return 1;
        }
    
        hInst = hInstance; // Store instance handle in our global variable
    
        HWND hWnd = CreateWindow(
            szWindowClass,
            szTitle,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT,
            1250, 400,
            NULL,
            NULL,
            hInstance,
            NULL
        );
    
        if (!hWnd)
        {
            MessageBox(NULL,
                _T("Call to CreateWindow failed!"),
                _T("Win32 Guided Tour"),
                NULL);
    
            return 1;
        }
    
        ShowWindow(hWnd,
            nCmdShow);
        UpdateWindow(hWnd);
    
        // Main message loop:
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return (int) msg.wParam;
    }
    
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
        HDC hdc;
    
        switch (message)
        {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
    
    		drawline(hdc);				//Calls Function which draws the line
    
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
            break;
        }
    
        return 0;
    }
    
    void drawline (HDC hdc)			//Function which draws the line
    {
    	int x=10;
    	while (x<1200)
    	{
    		SetPixel(hdc,x,y,RGB(0,0,0));
    		x=x+1;
    	}
    }
    

    Statt einer durchgehenden Linie bekomme ich aber sowas:

    ____________ ______________ __________

    Allerdings bekomme ich die unterbrochene Linie nur auf meinem privaten Laptop. Wenn ich den gleichen Code fuer meinen Arbeitslaptop benutze, bekomme ich eine durchgehende Linie.
    An was liegt das??????

    Viele Dank im Voraus fuer euere Hilfe!!

    Thomas



  • Ich glaube der Fehler ist im falschen HDC zu finden:

    case WM_PAINT: 
            hdc = BeginPaint(hWnd, &ps); 
    
            drawline(hdc);                //Calls Function which draws the line 
    
            EndPaint(hWnd, &ps);
    

    hdc hat ja keinen sinnvollen Inhalt!
    Stattdessen solltest Du den hdc verwenden, den dir die PAINTSRUCT Struktur bei BeginPaint() mitliefert:

    drawline( ps.hdc );
    

    Du kannst natürlich auch alternativ den Rückgabewert von BeginPaint() der Variable hdc zuweisen.
    Doch diese Variable ist überflüssig, da die Struktur-Variable ps sowieso vorhanden ist.

    HTH,
    Martin

    [Nachtrag:]
    Ich nehme meine Vermutung zurück!
    Die Variable hdc hat doch eine Zuweisung durch BeginPaint() bekommen, das habe ich übersehen, sorry...


  • Mod

    Mmacher schrieb:

    Ich glaube der Fehler ist im falschen HDC zu finden:
    ...
    hdc hat ja keinen sinnvollen Inhalt!

    Wieso?
    BeginPaint leifert einen DC und der wird verwendet. Zudem wird ja auch gezeichnet nur nicht vollständig.

    Ich würde die Ursache eher im Grafiktreiber sehen, also rechnerspezifisch.



  • versuchs doch mal mit dieser Funktion:

    BOOL Polyline(
      __in  HDC hdc,
      __in  const POINT *lppt,
      __in  int cPoints
    );
    

    Gruss
    Dirk



  • Warum eigentlich nicht einfach MoveToEx und LineTo?

    ....
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            const POINT start = {200, 200}, end = {400, 200};
            HDC hdc = BeginPaint(hwnd, &ps);
            MoveToEx(hdc, start.x, start.y, NULL);
            LineTo(hdc, end.x, end.y);
            EndPaint(hwnd, &ps);
            return 0;
        }
    ....
    

  • Mod

    Sicher PolyLine und LineTo sind der bessere Weg.

    Aber eigentlich dürfte die Linie bei diesem Code niemals unterbrochen sein.



  • Die Linie wird bei x=256 unterbrochen (verschwindet) und taucht bei x=512 wieder auf. Es muss rechnerspezifisch sein, denn bei meinem anderen Laptop habe ich dieses Phaenomen nicht....aber warum??? Und wie kann ich das beheben??

    Danke!



  • ok. Ich hab grade folgendes versucht:

    void drawline (HDC hdc)
    {
    int y=20;
    MoveToEx(hdc, 10, y, 0);
    LineTo(hdc, 1200, y);
    }

    Diese Linie ist durchgaengig!!
    Warum???


  • Mod

    AustralianThomas schrieb:

    Die Linie wird bei x=256 unterbrochen (verschwindet) und taucht bei x=512 wieder auf. Es muss rechnerspezifisch sein, denn bei meinem anderen Laptop habe ich dieses Phaenomen nicht....aber warum??? Und wie kann ich das beheben??

    Dein Grafikartentreiber...?


Anmelden zum Antworten