THE BUTTON CLASS

We'll begin our exploration of the button window class with a program called BTNLOOK (”button look“), which is shown in Figure 6-1. BTNLOOK creates 11 child window button controls, one for each of the 11 styles of buttons.

BTNLOOK.MAK

#-----------------------

# BTNLOOK.MAK make file

#-----------------------

btnlook.exe : btnlook.obj btnlook.def

link btnlook, /align:16, NUL, /nod slibcew libw, btnlook

rc btnlook.exe

btnlook.obj : btnlook.c

cl -c -Gsw -Ow -W2 -Zp btnlook.c

BTNLOOK.C

/*----------------------------------------

BTNLOOK.C -- Button Look Program

(c) Charles Petzold, 1990

----------------------------------------*/

#include <windows.h>

#include <stdio.h>

struct

{

long style ;

char *text ;

}

button[] =

{

BS_PUSHBUTTON, "PUSHBUTTON",

BS_DEFPUSHBUTTON, "DEFPUSHBUTTON",

BS_CHECKBOX, "CHECKBOX",

BS_AUTOCHECKBOX, "AUTOCHECKBOX",

BS_RADIOBUTTON, "RADIOBUTTON",

BS_3STATE, "3STATE",

BS_AUTO3STATE, "AUTO3STATE",

BS_GROUPBOX, "GROUPBOX",

BS_USERBUTTON, "USERBUTTON",

BS_AUTORADIOBUTTON, "AUTORADIO",

BS_PUSHBOX, "PUSHBOX"

} ;

#define NUM (sizeof button / sizeof button [0])

long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;

int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

{

static char szAppName[] = "BtnLook" ;

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 (NULL, IDI_APPLICATION) ;

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;

wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName ;

RegisterClass (&wndclass) ;

}

hwnd = CreateWindow (szAppName, "Button Look",

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 char szPrm [] = "wParam LOWORD(lParam) HIWORD(lParam)",

szTop [] = "Control ID Window Handle Notification",

szUnd [] = "__________ _____________ ____________",

szFormat [] = " %5u %4X %5u",

szBuffer [50] ;

static HWND hwndButton [NUM] ;

static RECT rect ;

static int cxChar, cyChar ;

HDC hdc ;

PAINTSTRUCT ps ;

int i ;

TEXTMETRIC tm ;

switch (message)

{

case WM_CREATE :

hdc = GetDC (hwnd) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

GetTextMetrics (hdc, &tm) ;

cxChar = tm.tmAveCharWidth ;

cyChar = tm.tmHeight + tm.tmExternalLeading ;

ReleaseDC (hwnd, hdc) ;

for (i = 0 ; i < NUM ; i++)

hwndButton [i] = CreateWindow ("button", button[i].text,

WS_CHILD | WS_VISIBLE | button[i].style,

cxChar, cyChar * (1 + 2 * i),

20 * cxChar, 7 * cyChar / 4,

hwnd, i,

((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;

return 0 ;

case WM_SIZE :

rect.left = 24 * cxChar ;

rect.top = 3 * cyChar ;

rect.right = LOWORD (lParam) ;

rect.bottom = HIWORD (lParam) ;

return 0 ;

case WM_PAINT :

InvalidateRect (hwnd, &rect, TRUE) ;

hdc = BeginPaint (hwnd, &ps) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

SetBkMode (hdc, TRANSPARENT) ;

TextOut (hdc, 24 * cxChar, 1 * cyChar, szPrm, sizeof szPrm - 1) ;

TextOut (hdc, 24 * cxChar, 2 * cyChar, szTop, sizeof szTop - 1) ;

TextOut (hdc, 24 * cxChar, 2 * cyChar, szUnd, sizeof szUnd - 1) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_COMMAND :

ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;

hdc = GetDC (hwnd) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

TextOut (hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),

szBuffer, sprintf (szBuffer, szFormat, wParam,

LOWORD (lParam), HIWORD (lParam))) ;

ReleaseDC (hwnd, hdc) ;

ValidateRect (hwnd, NULL) ;

return 0 ;

case WM_DESTROY :

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}

BTNLOOK.DEF

;------------------------------------

; BTNLOOK.DEF module definition file

;------------------------------------

NAME BTNLOOK

DESCRIPTION 'Button Look Program (c) Charles Petzold, 1990'

EXETYPE WINDOWS

STUB 'WINSTUB.EXE'

CODE PRELOAD MOVEABLE DISCARDABLE

DATA PRELOAD MOVEABLE MULTIPLE

HEAPSIZE 1024

STACKSIZE 8192

EXPORTS WndProc

As you click on each button, it sends a WM_COMMAND message to the parent window procedure, which is the familiar WndProc. BTNLOOK's WndProc displays the wParam and lParam parameters of this message on the right half of the client area, as shown in Figure 6-2.