mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2020 lines
46 KiB
2020 lines
46 KiB
/***************************************************************************/
|
|
/********************* Sample Dialog Procedures **************************/
|
|
/***************************************************************************/
|
|
|
|
#include "cui.h"
|
|
#include "dialogs.h"
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include "..\detect\detect.h"
|
|
|
|
|
|
#define iszBMax 11
|
|
#define INT_MAX 32767 /* maximum (signed) int value */
|
|
#define cbSymBuf 1024
|
|
#define cbNameMax 52
|
|
|
|
|
|
LPSTR _sz = NULL;
|
|
|
|
#define FSingleByteCharSz(sz) ((BOOL)(((_sz = (sz)) != NULL) \
|
|
&& AnsiNext((LPSTR)(_sz)) == _sz + 1))
|
|
|
|
int FAR PASCAL LibMain(HANDLE, WORD, WORD, LPSTR);
|
|
int FAR PASCAL WEP (int);
|
|
LPSTR FAR PASCAL SzLastChar(LPSTR);
|
|
LPSTR FAR PASCAL SzDlgEvent(WORD);
|
|
int FAR PASCAL AsciiToInt(LPSTR);
|
|
LPSTR FAR PASCAL IntToAscii(int, LPSTR);
|
|
#if 0
|
|
typedef struct {
|
|
unsigned iType;
|
|
unsigned iMajor;
|
|
unsigned iMinor;
|
|
unsigned iRev;
|
|
unsigned fEnhance;
|
|
} LAN_DETECT;
|
|
|
|
int FAR PASCAL GetNetConfiguration(
|
|
LAN_DETECT _far *Detect
|
|
)
|
|
{
|
|
return(GetInstalledNet(&Detect->iType, &Detect->iMajor,
|
|
&Detect->iMinor, &Detect->iRev, &Detect->fEnhance));
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
** Purpose:
|
|
** CheckBox Dialog procedure for templates with one to ten checkbox
|
|
** controls.
|
|
**
|
|
** Controls Recognized:
|
|
** Checkbox - IDC_B1 to IDC_B10 (sequential)
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "CheckItemsIn" - list of "ON" and "OFF" string items for setting
|
|
** the intial state of the checkbox controls, evaluated in
|
|
** sequence ("ON" for checked, "OFF" for unchecked). If there
|
|
** are more controls than items, extra controls are left unchecked.
|
|
** If there are fewer items than controls, extra items are ignored.
|
|
** "OptionsGreyed" - list of (one-based) indexes of checkboxes to be
|
|
** initialized as disabled. Indexes not in the list will be
|
|
** left enabled.
|
|
**
|
|
** Termination Symbols:
|
|
** "CheckItemsOut" - list of same format as "CheckItemsIn" representing
|
|
** state of checkbox controls upon return.
|
|
** "DLGEVENT" - one of the following, according to control event:
|
|
** event value
|
|
** ------- -------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FCheckDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
WORD idc, cb, i, cItems;
|
|
char szSymBuf[cbSymBuf];
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("CheckItemsIn");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("CheckItemsIn", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szSymBuf, "ON") == 0)
|
|
wCheck = 1;
|
|
CheckDlgButton(hdlg, idc++, wCheck);
|
|
}
|
|
|
|
cItems = UsGetListLength("OptionsGreyed");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
int iOpt;
|
|
|
|
cb = CbGetListItem("OptionsGreyed", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
iOpt = AsciiToInt((LPSTR)szSymBuf);
|
|
if (iOpt > 0
|
|
&& iOpt <= 10)
|
|
EnableWindow(GetDlgItem(hdlg, IDC_B0 + iOpt), 0);
|
|
else if (*szSymBuf != '\0')
|
|
Assert(fFalse);
|
|
}
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_B1:
|
|
case IDC_B2:
|
|
case IDC_B3:
|
|
case IDC_B4:
|
|
case IDC_B5:
|
|
case IDC_B6:
|
|
case IDC_B7:
|
|
case IDC_B8:
|
|
case IDC_B9:
|
|
case IDC_B10:
|
|
CheckDlgButton(hdlg, wParam,
|
|
(WORD)!IsDlgButtonChecked(hdlg, wParam));
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
FRemoveSymbol("CheckItemsOut");
|
|
for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++)
|
|
if (!FAddListItem("CheckItemsOut",
|
|
IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fFalse);
|
|
}
|
|
Assert((unsigned)(idc-IDC_B1+1) <= iszBMax);
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Custom Install Dialog procedure for templates with one to ten custom
|
|
** options each consisting of at least one checkbox with an optional
|
|
** sub-option pushbutton or status string. The dialog also supports
|
|
** an install path set button, display of the current install path, and
|
|
** display of the current disk space status.
|
|
**
|
|
** Controls Recognized:
|
|
** Checkbox - IDC_B1 to IDC_B10
|
|
** with optionaly assocated buttons or text:
|
|
** Pushbutton - IDC_SP1 to IDC_SP10
|
|
** Text - IDC_STATUS1 to IDC_STATUS10
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_P, IDC_X
|
|
** Text - IDC_TEXT1 through IDC_TEXT7
|
|
**
|
|
** Initialization Symbols:
|
|
** "CheckItemsState" - list of "ON" and "OFF" string items for setting
|
|
** the intial state of the checkbox controls, evaluated in
|
|
** sequence ("ON" for checked, "OFF" for unchecked). If there
|
|
** are more controls than items, extra controls are left unchecked.
|
|
** If there are fewer items than controls, extra items are ignored.
|
|
** "StatusItemsText" - list of strings to initialize status text items
|
|
** associated with checkboxes.
|
|
** "DriveStatusText" - list of seven strings to initialize drive status
|
|
** text items (IDC_TEXT1-7) in the following sequence:
|
|
** dst_drive, dst_space_need, dst_space_free,
|
|
** win_drive, win_space_need, win_space_free,
|
|
** dst_path
|
|
** If any of the "win_" items is an empty string, its label
|
|
** text will be made non-visible.
|
|
**
|
|
** Termination Symbols:
|
|
** "CheckItemsState" - state of checkbox items (same format as above).
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_P "PATH"
|
|
** IDC_X "EXIT"
|
|
** IDC_B1 to IDC_B10 "CHK1" to "CHK10"
|
|
** IDC_SP1 to IDC_SP10 "BTN1" to "BTN10"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FCustInstDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
char rgchChk[10];
|
|
char rgchBtn[10];
|
|
WORD idc;
|
|
WORD cItems;
|
|
WORD i, cb;
|
|
char szSymBuf[cbSymBuf];
|
|
LPSTR szEvent;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("CheckItemsState");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("CheckItemsState", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szSymBuf, "ON") == 0)
|
|
wCheck = 1;
|
|
CheckDlgButton(hdlg, idc++, wCheck);
|
|
}
|
|
|
|
cItems = UsGetListLength("StatusItemsText");
|
|
idc = IDC_STATUS1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("StatusItemsText", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SetDlgItemText(hdlg, idc++, szSymBuf);
|
|
}
|
|
|
|
cItems = UsGetListLength("DriveStatusText");
|
|
idc = IDC_TEXT1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("DriveStatusText", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SetDlgItemText(hdlg, idc++, szSymBuf);
|
|
if (i >= 4
|
|
&& i <= 6)
|
|
{
|
|
if (*szSymBuf == '\0')
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE);
|
|
else
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE);
|
|
}
|
|
}
|
|
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
default:
|
|
szEvent = (LPSTR)NULL;
|
|
break;
|
|
|
|
case IDC_B1:
|
|
case IDC_B2:
|
|
case IDC_B3:
|
|
case IDC_B4:
|
|
case IDC_B5:
|
|
case IDC_B6:
|
|
case IDC_B7:
|
|
case IDC_B8:
|
|
case IDC_B9:
|
|
case IDC_B10:
|
|
lstrcpy((LPSTR)rgchChk, "CHK");
|
|
IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3]));
|
|
szEvent = (LPSTR)rgchChk;
|
|
break;
|
|
|
|
case IDC_SP1:
|
|
case IDC_SP2:
|
|
case IDC_SP3:
|
|
case IDC_SP4:
|
|
case IDC_SP5:
|
|
case IDC_SP6:
|
|
case IDC_SP7:
|
|
case IDC_SP8:
|
|
case IDC_SP9:
|
|
case IDC_SP10:
|
|
lstrcpy((LPSTR)rgchBtn, "BTN");
|
|
IntToAscii((int)(wParam-IDC_SP1+1), (LPSTR)(&rgchBtn[3]));
|
|
szEvent = (LPSTR)rgchBtn;
|
|
break;
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
szEvent = SzDlgEvent(wParam);
|
|
Assert(szEvent != NULL);
|
|
break;
|
|
|
|
case IDC_P:
|
|
szEvent = "PATH";
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
}
|
|
|
|
if (szEvent == (LPSTR)NULL)
|
|
break;
|
|
|
|
FRemoveSymbol("CheckItemsState");
|
|
for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++)
|
|
if (!FAddListItem("CheckItemsState",
|
|
IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fFalse);
|
|
}
|
|
Assert((unsigned)(idc-IDC_B1+1) <= iszBMax);
|
|
|
|
if (szEvent != (LPSTR)NULL)
|
|
if (!FSetSymbolValue("DLGEVENT", szEvent))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Super-special...
|
|
** Custom Install Dialog procedure for templates with one to ten custom
|
|
** options each consisting of at least one checkbox with an optional
|
|
** sub-option pushbutton or status string. The dialog also supports
|
|
** an install path set button, display of the current install path, and
|
|
** display of the current disk space status.
|
|
**
|
|
** Controls Recognized:
|
|
** Checkbox - IDC_B1 to IDC_B10
|
|
** with optionaly assocated buttons or text:
|
|
** Pushbutton - IDC_SP1 to IDC_SP10
|
|
** Text - IDC_STATUS1 to IDC_STATUS10
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_P, IDC_X
|
|
** Text - IDC_TEXT1 through IDC_TEXT7
|
|
**
|
|
** Initialization Symbols:
|
|
** "CheckItemsState" - list of "ON" and "OFF" string items for setting
|
|
** the intial state of the checkbox controls, evaluated in
|
|
** sequence ("ON" for checked, "OFF" for unchecked). If there
|
|
** are more controls than items, extra controls are left unchecked.
|
|
** If there are fewer items than controls, extra items are ignored.
|
|
** "StatusItemsText" - list of strings to initialize status text items
|
|
** associated with checkboxes.
|
|
** "DriveStatusText" - list of seven strings to initialize drive status
|
|
** text items (IDC_TEXT1-7) in the following sequence:
|
|
** dst_drive, dst_space_need, dst_space_free,
|
|
** win_drive, win_space_need, win_space_free,
|
|
** dst_path
|
|
** If any of the "win_" items is an empty string, its label
|
|
** text will be made non-visible.
|
|
**
|
|
** Termination Symbols:
|
|
** "CheckItemsState" - state of checkbox items (same format as above).
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_P "PATH"
|
|
** IDC_X "EXIT"
|
|
** IDC_B1 to IDC_B10 "CHK1" to "CHK10"
|
|
** IDC_SP1 to IDC_SP10 "BTN1" to "BTN10"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FMyCustInstDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
char rgchChk[10];
|
|
char rgchBtn[10];
|
|
WORD idc;
|
|
WORD cItems;
|
|
WORD i, cb, cbLen;
|
|
static WORD wSelStart[10];
|
|
static WORD wSelEnd[10];
|
|
char szSymBuf[cbSymBuf];
|
|
char rgchText[cbFullPathMax + 1];
|
|
LPSTR szEvent;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
SendDlgItemMessage(hdlg, wParam, EM_SETSEL, 0, MAKELONG(256, 256));
|
|
SetFocus(GetDlgItem(hdlg, wParam));
|
|
return(fTrue);
|
|
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("CheckItemsState");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("CheckItemsState", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szSymBuf, "ON") == 0)
|
|
wCheck = 1;
|
|
CheckDlgButton(hdlg, idc++, wCheck);
|
|
}
|
|
|
|
cItems = UsGetListLength("StatusItemsText");
|
|
idc = IDC_STATUS1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("StatusItemsText", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SetDlgItemText(hdlg, idc++, szSymBuf);
|
|
}
|
|
|
|
cItems = UsGetListLength("DriveStatusText");
|
|
idc = IDC_TEXT1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("DriveStatusText", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SetDlgItemText(hdlg, idc++, szSymBuf);
|
|
if (i >= 4
|
|
&& i <= 6)
|
|
{
|
|
if (*szSymBuf == '\0')
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE);
|
|
else
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE);
|
|
}
|
|
}
|
|
|
|
cItems = UsGetListLength("EditTextIn");
|
|
idc = IDC_EDT1-1;
|
|
for ( i = 1; i <= cItems; ++i)
|
|
{
|
|
cb = CbGetListItem("EditTextIn", i, szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
SendDlgItemMessage(hdlg, idc+i, EM_LIMITTEXT, cbFullPathMax, 0L);
|
|
SetDlgItemText(hdlg, idc+i, (LPSTR)szSymBuf);
|
|
|
|
cbLen = lstrlen(szSymBuf);
|
|
cb = CbGetListItem("EditFocus", i, szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
|
|
if (lstrcmp(szSymBuf, "ALL") == 0)
|
|
{
|
|
wSelStart[i] = 0;
|
|
wSelEnd[i] = INT_MAX;
|
|
}
|
|
else if (lstrcmp(szSymBuf, "START") == 0)
|
|
{
|
|
wSelStart[i] = 0;
|
|
wSelEnd[i] = 0;
|
|
}
|
|
else /* default == END */
|
|
{
|
|
wSelStart[i] = (WORD)cbLen;
|
|
wSelEnd[i] = (WORD)cbLen;
|
|
}
|
|
}
|
|
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
default:
|
|
szEvent = (LPSTR)NULL;
|
|
break;
|
|
|
|
case IDC_B1:
|
|
case IDC_B2:
|
|
case IDC_B3:
|
|
case IDC_B4:
|
|
case IDC_B5:
|
|
case IDC_B6:
|
|
case IDC_B7:
|
|
case IDC_B8:
|
|
case IDC_B9:
|
|
case IDC_B10:
|
|
lstrcpy((LPSTR)rgchChk, "CHK");
|
|
IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3]));
|
|
szEvent = (LPSTR)rgchChk;
|
|
break;
|
|
|
|
case IDC_SP1:
|
|
case IDC_SP2:
|
|
case IDC_SP3:
|
|
case IDC_SP4:
|
|
case IDC_SP5:
|
|
case IDC_SP6:
|
|
case IDC_SP7:
|
|
case IDC_SP8:
|
|
case IDC_SP9:
|
|
case IDC_SP10:
|
|
lstrcpy((LPSTR)rgchBtn, "BTN");
|
|
IntToAscii((int)(wParam-IDC_SP1+1), (LPSTR)(&rgchBtn[3]));
|
|
szEvent = (LPSTR)rgchBtn;
|
|
break;
|
|
|
|
case IDC_TEXT1:
|
|
case IDC_TEXT2:
|
|
case IDC_TEXT3:
|
|
case IDC_TEXT4:
|
|
case IDC_TEXT5:
|
|
case IDC_TEXT6:
|
|
case IDC_TEXT7:
|
|
case IDC_TEXT8:
|
|
case IDC_TEXT9:
|
|
case IDC_TEXT10:
|
|
lstrcpy((LPSTR)rgchBtn, "TEXT");
|
|
IntToAscii((int)(wParam-IDC_TEXT1+1), (LPSTR)(&rgchBtn[3]));
|
|
szEvent = (LPSTR)rgchBtn;
|
|
break;
|
|
|
|
case IDC_EDT1:
|
|
case IDC_EDT2:
|
|
case IDC_EDT3:
|
|
case IDC_EDT4:
|
|
case IDC_EDT5:
|
|
case IDC_EDT6:
|
|
case IDC_EDT7:
|
|
case IDC_EDT8:
|
|
case IDC_EDT9:
|
|
case IDC_EDT10:
|
|
if (HIWORD(lParam) == EN_SETFOCUS)
|
|
SendDlgItemMessage(hdlg, wParam, EM_SETSEL, 0,
|
|
MAKELONG(wSelStart[wParam-IDC_EDT1+1], wSelEnd[wParam-IDC_EDT1+1]));
|
|
else if (HIWORD(lParam) == EN_KILLFOCUS)
|
|
{
|
|
LONG l = SendDlgItemMessage(hdlg, wParam, EM_GETSEL, 0, 0L);
|
|
|
|
wSelStart[wParam-IDC_EDT1+1] = LOWORD(l);
|
|
wSelEnd[wParam-IDC_EDT1+1] = HIWORD(l);
|
|
}
|
|
break;
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
szEvent = SzDlgEvent(wParam);
|
|
Assert(szEvent != NULL);
|
|
break;
|
|
|
|
case IDC_P:
|
|
szEvent = "PATH";
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
}
|
|
|
|
if (szEvent == (LPSTR)NULL)
|
|
break;
|
|
|
|
FRemoveSymbol("CheckItemsState");
|
|
for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++)
|
|
if (!FAddListItem("CheckItemsState",
|
|
IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fFalse);
|
|
}
|
|
Assert((unsigned)(idc-IDC_B1+1) <= iszBMax);
|
|
|
|
if (szEvent != (LPSTR)NULL)
|
|
if (!FSetSymbolValue("DLGEVENT", szEvent))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
for (idc = IDC_EDT1; GetDlgItem(hdlg, idc); idc++)
|
|
{
|
|
SendDlgItemMessage(hdlg, idc, (WORD)WM_GETTEXT,
|
|
cbFullPathMax + 1, (LONG)((LPSTR)rgchText));
|
|
if (!FAddListItem("EditTextOut", rgchText))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Edit Dialog procedure for templates with one Edit control.
|
|
** (Limits the input string length to cbFullPathMax characters.)
|
|
**
|
|
** Controls Recognized:
|
|
** Edit - IDC_EDIT
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "EditTextIn" - initial text for IDC_EDIT edit control.
|
|
** "EditFocus" - position of intial focus for text string:
|
|
** "END" (default), "ALL", or "START"
|
|
**
|
|
** Termination Symbols:
|
|
** "EditTextOut" - text in the IDC_EDIT edit control upon termination.
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FEditDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
static WORD wSelStart = 0;
|
|
static WORD wSelEnd = 0;
|
|
char rgchText[cbFullPathMax + 1];
|
|
WORD cbLen;
|
|
WORD cb;
|
|
char szSymBuf[cbFullPathMax + 1];
|
|
|
|
switch (wMsg)
|
|
{
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case WM_INITDIALOG:
|
|
cb = CbGetSymbolValue("EditTextIn", szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbFullPathMax, 0L);
|
|
SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)szSymBuf);
|
|
|
|
cbLen = lstrlen(szSymBuf);
|
|
cb = CbGetSymbolValue("EditFocus", szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
|
|
if (lstrcmp(szSymBuf, "ALL") == 0)
|
|
{
|
|
wSelStart = 0;
|
|
wSelEnd = INT_MAX;
|
|
}
|
|
else if (lstrcmp(szSymBuf, "START") == 0)
|
|
{
|
|
wSelStart = 0;
|
|
wSelEnd = 0;
|
|
}
|
|
else /* default == END */
|
|
{
|
|
wSelStart = (WORD)cbLen;
|
|
wSelEnd = (WORD)cbLen;
|
|
}
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256));
|
|
SetFocus(GetDlgItem(hdlg, IDC_EDIT));
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_EDIT:
|
|
if (HIWORD(lParam) == EN_SETFOCUS)
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0,
|
|
MAKELONG(wSelStart, wSelEnd));
|
|
else if (HIWORD(lParam) == EN_KILLFOCUS)
|
|
{
|
|
LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L);
|
|
|
|
wSelStart = LOWORD(l);
|
|
wSelEnd = HIWORD(l);
|
|
}
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT,
|
|
cbFullPathMax + 1, (LONG)((LPSTR)rgchText));
|
|
if (!FSetSymbolValue("EditTextOut", rgchText))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Super special Edit Dialog procedure for templates with one Edit control.
|
|
** (Limits the input string length to cbFullPathMax characters.)
|
|
**
|
|
** Controls Recognized:
|
|
** Edit - IDC_EDIT
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "EditTextIn" - initial text for IDC_EDIT edit control.
|
|
** "EditFocus" - position of intial focus for text string:
|
|
** "END" (default), "ALL", or "START"
|
|
**
|
|
** Termination Symbols:
|
|
** "EditTextOut" - text in the IDC_EDIT edit control upon termination.
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FMyEditDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
static WORD wSelStart = 0;
|
|
static WORD wSelEnd = 0;
|
|
char rgchText[cbFullPathMax + 1];
|
|
WORD cbLen;
|
|
WORD cb;
|
|
WORD cItems, idc, i;
|
|
char rgchChk[10];
|
|
char szSymBuf[cbFullPathMax + 1];
|
|
LPSTR szEvent;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("InnerChkItemsState");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("InnerChkItemsState", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szSymBuf, "ON") == 0)
|
|
wCheck = 1;
|
|
CheckDlgButton(hdlg, idc++, wCheck);
|
|
}
|
|
|
|
cb = CbGetSymbolValue("EditTextIn", szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbFullPathMax, 0L);
|
|
SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)szSymBuf);
|
|
|
|
cbLen = lstrlen(szSymBuf);
|
|
cb = CbGetSymbolValue("EditFocus", szSymBuf, cbFullPathMax + 1);
|
|
Assert(cb < cbFullPathMax + 1);
|
|
|
|
if (lstrcmp(szSymBuf, "ALL") == 0)
|
|
{
|
|
wSelStart = 0;
|
|
wSelEnd = INT_MAX;
|
|
}
|
|
else if (lstrcmp(szSymBuf, "START") == 0)
|
|
{
|
|
wSelStart = 0;
|
|
wSelEnd = 0;
|
|
}
|
|
else /* default == END */
|
|
{
|
|
wSelStart = (WORD)cbLen;
|
|
wSelEnd = (WORD)cbLen;
|
|
}
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256));
|
|
SetFocus(GetDlgItem(hdlg, IDC_EDIT));
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_EDIT:
|
|
if (HIWORD(lParam) == EN_SETFOCUS)
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0,
|
|
MAKELONG(wSelStart, wSelEnd));
|
|
else if (HIWORD(lParam) == EN_KILLFOCUS)
|
|
{
|
|
LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L);
|
|
|
|
wSelStart = LOWORD(l);
|
|
wSelEnd = HIWORD(l);
|
|
}
|
|
break;
|
|
|
|
case IDC_B1:
|
|
case IDC_B2:
|
|
case IDC_B3:
|
|
case IDC_B4:
|
|
case IDC_B5:
|
|
case IDC_B6:
|
|
case IDC_B7:
|
|
case IDC_B8:
|
|
case IDC_B9:
|
|
case IDC_B10:
|
|
lstrcpy((LPSTR)rgchChk, "CHK");
|
|
IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3]));
|
|
szEvent = (LPSTR)rgchChk;
|
|
|
|
FRemoveSymbol("InnerChkItemsState");
|
|
for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++)
|
|
if (!FAddListItem("InnerChkItemsState",
|
|
IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fFalse);
|
|
}
|
|
Assert((unsigned)(idc-IDC_B1+1) <= iszBMax);
|
|
|
|
if (szEvent != (LPSTR)NULL)
|
|
if (!FSetSymbolValue("DLGEVENT", szEvent))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT,
|
|
cbFullPathMax + 1, (LONG)((LPSTR)rgchText));
|
|
if (!FSetSymbolValue("EditTextOut", rgchText))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Help Dialog procedure.
|
|
**
|
|
** Controls Recognized:
|
|
** Pushbutton - IDC_X.
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** none. (Handles IDC_X and IDCANCEL events by calling FCloseHelp.)
|
|
**
|
|
** Note:
|
|
** This dialog proc is for Help dialogs ONLY (szHelpProc$ parameter
|
|
** of UIStartDlg) and CANNOT be used as the szDlgProc$ parameter
|
|
** of the UIStartDlg MSSetup script function.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FHelpDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_ACTIVATEAPP:
|
|
/* Help dlg should not be on the dlg stack
|
|
** and should never get this message.
|
|
*/
|
|
Assert(fFalse);
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
if (wParam != IDC_X
|
|
&& wParam != IDCANCEL)
|
|
break;
|
|
FCloseHelp();
|
|
return(fTrue);
|
|
|
|
}
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Information Dialog procedure.
|
|
**
|
|
** Controls Recognized:
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** "DLGEVENT" - one of the following, according to control event:
|
|
** event value
|
|
** ------- -------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FInfoDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Information Dialog procedure, without "Exit" button.
|
|
**
|
|
** Controls Recognized:
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FInfo0DlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDCANCEL:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Single Choice Listbox Dialog procedure for templates with exactly one
|
|
** listbox control.
|
|
**
|
|
** Controls Recognized:
|
|
** Listbox - IDC_LIST1
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "ListItemsIn" - list of strings to put in the listbox.
|
|
** "ListItemsOut" - simple string (not a list) representing an
|
|
** initial selection in "ListItemsIn".
|
|
**
|
|
** Termination Symbols:
|
|
** "ListItemsOut" - selected list item string.
|
|
** "DLGEVENT" - one of the following, according to control event:
|
|
** event value
|
|
** ------- -------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FListDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
char szListIn[cbSymBuf];
|
|
char szListOut[cbSymBuf];
|
|
WORD iItem;
|
|
WORD cb, i;
|
|
WORD cItems;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("ListItemsIn");
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_ADDSTRING, 0,
|
|
(LONG)(LPSTR)szListIn);
|
|
}
|
|
|
|
cb = CbGetSymbolValue("ListItemsOut", szListOut, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (cb == 0)
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETCURSEL, (WORD)-1, 0L);
|
|
else
|
|
{
|
|
for (i = 1, iItem = 0; i <= cItems; ++i, ++iItem)
|
|
{
|
|
cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szListOut, szListIn) == 0)
|
|
{
|
|
SendDlgItemMessage(hdlg,IDC_LIST1,LB_SETCURSEL,iItem,0L);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Note: Depends on number of lines in list box.
|
|
*/
|
|
if (iItem < 4)
|
|
iItem = 0;
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETTOPINDEX, iItem, 0L);
|
|
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_LIST1:
|
|
if (HIWORD(lParam) != LBN_DBLCLK)
|
|
break;
|
|
wParam = IDC_C;
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
if ((iItem = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCURSEL,
|
|
0, 0L)) == LB_ERR
|
|
|| (cb = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1,
|
|
LB_GETTEXTLEN, iItem, 0L)) == LB_ERR)
|
|
*szListOut = '\0';
|
|
else
|
|
{
|
|
Assert(cb <= cbSymBuf);
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETTEXT, iItem,
|
|
(LONG)(LPSTR)szListOut);
|
|
}
|
|
if (!FSetSymbolValue("ListItemsOut", szListOut))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Modeless Dialog procedure.
|
|
**
|
|
** Controls Recognized:
|
|
** none.
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** none.
|
|
**
|
|
** Note:
|
|
** This dialog procedure is REQUIRED with use of any Billboard
|
|
** MSSetup script functions.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FModelessDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_CLOSE:
|
|
case WM_COMMAND:
|
|
Assert(fFalse);
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Multiple Choice Listbox Dialog procedure for templates with
|
|
** exactly one listbox control.
|
|
**
|
|
** Controls Recognized:
|
|
** Listbox - IDC_LIST1
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_L, IDC_S, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "ListItemsIn" - list of strings to put in the listbox.
|
|
** "ListItemsOut" - list of strings representing initial
|
|
** selections in "ListItemsIn".
|
|
**
|
|
** Termination Symbols:
|
|
** "ListItemsOut" - list of items selected (if any).
|
|
** "DLGEVENT" - one of the following, according to control event:
|
|
** event value
|
|
** ------- -------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
** Pushbuttons IDC_L and IDC_S are for "clear all" and "select all"
|
|
** respectively.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FMultiDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
WORD i, j, nCount;
|
|
char szListIn[cbSymBuf];
|
|
char szListOut[cbSymBuf];
|
|
WORD iItem, iItemTop;
|
|
WORD cb;
|
|
WORD cItemsIn, cItemsOut;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
cItemsIn = UsGetListLength("ListItemsIn");
|
|
nCount = 0;
|
|
for (i = 1; i <= cItemsIn; ++i)
|
|
{
|
|
cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_ADDSTRING, 0,
|
|
(LONG)(LPSTR)szListIn);
|
|
nCount++;
|
|
}
|
|
Assert(nCount == (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT,
|
|
0, 0L));
|
|
|
|
cItemsOut = UsGetListLength("ListItemsOut");
|
|
for (i = 1, iItemTop = 0; i <= cItemsOut; ++i, ++iItemTop)
|
|
{
|
|
cb = CbGetListItem("ListItemsOut", i, szListOut, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
for (j = 1, iItem = 0; j <= cItemsIn; ++j, ++iItem)
|
|
{
|
|
cb = CbGetListItem("ListItemsIn", j, szListIn, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (lstrcmp(szListOut, szListIn) == 0)
|
|
{
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, 1,
|
|
MAKELONG(iItem, 0));
|
|
if (iItemTop == 0
|
|
|| (WORD)iItem < iItemTop)
|
|
iItemTop = (WORD)iItem;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Note: Depends on number of lines in list box.
|
|
*/
|
|
if (iItemTop < 4)
|
|
iItemTop = 0;
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETTOPINDEX, iItemTop, 0L);
|
|
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_S:
|
|
case IDC_L:
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, (wParam == IDC_S),
|
|
-1L);
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
/* Note: Could be faster to use LB_GETSELITEMS here.
|
|
*/
|
|
nCount = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT, 0,
|
|
0L);
|
|
|
|
FRemoveSymbol("ListItemsOut");
|
|
for (i = 0; i < nCount; i++)
|
|
{
|
|
if (SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETSEL, (WORD)i, 0L))
|
|
{
|
|
SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETTEXT, (WORD)i,
|
|
(LONG)(LPSTR)szListOut);
|
|
if (!FAddListItem("ListItemsOut", szListOut))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
}
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Quit Dialog procedure.
|
|
**
|
|
** Controls Recognized:
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FQuitDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
return(fTrue);
|
|
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Radio Button Group Dialog procedure for templates with one group
|
|
** of one to ten radio button controls.
|
|
**
|
|
** Controls Recognized:
|
|
** Radio - IDC_B1 to IDC_B10 (sequential)
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "RadioDefault" - index (one-based) of radio button to be
|
|
** initialized as selected (default is "1").
|
|
** "OptionsGreyed" - list of (one-based) indexes of radio buttons
|
|
** to be initialized as disabled. Indexes not in the list will
|
|
** be left enabled.
|
|
**
|
|
** Termination Symbols:
|
|
** "ButtonChecked" - index of currently selected radio button.
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
** STF_ACTIVATEAPP "REACTIVATE"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FRadioDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
char rgchNum[10];
|
|
int iButtonChecked;
|
|
char szSymBuf[cbSymBuf];
|
|
WORD i, cb, cItems, idc;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case STF_ACTIVATEAPP:
|
|
if (!FSetSymbolValue("DLGEVENT", "REACTIVATE"))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
return(fTrue);
|
|
|
|
case WM_INITDIALOG:
|
|
cb = CbGetSymbolValue("RadioDefault", szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
if (*szSymBuf != '\0')
|
|
{
|
|
iButtonChecked = AsciiToInt((LPSTR)szSymBuf);
|
|
if (iButtonChecked < 1)
|
|
iButtonChecked = 0;
|
|
if (iButtonChecked > 10)
|
|
iButtonChecked = 10;
|
|
}
|
|
else
|
|
iButtonChecked = 1;
|
|
|
|
if (iButtonChecked != 0)
|
|
SendDlgItemMessage(hdlg, IDC_B0 + iButtonChecked, BM_SETCHECK,1,0L);
|
|
|
|
cItems = UsGetListLength("OptionsGreyed");
|
|
idc = IDC_B1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
int iOpt;
|
|
|
|
cb = CbGetListItem("OptionsGreyed", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
iOpt = AsciiToInt((LPSTR)szSymBuf);
|
|
if (iOpt > 0
|
|
&& iOpt <= 10
|
|
&& iOpt != iButtonChecked)
|
|
EnableWindow(GetDlgItem(hdlg, IDC_B0 + iOpt), 0);
|
|
else if (*szSymBuf != '\0')
|
|
Assert(fFalse);
|
|
}
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B1:
|
|
case IDC_B2:
|
|
case IDC_B3:
|
|
case IDC_B4:
|
|
case IDC_B5:
|
|
case IDC_B6:
|
|
case IDC_B7:
|
|
case IDC_B8:
|
|
case IDC_B9:
|
|
case IDC_B10:
|
|
CheckRadioButton(hdlg, IDC_B1, IDC_B10, wParam);
|
|
if (HIWORD(lParam) != BN_DOUBLECLICKED)
|
|
break;
|
|
wParam = IDC_C;
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
iButtonChecked = 0;
|
|
for (i = 1; i <= 10; i++)
|
|
if (SendDlgItemMessage(hdlg, IDC_B0 + i, BM_GETCHECK, 0, 0L))
|
|
{
|
|
iButtonChecked = i;
|
|
break;
|
|
}
|
|
|
|
IntToAscii((int)iButtonChecked, (LPSTR)rgchNum);
|
|
if (!FSetSymbolValue("ButtonChecked", rgchNum))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Get Name and Organization Dialog procedure for templates
|
|
** with two Edit controls.
|
|
** (Limits the input string length to cbNameMax characters.)
|
|
**
|
|
** Controls Recognized:
|
|
** Edit - IDC_EDIT, IDC_EDIT2
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** none.
|
|
**
|
|
** Termination Symbols:
|
|
** "NameOut" - text in the IDC_EDIT edit control upon termination.
|
|
** "OrgOut" - text in the IDC_EDIT2 edit control upon termination.
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FNameOrgDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
static WORD wSelStart1 = 0;
|
|
static WORD wSelEnd1 = 0;
|
|
static WORD wSelStart2 = 0;
|
|
static WORD wSelEnd2 = 0;
|
|
char rgchText[cbNameMax + 1];
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbNameMax, 0L);
|
|
SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)"");
|
|
|
|
SendDlgItemMessage(hdlg, IDC_EDIT2, EM_LIMITTEXT, cbNameMax, 0L);
|
|
SetDlgItemText(hdlg, IDC_EDIT2, (LPSTR)"");
|
|
|
|
wSelStart1 = wSelEnd1 = 0;
|
|
wSelStart2 = wSelEnd2 = 0;
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256));
|
|
SetFocus(GetDlgItem(hdlg, IDC_EDIT));
|
|
return(fTrue);
|
|
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam)
|
|
{
|
|
case IDC_EDIT:
|
|
if (HIWORD(lParam) == EN_SETFOCUS)
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0,
|
|
MAKELONG(wSelStart1, wSelEnd1));
|
|
else if (HIWORD(lParam) == EN_KILLFOCUS)
|
|
{
|
|
LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L);
|
|
|
|
wSelStart1 = LOWORD(l);
|
|
wSelEnd1 = HIWORD(l);
|
|
}
|
|
break;
|
|
|
|
case IDC_EDIT2:
|
|
if (HIWORD(lParam) == EN_SETFOCUS)
|
|
SendDlgItemMessage(hdlg, IDC_EDIT2, EM_SETSEL, 0,
|
|
MAKELONG(wSelStart2, wSelEnd2));
|
|
else if (HIWORD(lParam) == EN_KILLFOCUS)
|
|
{
|
|
LONG l = SendDlgItemMessage(hdlg, IDC_EDIT2, EM_GETSEL, 0, 0L);
|
|
|
|
wSelStart2 = LOWORD(l);
|
|
wSelEnd2 = HIWORD(l);
|
|
}
|
|
break;
|
|
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT,
|
|
cbNameMax + 1, (LONG)((LPSTR)rgchText));
|
|
if (!FSetSymbolValue("NameOut", rgchText))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
SendDlgItemMessage(hdlg, IDC_EDIT2, (WORD)WM_GETTEXT,
|
|
cbNameMax + 1, (LONG)((LPSTR)rgchText));
|
|
if (!FSetSymbolValue("OrgOut", rgchText))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Confirm Info Dialog procedure for templates with one to
|
|
** static text controls.
|
|
**
|
|
** Controls Recognized:
|
|
** Text - IDC_TEXT1 to IDC_TEXT10 (sequential)
|
|
** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X
|
|
**
|
|
** Initialization Symbols:
|
|
** "ConfirmTextIn" - list of up to ten string items to initialize
|
|
** static text items (IDC_TEXT1-10).
|
|
**
|
|
** Termination Symbols:
|
|
** "DLGEVENT" - one of the following, depending on event:
|
|
** event value
|
|
** ---------- ----------
|
|
** IDC_B "BACK"
|
|
** IDC_C "CONTINUE"
|
|
** IDC_X "EXIT"
|
|
** IDCANCEL "CANCEL"
|
|
**
|
|
** Note:
|
|
** Pushbutton IDC_H will open the related Help dialog, if any.
|
|
**
|
|
*****************************************************************************/
|
|
BOOL FAR PASCAL FConfirmDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
WORD idc;
|
|
WORD cItems;
|
|
WORD i, cb;
|
|
char szSymBuf[cbSymBuf];
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
cItems = UsGetListLength("ConfirmTextIn");
|
|
idc = IDC_TEXT1;
|
|
for (i = 1; i <= cItems; ++i)
|
|
{
|
|
WORD wCheck = 0;
|
|
|
|
cb = CbGetListItem("ConfirmTextIn", i, szSymBuf, cbSymBuf);
|
|
Assert(cb < cbSymBuf);
|
|
SetDlgItemText(hdlg, idc++, szSymBuf);
|
|
if (i >= 4
|
|
&& i <= 6)
|
|
{
|
|
if (*szSymBuf == '\0')
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE);
|
|
else
|
|
ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE);
|
|
}
|
|
}
|
|
return(fTrue);
|
|
|
|
case STF_REINITDIALOG:
|
|
case STF_ACTIVATEAPP:
|
|
return(fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_H:
|
|
HdlgShowHelp();
|
|
return(fTrue);
|
|
|
|
case IDC_B:
|
|
case IDC_C:
|
|
case IDC_X:
|
|
if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam)))
|
|
{
|
|
DestroyWindow(GetParent(hdlg));
|
|
return(fTrue);
|
|
}
|
|
ReactivateSetupScript();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Initialization routine for DLL.
|
|
** Arguments:
|
|
** hInst: handle to instance of App that required this DLL.
|
|
** wDataSeg: number of words in DLL's data segment.
|
|
** wHeapSize: number of bytes in DLL's heap.
|
|
** lpszCmdLine: command line for App that required this DLL.
|
|
** Returns:
|
|
** 1 always
|
|
*****************************************************************************/
|
|
int FAR PASCAL LibMain(HANDLE hInst, WORD wDataSeg, WORD wHeapSize,
|
|
LPSTR lpszCmdLine)
|
|
{
|
|
if (wHeapSize > 0)
|
|
UnlockData(0);
|
|
|
|
return(1);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Windows Exit Procedure.
|
|
** Arguments:
|
|
** nParam: standard WEP param (ignored).
|
|
** Returns:
|
|
** 1 always.
|
|
*****************************************************************************/
|
|
int FAR PASCAL WEP (int nParam)
|
|
{
|
|
return(1);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Finds the last character in a string.
|
|
** Arguments:
|
|
** sz: non-NULL zero terminated string to search.
|
|
** Returns:
|
|
** NULL for an empty string.
|
|
** non-Null string pointer to the last valid character in sz.
|
|
*****************************************************************************/
|
|
LPSTR FAR PASCAL SzLastChar(LPSTR sz)
|
|
{
|
|
LPSTR szCur = (LPSTR)NULL;
|
|
LPSTR szNext = sz;
|
|
|
|
while (*szNext != '\0')
|
|
szNext = AnsiNext((szCur = szNext));
|
|
|
|
return(szCur);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Gets the string values for the following WM_COMMAND events:
|
|
** IDC_B, IDC_C, IDC_X, and IDCANCEL.
|
|
** Arguments:
|
|
** wParam: event parameter value
|
|
** Returns:
|
|
** Pointer to string value constant, NULL if unknown event.
|
|
*****************************************************************************/
|
|
LPSTR FAR PASCAL SzDlgEvent(WORD wParam)
|
|
{
|
|
LPSTR szEvent;
|
|
|
|
switch(wParam)
|
|
{
|
|
case IDC_B:
|
|
szEvent = "BACK";
|
|
break;
|
|
case IDC_C:
|
|
szEvent = "CONTINUE";
|
|
break;
|
|
case IDC_X:
|
|
szEvent = "EXIT";
|
|
break;
|
|
default:
|
|
szEvent = NULL;
|
|
break;
|
|
}
|
|
|
|
return(szEvent);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Converts an ASCII string representing a positive value
|
|
** into an integer.
|
|
** Arguments:
|
|
** sz: non-NULL zero terminated string to convert.
|
|
** Returns:
|
|
** Integer represented by the string.
|
|
*****************************************************************************/
|
|
int FAR PASCAL AsciiToInt(LPSTR sz)
|
|
{
|
|
int i = 0;
|
|
|
|
while (*sz == ' ' || *sz == '\t')
|
|
sz++;
|
|
|
|
while (isdigit(*sz))
|
|
i = (i * 10) + *sz++ - '0';
|
|
|
|
return(i);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Converts an positive integer (< 100) into a string
|
|
** representing its value.
|
|
** Arguments:
|
|
** i: integer to convert (positive and < 100).
|
|
** sz: buffer to hold converted string (at least 3 bytes).
|
|
** Returns:
|
|
** sz.
|
|
*****************************************************************************/
|
|
LPSTR FAR PASCAL IntToAscii(int i, LPSTR sz)
|
|
{
|
|
LPSTR szSav = sz;
|
|
|
|
if (i >= 100
|
|
|| i < 0)
|
|
Assert(fFalse);
|
|
|
|
if (i >= 10)
|
|
{
|
|
*sz++ = (char)('0' + (i / 10));
|
|
i %= 10;
|
|
}
|
|
*sz++ = (char)('0' + i);
|
|
*sz = '\0';
|
|
|
|
return(szSav);
|
|
}
|