1 /*
2  * Shows the 15 well known BitBlt raster operations
3  * using src, dest, pattern, a background brush and color.
4  *
5  * Created by Gregor Schneider <grschneider AT gmail DOT com>, November 2008
6 */
7 
8 #include <windows.h>
9 #include <tchar.h>
10 
11 HINSTANCE hInst;
12 TCHAR szWindowClass[] = _T("testclass");
13 
14 static LRESULT CALLBACK
15 WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
16 {
17     static HBITMAP hBmpTest;
18 
19     switch (message)
20     {
21         case WM_CREATE:
22         {
23             hBmpTest = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
24             break;
25         }
26 
27         case WM_PAINT:
28         {
29             PAINTSTRUCT ps;
30             HDC hdc, hdcMem;
31             BITMAP bitmap;
32             HBRUSH brush, brush2;
33             INT l;
34 
35             hdc = BeginPaint(hWnd, &ps);
36             hdcMem = CreateCompatibleDC(hdc);
37 
38             GetObject(hBmpTest, sizeof(BITMAP), &bitmap);
39 
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);
44 
45             /* hatched brushes */
46             l = 66;
47             brush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0));
48             SelectObject(hdc, brush);
49             PatBlt(hdc, 0, 0, 30, l, PATCOPY);
50             DeleteObject(brush);
51 
52             brush = CreateHatchBrush(HS_CROSS, RGB(255,0,0));
53             SelectObject(hdc, brush);
54             PatBlt(hdc, 0, 1*l, 30, l, PATCOPY);
55             DeleteObject(brush);
56 
57             brush = CreateHatchBrush(HS_FDIAGONAL, RGB(255,0,0));
58             SelectObject(hdc, brush);
59             PatBlt(hdc, 0, 2*l, 30, l, PATCOPY);
60             DeleteObject(brush);
61 
62             brush = CreateHatchBrush(HS_BDIAGONAL, RGB(255,0,0));
63             SelectObject(hdc, brush);
64             PatBlt(hdc, 0, 3*l, 30, l, PATCOPY);
65             DeleteObject(brush);
66 
67             brush = CreateHatchBrush(HS_VERTICAL, RGB(255,0,0));
68             SelectObject(hdc, brush);
69             PatBlt(hdc, 0, 4*l, 30, l, PATCOPY);
70             DeleteObject(brush);
71 
72             brush = CreateHatchBrush(HS_HORIZONTAL, RGB(255,0,0));
73             SelectObject(hdc, brush);
74             PatBlt(hdc, 0, 5*l, 30, l, PATCOPY);
75             DeleteObject(brush);
76 
77             /* set up a second brush */
78             brush2 = CreateHatchBrush(HS_VERTICAL, RGB(127,127,127));
79 
80             /* first select brush, then set bk color */
81             SelectObject(hdc, brush2);
82             SetBkColor(hdc, RGB(0, 255, 0));
83 
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);
92 
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);
97 
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);
102 
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);
106 
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);
112 
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);
117 
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);
122 
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);
126 
127             DeleteObject(brush);
128             DeleteObject(brush2);
129             DeleteDC(hdcMem);
130             EndPaint(hWnd, &ps);
131             break;
132         }
133 
134         case WM_DESTROY:
135             PostQuitMessage(0);
136             break;
137         default:
138             return DefWindowProc(hWnd, message, wParam, lParam);
139     }
140     return 0;
141 }
142 
143 
144 static ATOM
145 MyRegisterClass(HINSTANCE hInstance)
146 {
147     WNDCLASSEX wcex;
148 
149     wcex.cbSize = sizeof(WNDCLASSEX);
150 
151     wcex.style         = CS_HREDRAW | CS_VREDRAW;
152     wcex.lpfnWndProc   = WndProc;
153     wcex.cbClsExtra    = 0;
154     wcex.cbWndExtra    = 0;
155     wcex.hInstance     = hInstance;
156     wcex.hIcon         = NULL;
157     wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);
158     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
159     wcex.lpszMenuName  = NULL;
160     wcex.lpszClassName = szWindowClass;
161     wcex.hIconSm       = NULL;
162 
163     return RegisterClassEx(&wcex);
164 }
165 
166 
167 static BOOL
168 InitInstance(HINSTANCE hInstance, int nCmdShow)
169 {
170    HWND hWnd;
171 
172    hInst = hInstance;
173 
174    hWnd = CreateWindowEx(0,
175                          szWindowClass,
176                          _T("BitBlt raster operation test"),
177                          WS_OVERLAPPEDWINDOW,
178                          CW_USEDEFAULT,
179                          CW_USEDEFAULT,
180                          840,
181                          440,
182                          NULL,
183                          NULL,
184                          hInstance,
185                          NULL);
186 
187    if (!hWnd)
188    {
189       return FALSE;
190    }
191 
192    ShowWindow(hWnd, nCmdShow);
193    UpdateWindow(hWnd);
194 
195    return TRUE;
196 }
197 
198 
199 int WINAPI
200 _tWinMain(HINSTANCE hInstance,
201                      HINSTANCE hPrevInstance,
202                      LPTSTR    lpCmdLine,
203                      int       nCmdShow)
204 {
205     MSG msg;
206 
207     MyRegisterClass(hInstance);
208 
209     if (!InitInstance(hInstance, nCmdShow))
210     {
211         return FALSE;
212     }
213 
214     while (GetMessage(&msg, NULL, 0, 0))
215     {
216         TranslateMessage(&msg);
217         DispatchMessage(&msg);
218     }
219 
220     return (int)msg.wParam;
221 }
222