Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Regions und Skinning - Teil 1
von Plapperkatze am 5.Februar 2006 um 14:39
zurück zur Kategorie "Tutorials"

Hier habe ich einmal ein nicht-rechteckiges Fenster erstellt, ein Loch hineingestanzt mit XOR, und das ganze texturiert.



Es werden zwei Regions (HRGN) erstellt, die dann mit XOR kombiniert werden. Danach wird die neu erzeugte Region (mit Loch) auf das Fenster angewendet. Die Regions müssen danach wieder freigegeben werden. Das alles geschieht in WM_CREATE. Für die Textur wird in WinMain ein Bitmap (test.bmp) geladen und als Fensterhintergrund verwendet.
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[]    = "Region";

int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
 MSG        msg;
 HWND       hWnd;
 WNDCLASS   wc;
 
 // Skinning - Bitmap laden und Brush daraus erzeugen
 HBITMAP hBmp=(HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
 HBRUSH hBrush = CreatePatternBrush(hBmp);


 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; // hier der Bitmap-Brush
 wc.lpszClassName       = szAppName;
 wc.lpszMenuName        = NULL;
 
 RegisterClass(&wc);
 
 hWnd = CreateWindow(   szAppName,
                        szAppName,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
                       
 ShowWindow(hWnd, iCmdShow);
 UpdateWindow(hWnd);
 
 while (GetMessage(&msg, NULL, 0, 0))
 {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }
 return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 // 2 Region-Handles
 HRGN hRegion1,hRegion2;

 switch (message)
 {
    case WM_CREATE:

      hRegion1 = CreateRoundRectRgn(0,0,120,120,25,25);
      hRegion2 = CreateEllipticRgn(20,30,100,110);

      CombineRgn(hRegion1,hRegion1,hRegion2,RGN_XOR);

      SetWindowRgn(hWnd,hRegion1,TRUE);

      DeleteObject(hRegion1);
      DeleteObject(hRegion2);


      break;

    case WM_PAINT:
      break;

    case WM_DESTROY:
    {
       PostQuitMessage(0);
       return 0;
    }
 }
 return DefWindowProc(hWnd, message, wParam, lParam);
}

Es gibt noch weitere Befehle zum erstellen und bearbeiten von Regions. Guckt in die win32 API Dokumentation, wie man sie verwendet:

CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, EqualRgn, ExtCreateRegion, FillRgn, FrameRgn, GetPolyFillMode, GetRegionData, GetRgnBox, InvertRgn, OffsetRgn, PaintRgn, PtInRegion, RectInRegion, SetPolyFillMode

Weiter geht es in meinem Tutorial: "Regions und Skinning"

grüsse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215314 Besucher seit dem 23.01.2012 Login