Let's begin by looking at a sample program that uses two resources—an icon and a cursor. RESOURC1, shown in Figure 8-1, displays a customized icon when the program is minimized and uses a customized cursor when the mouse is in RESOURC1's client area. RESOURC1 also draws its icon in several rows and columns within the client area.
RESOURC1.MAK
#------------------------
# RESOURC1.MAK make file
#------------------------
resourc1.exe : resourc1.obj resourc1.def resourc1.res
link resourc1, /align:16, NUL, /nod slibcew libw, resourc1
rc resourc1.res
resourc1.obj : resourc1.c
cl -c -Gsw -Ow -W2 -Zp resourc1.c
resourc1.res : resourc1.rc resourc1.ico resourc1.cur
rc -r resourc1.rc
RESOURC1.C
/*-----------------------------------------------------------
RESOURC1.C -- Icon and Cursor Demonstration Program No. 1
(c) Charles Petzold, 1990
-----------------------------------------------------------*/
#include <windows.h>
long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
char szAppName [] = "Resourc1" ;
HANDLE hInst ;
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (hInstance, szAppName) ;
wndclass.hbrBackground = COLOR_WINDOW + 1 ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass) ;
}
hInst = hInstance ;
hwnd = CreateWindow (szAppName, "Icon and Cursor Demo",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
static HICON hIcon ;
static short cxIcon, cyIcon, cxClient, cyClient ;
HDC hdc ;
RECT rect ;
PAINTSTRUCT ps ;
short x, y ;
switch (message)
{
case WM_CREATE :
hIcon = LoadIcon (hInst, szAppName) ;
cxIcon = GetSystemMetrics (SM_CXICON) ;
cyIcon = GetSystemMetrics (SM_CYICON) ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
for (y = cyIcon ; y < cyClient ; y += 2 * cyIcon)
for (x = cxIcon ; x < cxClient ; x += 2 * cxIcon)
DrawIcon (hdc, x, y, hIcon) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
RESOURC1.RC
/*-----------------------------
RESOURC1.RC resource script
-----------------------------*/
resourc1 ICON resourc1.ico
resourc1 CURSOR resourc1.cur
RESOURC1.ICO
RESOURC1.CUR
RESOURC1.DEF
;-------------------------------------
; RESOURC1.DEF module definition file
;-------------------------------------
NAME RESOURC1
DESCRIPTION 'Icon and Cursor Demo Program No. 1 (c) Charles Petzold, 1990'
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
STACKSIZE 8192
EXPORTS WndProc
Both the icon and the cursor were created using the SDKPAINT program supplied with the Windows Software Development Kit. They are shown in Figure 8-1 against a light gray background. SDKPAINT is a Windows application, and it requires a mouse. Icons are saved from SDKPAINT with a .ICO extension; cursors have a .CUR extension. These files are referred to in the RESOURC1.RC resource script.