BitBlt und SetWindowOrg



  • Hallo zusammen,

    ich hab hier mal wieder ein Problem, dass meine Denkkapazitäten gerade ein wenig übersteigt. Also, ich möchte in einem Speicherkontext ein kartesiches Koordinatensystem verwenden, dessen Einheiten jeweils einem Pixel entsprechen. hier ungefähr mein bisheriger code

    ...
        case WM_CREATE:
    
            cxBitmap = 900; cyBitmap =600;
            hdc = GetDC (hwnd);
            hdcMem = CreateCompatibleDC (hdc);
            hBitmap = CreateCompatibleBitmap (hdc, cxBitmap, cyBitmap);
            ReleaseDC (hwnd, hdc);
    
            SelectObject (hdcMem, hBitmap);
            DrawNumTanTM (hdcMem, cxBitmap, cyBitmap, ev, nx, ny);
    
            return 0;
    
        case WM_PAINT:
    
    	hdc = BeginPaint (hwnd, &ps);
    	BitBlt (hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY);
    	EndPaint (hwnd, &ps);
    
            return 0;
    
    ...
    
    int DrawNumTanTM (HDC hdc, int cxBitmap, int cyBitmap, REAL *ev, int nx, int ny)
    
    {
        ...
    
        SetMapMode (hdc, MM_ISOTROPIC);
        SetWindowExtEx (hdc, cxBitmap, cyBitmap, NULL);
        SetViewportExtEx (hdc, cxBitmap, -cyBitmap, NULL);
        SetViewportOrgEx (hdc, 0, cyBitmap, NULL);
        ...
    }
    

    Hier soll der Ursprung jetzt in der unteren linken Ecke liegen, bei einer späteren Funktion aber auch einmal im Mittelpunkt. Mit diesen Einstellungen fürs Koordinatensystem (ausm Petzold bzw. ähnlich) ändert sich an der Zählrichtung für y allerdings nicht viel, zählt immer noch positiv nach unten. Ausserdem benutze ich bei BitBlt wohl noch die falschen Koordinaten für die sourceBitmap. Hab schon jede Menge rumprobiert, aber es nicht so hinbekommen, wie ich es haben will. Mit diesen Einstellungen seh ich übrigens nur nen schwarzen Strich.
    Wär nett wenn auch nochmal jemand ne kurze Beschreibung für SetWindowExtEx und SetViewportExtEx hätte, da ich aus der msdn-Doku und dem Petzold nicht so ganz schlau werde.

    danke schon mal im voraus, christian


Anmelden zum Antworten