1 #include <windows.h>
2 #include "resource.h"
3 #include <string.h>
4 #include <stdio.h>
5 
6 ULONG __cdecl DbgPrint(IN PCH  Format, IN ...);
7 
8 const char titleDrwIco[] = "DrawIcon Output";
9 const char titleMask[] = "Mask(AND image)";
10 const char titleXor[] = "XOR(color image)";
11 const char file[] = "Icon from file:";
12 const char res[] = "Icon from Resource:";
13 const char cursor[] = "Current Cursor:";
14 const char cursormask[] = "Cursor Mask Bitmap";
15 const char cursorcolor[] = "Cursor Color Bitmap";
16 
17 HFONT tf;
18 HINSTANCE hInst;
19 
20 LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
21 
22 int WINAPI
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)23 WinMain(HINSTANCE hInstance,
24     HINSTANCE hPrevInstance,
25     LPSTR lpszCmdLine,
26     int nCmdShow)
27 {
28   WNDCLASS wc;
29   MSG msg;
30   HWND hWnd;
31 
32   hInst = hInstance;
33 
34   #ifdef _GetCursorInfo
35   GetCursorInfo = (GETCURSORINFO)GetProcAddress(GetModuleHandleW(L"user32.dll"), "GetCursorInfo");
36   #endif
37 
38   wc.lpszClassName = "IconTestClass";
39   wc.lpfnWndProc = MainWndProc;
40   wc.style = CS_VREDRAW | CS_HREDRAW;
41   wc.hInstance = hInstance;
42   wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
43   wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW);
44   wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
45   wc.lpszMenuName = NULL;
46   wc.cbClsExtra = 0;
47   wc.cbWndExtra = 0;
48   if (RegisterClass(&wc) == 0)
49   {
50     DbgPrint("RegisterClass failed (last error 0x%X)\n", GetLastError());
51     return(1);
52   }
53 
54   hWnd = CreateWindow("IconTestClass",
55               "Icon Test",
56               WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
57               CW_USEDEFAULT,
58               CW_USEDEFAULT,
59               480,
60               480,
61               NULL,
62               NULL,
63               hInstance,
64               NULL);
65   if (hWnd == NULL)
66   {
67     DbgPrint("CreateWindow failed (last error 0x%X)\n", GetLastError());
68     return(1);
69   }
70 
71   tf = CreateFontA(14,0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE,
72                    ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
73                    DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons");
74 
75   ShowWindow(hWnd, nCmdShow);
76 
77   SetTimer(hWnd, 1, 1000, NULL);
78 
79   while(GetMessage(&msg, NULL, 0, 0))
80   {
81     TranslateMessage(&msg);
82     DispatchMessage(&msg);
83   }
84 
85   return msg.wParam;
86 }
87 
MainWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)88 LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
89 {
90     PAINTSTRUCT ps;
91     HDC hDC;
92     HICON hIcon;
93     HGDIOBJ hOld;
94     HDC hMemDC;
95     CURSORINFO cursorinfo;
96     ICONINFO iconinfo;
97     BITMAP bmp;
98     RECT rc;
99     CHAR str[20];
100 
101     switch(msg)
102     {
103     case WM_PAINT:
104       hDC = BeginPaint(hWnd, &ps);
105       SelectObject(hDC, tf);
106       SetBkMode(hDC, TRANSPARENT);
107 
108       TextOut(hDC, 160, 10, file, strlen(file));
109       TextOut(hDC, 15, 85, titleDrwIco, strlen(titleDrwIco));
110       TextOut(hDC, 160, 85, titleMask, strlen(titleMask));
111       TextOut(hDC, 300, 85, titleXor, strlen(titleXor));
112 
113       hIcon = LoadImage(NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
114       DrawIcon(hDC,50,50,hIcon);
115 
116       hMemDC = CreateCompatibleDC(hDC);
117       GetIconInfo(hIcon, &iconinfo);
118       DestroyIcon(hIcon);
119 
120       hOld = SelectObject(hMemDC, iconinfo.hbmMask);
121       BitBlt(hDC, 200, 50, 32, 32, hMemDC, 0, 0, SRCCOPY);
122       SelectObject(hMemDC, iconinfo.hbmColor);
123       BitBlt(hDC, 350, 50, 32, 32, hMemDC, 0, 0, SRCCOPY);
124 
125       DeleteObject(iconinfo.hbmMask);
126       DeleteObject(iconinfo.hbmColor);
127 
128       TextOut(hDC, 145, 150, res, strlen(res));
129       TextOut(hDC, 15, 225, titleDrwIco, strlen(titleDrwIco));
130       TextOut(hDC, 160, 225, titleMask, strlen(titleMask));
131       TextOut(hDC, 300, 225, titleXor, strlen(titleXor));
132 
133       hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
134       DrawIcon(hDC,50,190,hIcon);
135 
136       GetIconInfo(hIcon, &iconinfo);
137       DestroyIcon(hIcon);
138 
139       SelectObject(hMemDC, iconinfo.hbmMask);
140       BitBlt(hDC, 200, 190, 32, 32, hMemDC, 0, 0, SRCCOPY);
141       SelectObject(hMemDC, iconinfo.hbmColor);
142       BitBlt(hDC, 350, 190, 32, 32, hMemDC, 0, 0, SRCCOPY);
143 
144       DeleteObject(iconinfo.hbmMask);
145       DeleteObject(iconinfo.hbmColor);
146 
147       cursorinfo.cbSize = sizeof(CURSORINFO);
148       if(GetCursorInfo(&cursorinfo))
149       {
150         if(cursorinfo.hCursor && cursorinfo.flags)
151         {
152           TextOut(hDC, 160, 290, cursor, strlen(cursor));
153           DrawIcon(hDC, 50, 330, cursorinfo.hCursor);
154           GetIconInfo(cursorinfo.hCursor, &iconinfo);
155           TextOut(hDC, 15, 365, titleDrwIco, strlen(titleDrwIco));
156 
157           sprintf(str, "Hotspot: %ld; %ld", iconinfo.xHotspot, iconinfo.yHotspot);
158           TextOut(hDC, 15, 380, str, strlen(str));
159 
160           if(iconinfo.hbmMask)
161           {
162             GetObjectW(iconinfo.hbmMask, sizeof(BITMAP), &bmp);
163             SelectObject(hMemDC, iconinfo.hbmMask);
164             BitBlt(hDC, 200, 330, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);
165             DeleteObject(iconinfo.hbmMask);
166             TextOut(hDC, 160, 365 - 32 + bmp.bmHeight, cursormask, strlen(cursormask));
167 
168             sprintf(str, "%dBPP", bmp.bmBitsPixel);
169             TextOut(hDC, 160, 380 - 32 + bmp.bmHeight, str, strlen(str));
170           }
171 
172           if(iconinfo.hbmColor)
173           {
174             GetObjectW(iconinfo.hbmColor, sizeof(BITMAP), &bmp);
175             SelectObject(hMemDC, iconinfo.hbmColor);
176             BitBlt(hDC, 350, 330, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);
177             DeleteObject(iconinfo.hbmColor);
178             TextOut(hDC, 300, 365 - 32 + bmp.bmHeight, cursorcolor, strlen(cursorcolor));
179 
180             sprintf(str, "%dBPP", bmp.bmBitsPixel);
181             TextOut(hDC, 300, 380 - 32 + bmp.bmHeight, str, strlen(str));
182           }
183         }
184       }
185 
186       SelectObject(hMemDC, hOld);
187 
188       DeleteObject(hMemDC);
189       EndPaint(hWnd, &ps);
190     break;
191 
192     case WM_TIMER:
193       rc.left = 0;
194       rc.top = 330;
195       rc.right = 480;
196       rc.bottom = 480;
197       InvalidateRect(hWnd, &rc, TRUE);
198       break;
199 
200     case WM_DESTROY:
201       PostQuitMessage(0);
202     break;
203 
204     default:
205       return DefWindowProc(hWnd, msg, wParam, lParam);
206     }
207     return 0;
208 }
209