2 * Shows the 15 well known BitBlt raster operations
3 * using src, dest, pattern, a background brush and color.
5 * Created by Gregor Schneider <grschneider AT gmail DOT com>, November 2008
12 TCHAR szWindowClass
[] = _T("testclass");
14 static LRESULT CALLBACK
15 WndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
17 static HBITMAP hBmpTest
;
23 hBmpTest
= (HBITMAP
)LoadImage(hInst
, MAKEINTRESOURCE(100), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
35 hdc
= BeginPaint(hWnd
, &ps
);
36 hdcMem
= CreateCompatibleDC(hdc
);
38 GetObject(hBmpTest
, sizeof(BITMAP
), &bitmap
);
40 /* fill destination with brush */
41 brush
= CreateHatchBrush(HS_DIAGCROSS
, RGB(255,0,0));
42 SelectObject(hdc
, brush
);
43 PatBlt(hdc
, 30, 0, 4*bitmap
.bmWidth
*2, 4*bitmap
.bmHeight
, PATCOPY
);
47 brush
= CreateHatchBrush(HS_DIAGCROSS
, RGB(255,0,0));
48 SelectObject(hdc
, brush
);
49 PatBlt(hdc
, 0, 0, 30, l
, PATCOPY
);
52 brush
= CreateHatchBrush(HS_CROSS
, RGB(255,0,0));
53 SelectObject(hdc
, brush
);
54 PatBlt(hdc
, 0, 1*l
, 30, l
, PATCOPY
);
57 brush
= CreateHatchBrush(HS_FDIAGONAL
, RGB(255,0,0));
58 SelectObject(hdc
, brush
);
59 PatBlt(hdc
, 0, 2*l
, 30, l
, PATCOPY
);
62 brush
= CreateHatchBrush(HS_BDIAGONAL
, RGB(255,0,0));
63 SelectObject(hdc
, brush
);
64 PatBlt(hdc
, 0, 3*l
, 30, l
, PATCOPY
);
67 brush
= CreateHatchBrush(HS_VERTICAL
, RGB(255,0,0));
68 SelectObject(hdc
, brush
);
69 PatBlt(hdc
, 0, 4*l
, 30, l
, PATCOPY
);
72 brush
= CreateHatchBrush(HS_HORIZONTAL
, RGB(255,0,0));
73 SelectObject(hdc
, brush
);
74 PatBlt(hdc
, 0, 5*l
, 30, l
, PATCOPY
);
77 /* set up a second brush */
78 brush2
= CreateHatchBrush(HS_VERTICAL
, RGB(127,127,127));
80 /* first select brush, then set bk color */
81 SelectObject(hdc
, brush2
);
82 SetBkColor(hdc
, RGB(0, 255, 0));
84 /* 15 blt op's with bitblt */
85 SelectObject(hdcMem
, hBmpTest
);
86 /* offset coordinates */
87 SetWindowOrgEx(hdc
, -10, -10, NULL
);
88 BitBlt(hdc
, 30, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, SRCCOPY
);
89 BitBlt(hdc
, 130, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, DSTINVERT
);
90 BitBlt(hdc
, 230, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, MERGECOPY
);
91 BitBlt(hdc
, 330, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, MERGEPAINT
);
93 BitBlt(hdc
, 30, 100, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, NOTSRCCOPY
);
94 BitBlt(hdc
, 130, 100, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, NOTSRCERASE
);
95 BitBlt(hdc
, 230, 100, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, PATCOPY
);
96 BitBlt(hdc
, 330, 100, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, PATINVERT
);
98 BitBlt(hdc
, 30, 200, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, PATPAINT
);
99 BitBlt(hdc
, 130, 200, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, SRCAND
);
100 BitBlt(hdc
, 230, 200, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, SRCERASE
);
101 BitBlt(hdc
, 330, 200, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, SRCINVERT
);
103 BitBlt(hdc
, 30, 300, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, BLACKNESS
);
104 BitBlt(hdc
, 130, 300, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, SRCPAINT
);
105 BitBlt(hdc
, 230, 300, bitmap
.bmWidth
, bitmap
.bmHeight
, hdcMem
, 0, 0, WHITENESS
);
107 /* 15 blt op's with stretchblt */
108 StretchBlt(hdc
, 30+400, 0, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, SRCCOPY
);
109 StretchBlt(hdc
, 130+400, 0, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, DSTINVERT
);
110 StretchBlt(hdc
, 230+400, 0, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, MERGECOPY
);
111 StretchBlt(hdc
, 330+400, 0, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, MERGEPAINT
);
113 StretchBlt(hdc
, 30+400, 100, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, NOTSRCCOPY
);
114 StretchBlt(hdc
, 130+400, 100, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, NOTSRCERASE
);
115 StretchBlt(hdc
, 230+400, 100, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, PATCOPY
);
116 StretchBlt(hdc
, 330+400, 100, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, PATINVERT
);
118 StretchBlt(hdc
, 30+400, 200, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, PATPAINT
);
119 StretchBlt(hdc
, 130+400, 200, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, SRCAND
);
120 StretchBlt(hdc
, 230+400, 200, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, SRCERASE
);
121 StretchBlt(hdc
, 330+400, 200, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, SRCINVERT
);
123 StretchBlt(hdc
, 30+400, 300, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, BLACKNESS
);
124 StretchBlt(hdc
, 130+400, 300, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, SRCPAINT
);
125 StretchBlt(hdc
, 230+400, 300, bitmap
.bmWidth
/2, bitmap
.bmHeight
/2, hdcMem
, 0, 0, bitmap
.bmWidth
, bitmap
.bmHeight
, WHITENESS
);
128 DeleteObject(brush2
);
138 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
145 MyRegisterClass(HINSTANCE hInstance
)
149 wcex
.cbSize
= sizeof(WNDCLASSEX
);
151 wcex
.style
= CS_HREDRAW
| CS_VREDRAW
;
152 wcex
.lpfnWndProc
= WndProc
;
155 wcex
.hInstance
= hInstance
;
157 wcex
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
158 wcex
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+1);
159 wcex
.lpszMenuName
= NULL
;
160 wcex
.lpszClassName
= szWindowClass
;
163 return RegisterClassEx(&wcex
);
168 InitInstance(HINSTANCE hInstance
, int nCmdShow
)
174 hWnd
= CreateWindowEx(0,
176 _T("BitBlt raster operation test"),
192 ShowWindow(hWnd
, nCmdShow
);
200 _tWinMain(HINSTANCE hInstance
,
201 HINSTANCE hPrevInstance
,
207 MyRegisterClass(hInstance
);
209 if (!InitInstance(hInstance
, nCmdShow
))
214 while (GetMessage(&msg
, NULL
, 0, 0))
216 TranslateMessage(&msg
);
217 DispatchMessage(&msg
);
220 return (int)msg
.wParam
;