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.
505 lines
15 KiB
505 lines
15 KiB
// **************************************************************************
|
|
// Filterkeys dialogs
|
|
// Process the filterkeys dialogs
|
|
// **************************************************************************
|
|
|
|
|
|
#include "Access.h"
|
|
|
|
#define SWAP(A, B) ( A ^= B, B ^= A, A ^= B )
|
|
|
|
// Prototypes
|
|
BOOL WINAPI BKDlg (HWND, UINT, WPARAM, LPARAM);
|
|
BOOL WINAPI RKDlg (HWND, UINT, WPARAM, LPARAM);
|
|
BOOL WINAPI NotificationDlg (HWND, UINT, WPARAM, LPARAM);
|
|
|
|
// Times are in milliseconds
|
|
#define DELAYSIZE 5
|
|
UINT uDelayTable[] = { 300, 700, 1000, 1500, 2000 };
|
|
|
|
// Times are in milliseconds
|
|
#define RATESIZE 6
|
|
UINT uRateTable[] = { 300, 500, 700, 1000, 1500, 2000 };
|
|
|
|
// Times are in milliseconds
|
|
#define BOUNCESIZE 5
|
|
UINT uBounceTable[] = { 500, 700, 1000, 1500, 2000 };
|
|
|
|
// Times are in milliseconds
|
|
#define ACCEPTSIZE 7
|
|
UINT uAcceptTable[] = { 0, 300, 500, 700, 1000, 1400, 2000 };
|
|
|
|
|
|
// *************************************************************************
|
|
// Process the scrolling messages from our trackbars.
|
|
// GENERIC CODE - called for any TrackBar handler.
|
|
// Passed in the hwnd, wParam, hwndScroll
|
|
// we can do all handling and return the new trackbar value without
|
|
// knowing what control it is.
|
|
// Returns -1 to mean don't do anything
|
|
// *************************************************************************
|
|
int HandleScroll (HWND hwnd, WPARAM wParam, HWND hwndScroll) {
|
|
int nCurSliderPos = (int) SendMessage(
|
|
hwndScroll, TBM_GETPOS, 0, 0);
|
|
int nMaxVal = (int) SendMessage(
|
|
hwndScroll, TBM_GETRANGEMAX, 0, 0);
|
|
int nMinVal = (int) SendMessage(
|
|
hwndScroll, TBM_GETRANGEMIN, 0, 0);
|
|
|
|
switch (LOWORD(wParam)) {
|
|
case TB_LINEUP:
|
|
case TB_LINEDOWN:
|
|
case TB_THUMBTRACK:
|
|
case TB_THUMBPOSITION:
|
|
case SB_ENDSCROLL:
|
|
break;
|
|
|
|
case TB_PAGEUP:
|
|
if (hwndScroll == GetDlgItem(hwnd, IDC_RK_DELAYRATE) ||
|
|
hwndScroll == GetDlgItem(hwnd, IDC_BK_BOUNCERATE))
|
|
nCurSliderPos--;
|
|
break;
|
|
|
|
case TB_PAGEDOWN:
|
|
if (hwndScroll == GetDlgItem(hwnd, IDC_RK_DELAYRATE) ||
|
|
hwndScroll == GetDlgItem(hwnd, IDC_BK_BOUNCERATE))
|
|
nCurSliderPos++;
|
|
break;
|
|
|
|
case TB_BOTTOM:
|
|
nCurSliderPos = nMaxVal;
|
|
break;
|
|
|
|
case TB_TOP:
|
|
nCurSliderPos = nMinVal;
|
|
break;
|
|
}
|
|
|
|
if (nCurSliderPos < nMinVal)
|
|
{
|
|
nCurSliderPos = nMinVal;
|
|
}
|
|
|
|
if (nCurSliderPos > nMaxVal)
|
|
{
|
|
nCurSliderPos = nMaxVal;
|
|
}
|
|
|
|
SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM) hwnd, 0);
|
|
return(nCurSliderPos);
|
|
}
|
|
|
|
void TestFilterKeys (BOOL fTurnTestOn) {
|
|
|
|
DWORD dwFlagsOrig = g_fk.dwFlags;
|
|
if ((dwFlagsOrig & FKF_FILTERKEYSON) != 0) {
|
|
// If the user already has FilterKyes on, just leave it on.
|
|
return;
|
|
}
|
|
|
|
if (fTurnTestOn) {
|
|
g_fk.dwFlags &= ~FKF_INDICATOR;
|
|
g_fk.dwFlags |= FKF_FILTERKEYSON;
|
|
} else {
|
|
// Restore the user's original settings. i.e. - do nothing
|
|
}
|
|
|
|
AccessSystemParametersInfo(SPI_SETFILTERKEYS, sizeof(g_fk), &g_fk, 0);
|
|
g_fk.dwFlags = dwFlagsOrig;
|
|
}
|
|
|
|
|
|
// ****************************************************************************
|
|
// Main filter keys dialog handler
|
|
// ****************************************************************************
|
|
|
|
BOOL WINAPI FilterKeyDlg (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
FILTERKEYS fk;
|
|
BOOL fProcessed = TRUE;
|
|
|
|
switch (uMsg) {
|
|
case WM_INITDIALOG:
|
|
// Setup hotkey
|
|
CheckDlgButton(hwnd, IDC_FK_HOTKEY, (g_fk.dwFlags & FKF_HOTKEYACTIVE) ? TRUE : FALSE);
|
|
|
|
// Setup the radio buttons for SLOW vs BOUNCE keys
|
|
if (0 != g_fk.iBounceMSec) {
|
|
// Bounce keys enabeled
|
|
CheckRadioButton(hwnd, IDC_FK_BOUNCE, IDC_FK_REPEAT, IDC_FK_BOUNCE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_BK_SETTINGS), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_SETTINGS), FALSE);
|
|
}
|
|
else
|
|
{
|
|
// Slow key enabled
|
|
CheckRadioButton(hwnd, IDC_FK_BOUNCE, IDC_FK_REPEAT, IDC_FK_REPEAT);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_BK_SETTINGS), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_SETTINGS), TRUE);
|
|
}
|
|
|
|
CheckDlgButton(hwnd, IDC_FK_SOUND, (g_fk.dwFlags & FKF_CLICKON) ? TRUE : FALSE);
|
|
CheckDlgButton(hwnd, IDC_FK_STATUS, (g_fk.dwFlags & FKF_INDICATOR) ? TRUE : FALSE);
|
|
|
|
#ifdef HIDE_STATUS
|
|
if (g_fWinNT)
|
|
{
|
|
ShowWindow(GetDlgItem(hwnd, IDC_FK_STATUS), SW_HIDE);
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case WM_HELP:
|
|
WinHelp(((LPHELPINFO) lParam)->hItemHandle, __TEXT("access.hlp"), HELP_WM_HELP, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, __TEXT("access.hlp"), HELP_CONTEXTMENU, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case IDC_FK_HOTKEY:
|
|
g_fk.dwFlags ^= FKF_HOTKEYACTIVE;
|
|
break;
|
|
|
|
case IDC_FK_REPEAT:
|
|
g_fk.iBounceMSec = 0;
|
|
|
|
if (g_fk.iDelayMSec == 0)
|
|
{
|
|
g_fk.iDelayMSec = g_nLastRepeatDelay;
|
|
g_fk.iRepeatMSec = g_nLastRepeatRate;
|
|
g_fk.iWaitMSec = g_nLastWait;
|
|
}
|
|
|
|
CheckRadioButton(hwnd, IDC_FK_REPEAT, IDC_FK_BOUNCE, IDC_FK_REPEAT);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_BK_SETTINGS), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_SETTINGS), TRUE);
|
|
break;
|
|
|
|
case IDC_FK_BOUNCE:
|
|
g_fk.iDelayMSec = 0;
|
|
g_fk.iRepeatMSec = 0;
|
|
g_fk.iWaitMSec = 0;
|
|
|
|
if (g_fk.iBounceMSec == 0)
|
|
{
|
|
g_fk.iBounceMSec = g_dwLastBounceKeySetting;
|
|
}
|
|
|
|
CheckRadioButton(hwnd, IDC_FK_REPEAT, IDC_FK_BOUNCE, IDC_FK_BOUNCE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_BK_SETTINGS), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_SETTINGS), FALSE);
|
|
break;
|
|
|
|
// Settings dialogs
|
|
case IDC_RK_SETTINGS: // This is RepeatKeys
|
|
fk = g_fk;
|
|
if (DialogBox(g_hinst, MAKEINTRESOURCE(IDD_ADVCHARREPEAT), hwnd, RKDlg) == IDCANCEL) {
|
|
g_fk = fk;
|
|
}
|
|
break;
|
|
|
|
case IDC_BK_SETTINGS: // This is BounceKeys
|
|
fk = g_fk;
|
|
if (DialogBox(g_hinst, MAKEINTRESOURCE(IDD_ADVKEYBOUNCE), hwnd, BKDlg) == IDCANCEL) {
|
|
g_fk = fk;
|
|
}
|
|
break;
|
|
|
|
case IDC_FK_SOUND:
|
|
g_fk.dwFlags ^= FKF_CLICKON;
|
|
break;
|
|
|
|
case IDC_FK_STATUS:
|
|
g_fk.dwFlags ^= FKF_INDICATOR;
|
|
break;
|
|
|
|
// The test edit box is a special control for us. When we get the
|
|
// focus we turn on the current filterkeys settings, when we
|
|
// leave the text box, we turn them back to what they were.
|
|
case IDC_FK_TESTBOX:
|
|
switch (HIWORD(wParam)) {
|
|
case EN_SETFOCUS: TestFilterKeys(TRUE); break;
|
|
case EN_KILLFOCUS: TestFilterKeys(FALSE); break;
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
if (g_dwLastBounceKeySetting == 0)
|
|
g_dwLastBounceKeySetting = uBounceTable[0];
|
|
EndDialog(hwnd, IDOK);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, IDCANCEL);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
fProcessed = FALSE; break;
|
|
}
|
|
return(fProcessed);
|
|
}
|
|
|
|
|
|
void PutNumInEdit (HWND hwndEdit, int nNum) {
|
|
TCHAR szBuf[10], szBuf2[10];
|
|
wsprintf(szBuf, __TEXT("%d.%d"), nNum / 1000, (nNum % 1000) / 100);
|
|
GetNumberFormat(LOCALE_USER_DEFAULT, 0, szBuf, NULL, szBuf2, 6);
|
|
SetWindowText(hwndEdit, szBuf2);
|
|
}
|
|
|
|
|
|
// **************************************************************************
|
|
// BKDlg
|
|
// Process the BounceKeys dialog.
|
|
// **************************************************************************
|
|
BOOL WINAPI BKDlg (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
int i;
|
|
BOOL fProcessed = TRUE;
|
|
|
|
switch (uMsg) {
|
|
case WM_INITDIALOG:
|
|
// Determine the bounce.
|
|
SendDlgItemMessage(hwnd, IDC_BK_BOUNCERATE, TBM_SETRANGE, TRUE, MAKELONG(1, BOUNCESIZE));
|
|
// Make sure its a valide value.
|
|
if (g_dwLastBounceKeySetting == 0)
|
|
g_dwLastBounceKeySetting = 500;
|
|
|
|
if (g_fk.iBounceMSec == 0)
|
|
g_fk.iBounceMSec = g_dwLastBounceKeySetting;
|
|
|
|
// Find the current value in our table
|
|
for (i = 0; i < BOUNCESIZE; i++) {
|
|
if (uBounceTable[i] >= g_fk.iBounceMSec) break;
|
|
}
|
|
|
|
// If invalid value, make it valid.
|
|
SendDlgItemMessage(hwnd, IDC_BK_BOUNCERATE, TBM_SETPOS, TRUE, i + 1);
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_BK_TIME), uBounceTable[i]);
|
|
break;
|
|
|
|
// Handle the track bars.
|
|
case WM_HSCROLL:
|
|
i = HandleScroll(hwnd, wParam, (HWND)lParam);
|
|
if (i == -1) return(TRUE);
|
|
g_fk.iBounceMSec = uBounceTable[--i];
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_BK_TIME), g_fk.iBounceMSec);
|
|
break;
|
|
|
|
case WM_HELP: // F1
|
|
WinHelp(((LPHELPINFO) lParam)->hItemHandle, __TEXT("access.hlp"), HELP_WM_HELP, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
WinHelp((HWND) wParam, __TEXT("access.hlp"), HELP_CONTEXTMENU, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
// The test edit box is a special control for us. When we get the
|
|
// focus we turn on the current filterkeys settings, when we
|
|
// leave the text box, we turn them back to what they were.
|
|
case IDC_BK_TESTBOX:
|
|
switch (HIWORD(wParam)) {
|
|
case EN_SETFOCUS: TestFilterKeys(TRUE); break;
|
|
case EN_KILLFOCUS: TestFilterKeys(FALSE); break;
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
// Save the last known valid setting.
|
|
g_dwLastBounceKeySetting = g_fk.iBounceMSec;
|
|
EndDialog(hwnd, IDOK);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, IDCANCEL);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default: fProcessed = FALSE; break;
|
|
}
|
|
return(fProcessed);
|
|
}
|
|
|
|
|
|
// **************************************************************************
|
|
// RKDlg
|
|
// Process the RepeatKeys dialog.
|
|
// **************************************************************************
|
|
|
|
BOOL WINAPI RKDlg (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
int i;
|
|
BOOL fProcessed = TRUE;
|
|
static s_fRepeating = TRUE;
|
|
static DWORD s_nLastRepeatDelayOld;
|
|
static DWORD s_nLastRepeatRateOld;
|
|
static DWORD s_nLastWaitOld;
|
|
|
|
switch(uMsg) {
|
|
case WM_INITDIALOG:
|
|
s_nLastRepeatDelayOld = g_nLastRepeatDelay;
|
|
s_nLastRepeatRateOld = g_nLastRepeatRate;
|
|
s_nLastWaitOld = g_nLastWait;
|
|
|
|
s_fRepeating = (0 != g_fk.iDelayMSec);
|
|
CheckRadioButton(hwnd, IDC_RK_NOREPEAT, IDC_RK_REPEAT,
|
|
s_fRepeating ? IDC_RK_REPEAT : IDC_RK_NOREPEAT);
|
|
|
|
if (!s_fRepeating) {
|
|
// Set FilterKey values to LastRepeat values
|
|
// so the sliders will still get initialized correctly
|
|
g_fk.iDelayMSec = g_nLastRepeatDelay;
|
|
g_fk.iRepeatMSec = g_nLastRepeatRate;
|
|
}
|
|
|
|
// Initialize the Acceptance slider to last valid state
|
|
SendDlgItemMessage(hwnd, IDC_RK_ACCEPTRATE, TBM_SETRANGE, TRUE, MAKELONG(1, ACCEPTSIZE));
|
|
for (i = 0; i < ACCEPTSIZE; i++) {
|
|
if (uAcceptTable[i] >= g_fk.iWaitMSec) break;
|
|
}
|
|
|
|
SendDlgItemMessage(hwnd, IDC_RK_ACCEPTRATE, TBM_SETPOS, TRUE, i + 1);
|
|
if (i < 0) i = 0;
|
|
if (i >= ACCEPTSIZE) i = ACCEPTSIZE - 1;
|
|
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_WAITTIME), uAcceptTable[i]);
|
|
g_fk.iWaitMSec = uAcceptTable[i];
|
|
|
|
// Initialize the Delay slider
|
|
SendDlgItemMessage(hwnd, IDC_RK_DELAYRATE, TBM_SETRANGE, TRUE, MAKELONG(1, DELAYSIZE));
|
|
for (i = 0; i < DELAYSIZE; i++) {
|
|
if (uDelayTable[i] >= g_fk.iDelayMSec) break;
|
|
}
|
|
|
|
SendDlgItemMessage(hwnd, IDC_RK_DELAYRATE, TBM_SETPOS, TRUE, i + 1);
|
|
if (i < 0) i = 0;
|
|
if (i >= DELAYSIZE) i = DELAYSIZE - 1;
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_DELAYTIME), uDelayTable[i]);
|
|
g_fk.iDelayMSec = uDelayTable[i];
|
|
|
|
// Initialize the Repeat Rate Slider Note -1 is set via the checkbox.
|
|
SendDlgItemMessage(hwnd, IDC_RK_REPEATRATE, TBM_SETRANGE, TRUE, MAKELONG(1, RATESIZE));
|
|
for (i = 0; i < RATESIZE; i++) {
|
|
if (uRateTable[i] >= g_fk.iRepeatMSec) break;
|
|
}
|
|
|
|
SendDlgItemMessage(hwnd, IDC_RK_REPEATRATE, TBM_SETPOS, TRUE, i + 1);
|
|
if (i < 0) i = 0;
|
|
if (i >= RATESIZE) i = RATESIZE -1;
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_REPEATTIME), uRateTable[i]);
|
|
g_fk.iRepeatMSec = uRateTable[i];
|
|
|
|
// Now cleanup from initialization. Disable controls
|
|
// that usable... Swap back any params needed
|
|
if (!s_fRepeating) {
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_REPEATRATE), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_DELAYRATE), FALSE);
|
|
|
|
// If we're not repeating, now set the value to 0
|
|
// which indicates max repeat rate.
|
|
g_fk.iDelayMSec = 0;
|
|
g_fk.iRepeatMSec = 0;
|
|
}
|
|
break;
|
|
|
|
case WM_HSCROLL:
|
|
switch (GetWindowLong((HWND) lParam, GWL_ID)) {
|
|
case IDC_RK_ACCEPTRATE:
|
|
i = HandleScroll(hwnd, wParam, (HWND)lParam);
|
|
if (i == -1) return TRUE;
|
|
g_fk.iWaitMSec = uAcceptTable[--i];
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_WAITTIME), g_fk.iWaitMSec);
|
|
break;
|
|
|
|
case IDC_RK_DELAYRATE:
|
|
i = HandleScroll(hwnd, wParam, (HWND)lParam);
|
|
if (i == -1) return TRUE;
|
|
g_fk.iDelayMSec = uDelayTable[--i];
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_DELAYTIME), g_fk.iDelayMSec);
|
|
g_nLastRepeatDelay = g_fk.iDelayMSec;
|
|
break;
|
|
|
|
case IDC_RK_REPEATRATE:
|
|
i = HandleScroll(hwnd, wParam, (HWND)lParam);
|
|
if (i == -1) return TRUE;
|
|
g_fk.iRepeatMSec = uRateTable[--i];
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_REPEATTIME), g_fk.iRepeatMSec);
|
|
g_nLastRepeatRate = g_fk.iRepeatMSec;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP: // F1
|
|
WinHelp(((LPHELPINFO) lParam)->hItemHandle, __TEXT("access.hlp"), HELP_WM_HELP, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
WinHelp((HWND) wParam, __TEXT("access.hlp"), HELP_CONTEXTMENU, (DWORD) (LPSTR) g_aIds);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
// Turn on repeat keys - We're disabling via CPL rather than any flags in the call
|
|
case IDC_RK_REPEAT:
|
|
if (!s_fRepeating) {
|
|
g_fk.iDelayMSec = g_nLastRepeatDelay;
|
|
g_fk.iRepeatMSec = g_nLastRepeatRate;
|
|
}
|
|
|
|
// Now that we have valid parameters, continue with setting the sliders.
|
|
s_fRepeating = TRUE;
|
|
CheckRadioButton(hwnd, IDC_RK_NOREPEAT, IDC_RK_REPEAT, IDC_RK_REPEAT);
|
|
if (g_fk.iRepeatMSec == 0) {
|
|
g_fk.iRepeatMSec = 300;
|
|
SendDlgItemMessage(hwnd, IDC_RK_REPEATRATE, TBM_SETPOS, TRUE, 1);
|
|
PutNumInEdit(GetDlgItem(hwnd, IDC_RK_REPEATTIME), g_fk.iRepeatMSec);
|
|
}
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_REPEATRATE), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_DELAYRATE), TRUE);
|
|
break;
|
|
|
|
// Turn OFF repeat keys
|
|
case IDC_RK_NOREPEAT:
|
|
s_fRepeating = FALSE;
|
|
CheckRadioButton(hwnd, IDC_RK_NOREPEAT, IDC_RK_REPEAT, IDC_RK_NOREPEAT);
|
|
g_fk.iDelayMSec = 0;
|
|
g_fk.iRepeatMSec = 0;
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_DELAYRATE), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_RK_REPEATRATE), FALSE);
|
|
break;
|
|
|
|
// Process the test box - turnon filterkeys while inside it.
|
|
case IDC_RK_TESTBOX:
|
|
switch (HIWORD(wParam)) {
|
|
case EN_SETFOCUS: TestFilterKeys(TRUE); break;
|
|
case EN_KILLFOCUS: TestFilterKeys(FALSE); break;
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
// Save off repeating values to registry
|
|
EndDialog(hwnd, IDOK);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
g_nLastRepeatDelay = s_nLastRepeatDelayOld;
|
|
g_nLastRepeatRate = s_nLastRepeatRateOld;
|
|
g_nLastWait = s_nLastWaitOld;
|
|
|
|
EndDialog(hwnd, IDCANCEL);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default: fProcessed = FALSE; break;
|
|
}
|
|
return(fProcessed);
|
|
}
|
|
|
|
|
|
///////////////////////////////// End of File /////////////////////////////////
|