Window Region für Paint

Thomasio

Erfahrenes Mitglied
Ich habe ein Fenster mit einem Dutzend kleinerer Fenster drin, die jeweils eine einfache .bmp grafik anzeigen
Diese .bmp ist aber rund, sprich ein rechteckiges Image, von dem ich die Ecken nicht mitzeichnen will
Also möchte ich den kleinen Fenstern eine runde Region zuordnen, die genauso breit und hoch ist wie das Fenster, nur halt rund, so dass die Ecken transparent bleiben
Ich habe schon gegoogelt und ein paar Tutorials gefunden, aber so richtig blicke ich zwischen

HRGN CreateEllipticRgn()

und wie man das anwendet nicht durch
Kann eventuell mal einer für doofe erklären, an welcher Stelle man die Region created and was man zwischen
BeginPaint()
und
EndPaint()
sonst noch ändern muss, damit nur der runde Ausschnitt gezeichnet wird?

Code:
case WM_PAINT:
      HDC hdc;
      HBITMAP g_hbmtest = NULL;
      BITMAP bm;
      PAINTSTRUCT ps;
      g_hbmtest = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_TEST1));
      hdc = BeginPaint(SubWindow1, &ps);
      HDC hdcMem = CreateCompatibleDC(hdc);
      HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmtest);
      GetObject(g_hbmtest, sizeof(bm), &bm);
      BitBlt(hdc, 10, 10, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
      DeleteObject(g_hbmtest);
      SelectObject(hdcMem, hbmOld);
      DeleteDC(hdcMem);
      EndPaint(SubWindow1, &ps);
break;

danke im voraus
 
Die Clipping Region wird vor dem Zeichnen definiert und ausgewählt. Die Kommentare im Code sollten alles erklären.
C++:
case WM_PAINT:
    HDC hdc;
    HBITMAP g_hbmtest = NULL;
    BITMAP bm;
    PAINTSTRUCT ps;
    g_hbmtest = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_TEST1));
    hdc = BeginPaint(SubWindow1, &ps);
    HDC hdcMem = CreateCompatibleDC(hdc);
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmtest);
    GetObject(g_hbmtest, sizeof(bm), &bm);
    
    // Clipping Region anlegen (umschließendes Recheck = Größe des Bitmaps)
    HRGN rgn = CreateEllipticRgn(10, 10, 10 + bm.bmWidth, 10 + bm.bmHeight);
    // Clipping Region auswählen
    SelectClipRgn(hdc, rgn);
    // Zeichenoperation durchführen
    BitBlt(hdc, 10, 10, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
    // Clipping Region wieder zurücksetzen
    SelectClipRgn(hdc, NULL);                            
      
    DeleteObject(g_hbmtest);
    SelectObject(hdcMem, hbmOld);
    DeleteDC(hdcMem);
    EndPaint(SubWindow1, &ps);
    
    break;
Gruß
MCoder
 
Zurück