This program is a translation of ABOUT2.C -- About Box Demo Program No. 2 © Charles Petzold, 1998, described and analysed in Chapter 11 of the book Programming Windows, 5th Edition.
Demonstrates how to manage controls (in this case, radio buttons) within a dialog box procedure and also how to paint on the client area of the dialog box.
' ========================================================================================
' ABOUT2.BAS
' This program is a translation/adaptation of ABOUT2.C -- About Box Demo Program No. 2
' © Charles Petzold, 1998, described and analysed in Chapter 11 of the book Programming
' Windows, 5th Edition.
' Demonstrates how to manage controls (in this case, radio buttons) within a dialog box
' procedure and also how to paint on the client area of the dialog box.
' ========================================================================================
#COMPILE EXE
#DIM ALL
#INCLUDE ONCE "windows.inc"
#RESOURCE RES, "about2.res"
%IDC_BLACK = 1000
%IDC_BLUE = 1001
%IDC_GREEN = 1002
%IDC_CYAN = 1003
%IDC_RED = 1004
%IDC_MAGENTA = 1005
%IDC_YELLOW = 1006
%IDC_WHITE = 1007
%IDC_RECT = 1008
%IDC_ELLIPSE = 1009
%IDC_PAINT = 1010
%IDM_APP_ABOUT = 40001
GLOBAL iCurrentColor AS LONG
GLOBAL iCurrentFigure AS LONG
' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, _
BYVAL pszCmdLine AS WSTRINGZ PTR, BYVAL iCmdShow AS LONG) AS LONG
LOCAL hwnd AS DWORD
LOCAL szAppName AS ASCIIZ * 256
LOCAL wcex AS WNDCLASSEX
LOCAL szCaption AS ASCIIZ * 256
szAppName = "About2"
wcex.cbSize = SIZEOF(wcex)
wcex.style = %CS_HREDRAW OR %CS_VREDRAW
wcex.lpfnWndProc = CODEPTR(WndProc)
wcex.cbClsExtra = 0
wcex.cbWndExtra = 0
wcex.hInstance = hInstance
wcex.hIcon = LoadIcon(%NULL, BYVAL %IDI_APPLICATION)
wcex.hCursor = LoadCursor(%NULL, BYVAL %IDC_ARROW)
wcex.hbrBackground = GetStockObject(%WHITE_BRUSH)
wcex.lpszMenuName = VARPTR(szAppName)
wcex.lpszClassName = VARPTR(szAppName)
IF ISFALSE RegisterClassEx(wcex) THEN
FUNCTION = %TRUE
EXIT FUNCTION
END IF
szCaption = "About Box Demo Program"
hwnd = CreateWindowEx(%WS_EX_CONTROLPARENT, _ ' extended style
szAppName, _ ' window class name
szCaption, _ ' window caption
%WS_OVERLAPPEDWINDOW, _ ' window style
%CW_USEDEFAULT, _ ' initial x position
%CW_USEDEFAULT, _ ' initial y position
%CW_USEDEFAULT, _ ' initial x size
%CW_USEDEFAULT, _ ' initial y size
%NULL, _ ' parent window handle
%NULL, _ ' window menu handle
hInstance, _ ' program instance handle
BYVAL %NULL) ' creation parameters
ShowWindow hwnd, iCmdShow
UpdateWindow hwnd
LOCAL uMsg AS tagMsg
WHILE GetMessage(uMsg, %NULL, 0, 0)
TranslateMessage uMsg
DispatchMessage uMsg
WEND
FUNCTION = uMsg.wParam
END FUNCTION
' ========================================================================================
' ========================================================================================
SUB PaintWindow (BYVAL hwnd AS DWORD, BYVAL iColor AS LONG, BYVAL iFigure AS LONG)
DIM crColor(0 TO 7) AS STATIC DWORD
STATIC flag AS LONG
LOCAL hBrush AS DWORD
LOCAL hdc AS DWORD
LOCAL rc AS RECT
IF ISFALSE flag THEN
flag = %TRUE
crColor(0) = RGB(0, 0, 0)
crColor(1) = RGB(0, 0, 255)
crColor(2) = RGB(0, 255, 0)
crColor(3) = RGB (0, 255, 255)
crColor(4) = RGB(255, 0, 0)
crColor(5) = RGB(255, 0, 255)
crColor(6) = RGB(255, 255, 0)
crColor(7) = RGB(255, 255, 255)
END IF
hdc = GetDC(hwnd)
GetClientRect hwnd, rc
hBrush = CreateSolidBrush(crColor(iColor - %IDC_BLACK))
hBrush = SelectObject(hdc, hBrush)
IF iFigure = %IDC_RECT THEN
Rectangle hdc, rc.nLeft, rc.nTop, rc.nRight, rc.nBottom
ELSE
Ellipse hdc, rc.nLeft, rc.nTop, rc.nRight, rc.nBottom
END IF
DeleteObject SelectObject(hdc, hBrush)
ReleaseDC hwnd, hdc
END SUB
' ========================================================================================
' ========================================================================================
SUB PaintTheBlock (BYVAL hCtrl AS DWORD, BYVAL iColor AS LONG, BYVAL iFigure AS LONG)
InvalidateRect hCtrl, BYVAL %NULL, %TRUE
UpdateWindow hCtrl
PaintWindow hCtrl, iColor, iFigure
END SUB
' ========================================================================================
' ========================================================================================
' Main dialog callback.
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
STATIC hInstance AS DWORD
LOCAL lpc AS CREATESTRUCT PTR
LOCAL ps AS PAINTSTRUCT
SELECT CASE uMsg
CASE %WM_CREATE
lpc = lParam
hInstance = @lpc.hInstance
iCurrentColor = %IDC_BLACK
iCurrentFigure = %IDC_RECT
EXIT FUNCTION
CASE %WM_KEYDOWN
SELECT CASE LO(WORD, wParam)
CASE %VK_ESCAPE
SendMessage hwnd, %WM_CLOSE, 0, 0
EXIT FUNCTION
END SELECT
CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDM_APP_ABOUT
IF DialogBox(hInstance, "AboutBox", hwnd, CODEPTR(AboutDlgProc)) THEN
InvalidateRect hwnd, BYVAL %NULL, %TRUE
END IF
END SELECT
EXIT FUNCTION
CASE %WM_PAINT
BeginPaint hwnd, ps
EndPaint hwnd, ps
PaintWindow hwnd, iCurrentColor, iCurrentFigure
EXIT FUNCTION
CASE %WM_DESTROY
PostQuitMessage 0
EXIT FUNCTION
END SELECT
FUNCTION = DefWindowProc(hwnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
' ========================================================================================
FUNCTION AboutDlgProc (BYVAL hDlg AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
STATIC hCtrlBlock AS DWORD
STATIC iColor AS LONG
STATIC iFigure AS LONG
SELECT CASE uMsg
CASE %WM_INITDIALOG
iColor = iCurrentColor
iFigure = iCurrentFigure
CheckRadioButton hDlg, %IDC_BLACK, %IDC_WHITE, iColor
CheckRadioButton hDlg, %IDC_RECT, %IDC_ELLIPSE, iFigure
hCtrlBlock = GetDlgItem (hDlg, %IDC_PAINT)
SetFocus GetDlgItem (hDlg, iColor)
FUNCTION = %FALSE
EXIT FUNCTION
CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDOK
iCurrentColor = iColor
iCurrentFigure = iFigure
EndDialog hDlg, %TRUE
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDCANCEL
EndDialog hDlg, %FALSE
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_BLACK, %IDC_RED, %IDC_GREEN, %IDC_YELLOW, _
%IDC_BLUE, %IDC_MAGENTA, %IDC_CYAN, %IDC_WHITE
iColor = LO(WORD, wParam)
CheckRadioButton hDlg, %IDC_BLACK, %IDC_WHITE, LO(WORD, wParam)
PaintTheBlock hCtrlBlock, iColor, iFigure
FUNCTION = %TRUE
CASE %IDC_RECT, %IDC_ELLIPSE
iFigure = LO(WORD, wParam)
CheckRadioButton hDlg, %IDC_RECT, %IDC_ELLIPSE, LO(WORD, wParam)
PaintTheBlock hCtrlBlock, iColor, iFigure
FUNCTION = %TRUE
END SELECT
CASE %WM_PAINT
PaintTheBlock hCtrlBlock, iColor, iFigure
END SELECT
END FUNCTION
' ========================================================================================