Example+property+sheet

//by Richard Russell, October 2015//

The main //BBC BASIC for Windows// Help documentation contains information on how to create a [|Property Sheet], but no demonstration program is supplied. For those who prefer to adapt an existing program rather than to write their own from scratch, here is an example of a property sheet in action.

By default the **Apply** button is not enabled, but here it is. Note that you will receive a notification that the Apply button has been pressed for each page in your property sheet (so in the example below you will receive it twice):

code format="bb4w" REM. Program to demonstrate the use of property sheets from BBC BASIC REM. Richard Russell 5th August 2002

INSTALL @lib$+"WINLIB2" INSTALL @lib$+"WINLIB4" DIM Text% 255

REM!WC Windows Constants: CB_ADDSTRING = 323 CB_SETCURSEL = 334 CBS_DROPDOWNLIST = 3 CBS_SORT = 256 EM_SETSEL = &B1 ES_NUMBER = 8192 LR_LOADFROMFILE = 16 LR_LOADMAP3DCOLORS = 4096 PSM_CHANGED = &468 PSM_GETCURRENTPAGEHWND = &476 SS_BITMAP = &E SS_CENTERIMAGE = 512 SS_LEFTNOWORDWRAP = &C SS_NOPREFIX = &80 SS_RIGHT = 2 STM_SETIMAGE = 370 UDM_SETRANGE = &465 WS_GROUP = &20000 WS_TABSTOP = 65536

chx1 = 101 chx2 = 102 chx3 = 103 chx4 = 104 chx5 = 105

grp1 = 201 grp2 = 202 grp3 = 203 grp4 = 204

rdb1 = 301 rdb2 = 302 rdb3 = 303 rdb4 = 304 rdb5 = 305

edt1 = 401 edt2 = 402 edt3 = 403

psh2 = 502

cmb4 = 604

stc2 = 702 stc3 = 703 stc5 = 705 stc6 = 706 stc7 = 707 stc8 = 708 stc9 = 709 stc10 = 710 stc11 = 711 stc12 = 712 stc13 = 713 stc14 = 714

ico3 = 803 upd1 = 903

REM. Create the dialogues: page0% = FN_newdialog("Page 1", 32, 32, 288, 128, 8, 650) PROC_groupbox(page0%, "Printer", grp4, 8, 4, 272, 84, WS_GROUP) PROC_static(page0%, "&Name:", stc6, 16, 20, 36, 8, 0) PROC_combobox(page0%, "", cmb4, 52, 18, 152, 152, CBS_DROPDOWNLIST OR CBS_SORT OR WS_GROUP) PROC_pushbutton(page0%, "&Properties", psh2, 212, 17, 60, 14, WS_GROUP) PROC_static(page0%, "Status:", stc8, 16, 36, 36, 10, SS_NOPREFIX) PROC_static(page0%, "", stc12, 52, 36, 224, 10, SS_NOPREFIX OR SS_LEFTNOWORDWRAP) PROC_static(page0%, "Type:", stc7, 16, 48, 36, 10, SS_NOPREFIX) PROC_static(page0%, "", stc11, 52, 48, 224, 10, SS_NOPREFIX OR SS_LEFTNOWORDWRAP) PROC_static(page0%, "Where:", stc10, 16, 60, 36, 10, SS_NOPREFIX) PROC_static(page0%, "", stc14, 52, 60, 224, 10, SS_NOPREFIX OR SS_LEFTNOWORDWRAP) PROC_static(page0%, "Comment:", stc9, 16, 72, 36, 10, SS_NOPREFIX) PROC_static(page0%, "", stc13, 52, 72, 152, 10, SS_NOPREFIX OR SS_LEFTNOWORDWRAP) PROC_checkbox(page0%, "Print to fi&le", chx1, 212, 70, 64, 12, WS_GROUP)

page1% = FN_newdialog("Page 2", 32, 32, 288, 128, 8, 1100) PROC_groupbox(page1%, "Print range", grp1, 8, 4, 144, 64, WS_GROUP) PROC_radiobutton(page1%, "&All", rdb1, 16, 18, 20, 12, WS_GROUP) PROC_radiobutton(page1%, "Pa&ges", rdb3, 16, 34, 36, 12, -WS_TABSTOP) PROC_radiobutton(page1%, "&Selected region", rdb2, 16, 50, 64, 12, 0) PROC_static(page1%, "&from:", stc2, 52, 36, 20, 8, SS_RIGHT) PROC_editbox(page1%, "", edt1, 74, 34, 26, 12, WS_GROUP OR ES_NUMBER) PROC_static(page1%, "&to:", stc3, 102, 36, 14, 8, SS_RIGHT) PROC_editbox(page1%, "", edt2, 118, 34, 26, 12, WS_GROUP OR ES_NUMBER) PROC_groupbox(page1%, "Copies", grp2, 160, 4, 120, 64, WS_GROUP) PROC_static(page1%, "Number of &copies:", stc5, 168, 20, 68, 8, 0) PROC_editbox(page1%, "", edt3, 240, 18, 32, 12, WS_GROUP OR ES_NUMBER) PROC_dlgctrl(page1%, "", upd1, 0, 0, 12, 12, &50000096, "msctls_updown32") PROC_static(page1%, "", ico3, 162, 36, 76, 24, SS_BITMAP OR SS_CENTERIMAGE OR WS_GROUP) PROC_checkbox(page1%, "C&ollate", chx2, 240, 42, 36, 12, WS_GROUP) PROC_groupbox(page1%, "Syntax highlighting", grp3, 8, 72, 272, 48, WS_GROUP) PROC_radiobutton(page1%, "Print in colou&r", rdb4, 16, 86, 60, 12, WS_GROUP) PROC_radiobutton(page1%, "Print in blac&k", rdb5, 16, 102, 60, 12, 0) PROC_checkbox(page1%, "&Underlined keywords", chx3, 78, 102, 80, 12, WS_GROUP) PROC_checkbox(page1%, "&Italic REMarks", chx4, 162, 102, 62, 12, WS_GROUP) PROC_checkbox(page1%, "&Bold strings", chx5, 226, 102, 52, 12, WS_GROUP)

REM. Create the property sheet: pages% = 2 DIM dlg%(pages%-1), hdlg%(pages%-1) dlg% = page0%, page1% PropSh% = FN_newpropsheet("Property sheet", pages%, 0, 0, dlg%) : REM. Caption, no. of pages, initial page, list of dialogues

REM. Display the property sheet: PROC_showpropsheet(PropSh%, hdlg%) ON CLOSE PROCcleanup : QUIT ON ERROR SYS "MessageBox", @hwnd%, REPORT$, 0, 0 : PROCcleanup : QUIT

REM. Initialise page 1: SYS "SendDlgItemMessage", hdlg%(0), cmb4, CB_ADDSTRING, 0, "HP LaserJet IIIP" SYS "SendDlgItemMessage", hdlg%(0), cmb4, CB_ADDSTRING, 0, "HP LaserJet Plus" SYS "SendDlgItemMessage", hdlg%(0), cmb4, CB_ADDSTRING, 0, "HP Photosmart 1115" SYS "SendDlgItemMessage", hdlg%(0), cmb4, CB_SETCURSEL, 0, 0

SYS "SetDlgItemText", hdlg%(0), stc12, "Default printer; Ready" SYS "SetDlgItemText", hdlg%(0), stc11, "HP LaserJet IIIP" SYS "SetDlgItemText", hdlg%(0), stc14, "LPT1:"

REM. Initialise page 2: SYS "CheckRadioButton", hdlg%(1), rdb1, rdb2, rdb1 SYS "GetDlgItem", hdlg%(1), rdb2 TO hrad2% SYS "EnableWindow", hrad2%, 0 SYS "SetDlgItemInt", hdlg%(1), edt1, 1 SYS "SetDlgItemInt", hdlg%(1), edt2, 1

SYS "SetDlgItemInt", hdlg%(1), edt3, 1 SYS "CheckDlgButton", hdlg%(1), chx2, 1

SYS "CheckRadioButton", hdlg%(1), rdb4, rdb5, rdb5 SYS "CheckDlgButton", hdlg%(1), chx3, 1 SYS "CheckDlgButton", hdlg%(1), chx4, 1 SYS "CheckDlgButton", hdlg%(1), chx5, 1

SYS "SendDlgItemMessage", hdlg%(1), upd1, UDM_SETRANGE, 0, (1 << 16)+9999 SYS "GetDlgItem", hdlg%(1), chx2 TO hchx2% SYS "EnableWindow", hchx2%, 0

SYS "LoadImage", 0, @dir$+"collate.bmp", 0, 97, 41, LR_LOADMAP3DCOLORS OR \ \               LR_LOADFROMFILE TO hCollate% SYS "LoadImage", 0, @dir$+"copies.bmp", 0, 109, 41, LR_LOADMAP3DCOLORS OR \ \               LR_LOADFROMFILE TO hCopies% SYS "SendDlgItemMessage", hdlg%(1), ico3, STM_SETIMAGE, 0, hCollate%

REM. Process page changes and button clicks: DIM Q%(31) ON SYS Q% = Q%(0)+1,@wparam%,Q%(1),Q%(2),Q%(3),Q%(4),Q%(5),Q%(6),Q%(7),Q%(8),\ \ Q%(9),Q%(10),Q%(11),Q%(12),Q%(13),Q%(14),Q%(15),Q%(16),Q%(17),Q%(18),Q%(19),Q%(20),\ \ Q%(21),Q%(22),Q%(23),Q%(24),Q%(25),Q%(26),Q%(27),Q%(28),Q%(29),Q%(30) : RETURN

oldhdlg% = 0 REPEAT WAIT 1 click% = 0 IF Q%(0) click% = Q%(Q%(0)) : Q%(0) -= 1 SYS "SendMessage", !PropSh%, PSM_CHANGED, hdlg%(0), 0 SYS "SendMessage", !PropSh%, PSM_GETCURRENTPAGEHWND, 0, 0 TO hdlg% oldhdlg% = hdlg% CASE click% AND &FFFF OF         WHEN 1: PRINT "OK or APPLY pressed" SYS "GetDlgItemText", hdlg%(0), stc11, Text%, 255 PRINT "Printer name = " $$Text% SYS "IsDlgButtonChecked", hdlg%(0), chx1 TO ptf% IF ptf% THEN PRINT "Print to file" SYS "IsDlgButtonChecked", hdlg%(1), rdb1 TO all% IF all% THEN PRINT "All pages" ELSE SYS "GetDlgItemInt", hdlg%(1), edt1, 0, 0 TO first% SYS "GetDlgItemInt", hdlg%(1), edt2, 0, 0 TO last% PRINT "Page range ";first%; " to ";last% ENDIF SYS "GetDlgItemInt", hdlg%(1), edt3, 0, 0 TO copies% PRINT "No. of copies = ";copies% IF copies%>1 THEN SYS "IsDlgButtonChecked", hdlg%(1), chx2 TO coll% IF coll% PRINT "Collate" ENDIF SYS "IsDlgButtonChecked", hdlg%(1), rdb4 TO col% IF col% THEN PRINT "Print in colour" ELSE PRINT "Print in black & white" ENDIF WHEN 2: PRINT "CANCEL pressed" WHEN rdb3: SYS "GetDlgItem", hdlg%(1), edt1 TO hedt1% SYS "SetForegroundWindow", hedt1% SYS "SendDlgItemMessage", hdlg%(1), edt1, EM_SETSEL, 0, -1 WHEN rdb4: SYS "GetDlgItem", hdlg%(1), chx3 TO hchx3% SYS "EnableWindow", hchx3%, 0 SYS "GetDlgItem", hdlg%(1), chx4 TO hchx4% SYS "EnableWindow", hchx4%, 0 SYS "GetDlgItem", hdlg%(1), chx5 TO hchx5% SYS "EnableWindow", hchx5%, 0 WHEN rdb5: SYS "GetDlgItem", hdlg%(1), chx3 TO hchx3% SYS "EnableWindow", hchx3%, 1 SYS "GetDlgItem", hdlg%(1), chx4 TO hchx4% SYS "EnableWindow", hchx4%, 1 SYS "GetDlgItem", hdlg%(1), chx5 TO hchx5% SYS "EnableWindow", hchx5%, 1 WHEN chx2: SYS "IsDlgButtonChecked", hdlg%(1), chx2 TO collate% IF collate% THEN SYS "SendDlgItemMessage", hdlg%(1), ico3, STM_SETIMAGE, 0, hCollate% ELSE SYS "SendDlgItemMessage", hdlg%(1), ico3, STM_SETIMAGE, 0, hCopies% ENDIF WHEN cmb4: SYS "GetDlgItemText", hdlg%(0), cmb4, Text%, 255 SYS "SetDlgItemText", hdlg%(0), stc11, Text% WHEN edt3: SYS "GetDlgItemInt", hdlg%(1), edt3, 0, 0 TO copies% SYS "EnableWindow", hchx2%, -(copies%>1) ENDCASE UNTIL hdlg% = 0 PROCcleanup END

DEF PROCcleanup PropSh% += 0  : IF PropSh%   PROC_closepropsheet(PropSh%)  : PropSh% = 0 hCollate% += 0 : IF hCollate% SYS "DeleteObject", hCollate% : hCollate% = 0 hCopies% += 0 : IF hCopies%  SYS "DeleteObject", hCopies%  : hCopies% = 0 ENDPROC code