ICONS AND CURSORS

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.