windows-nt/Source/XPSP1/NT/shell/cpls/main/mousewhl.c
2020-09-26 16:20:57 +08:00

407 lines
11 KiB
C

/*++
Copyright (c) 1994-1998, Microsoft Corporation All rights reserved.
Module Name:
mousewhl.c
Abstract:
This module contains the routines for the Mouse Wheel Property Sheet
page.
Revision History:
--*/
//
// Include Files.
//
#include "main.h"
#include "util.h"
#include "rc.h"
#include "mousehlp.h"
#ifndef ARRAYSIZE
#define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
#endif
//
// Constant Declarations.
//
#define SCROLL_DEFAULT 3
#define MIN_SCROLL_LINES 1
#define MAX_SCROLL_LINES 100
#define MAX_CHARS_FOR_SCROLL_LINES 3
#ifndef UINT_MAX
#define UINT_MAX ((UINT)-1)
#endif
//
// Typedef Declarations.
//
//
// Dialog Data.
//
typedef struct tag_MouseGenStr
{
UINT nOrigScrollLines; //If this is WHEEL_PAGESCROLL, then we scroll one Page at a time.
HWND hDlg;
} MOUSEWHLSTR, *PMOUSEWHLSTR, *LPMOUSEWHLSTR;
//
// Context Help Ids.
//
const DWORD aMouseWheelHelpIds[] =
{
IDC_GROUPBOX_1, IDH_COMM_GROUPBOX,
IDRAD_SCROLL_LINES, IDH_MOUSE_WHEEL_SCROLLING,
IDRAD_SCROLL_PAGE, IDH_MOUSE_WHEEL_SCROLLING,
IDC_SPIN_SCROLL_LINES, IDH_MOUSE_WHEEL_SCROLLING,
IDT_SCROLL_FEATURE_TXT, IDH_MOUSE_WHEEL_SCROLLING,
IDE_BUDDY_SCROLL_LINES, IDH_MOUSE_WHEEL_SCROLLING,
0,0
};
////////////////////////////////////////////////////////////////////////////
//
// EnableMouseWheelDlgControls
//
////////////////////////////////////////////////////////////////////////////
void EnableMouseWheelDlgControls(HWND hDlg, BOOL bEnable)
{
static const UINT rgidCtl[] = {
IDE_BUDDY_SCROLL_LINES,
IDC_SPIN_SCROLL_LINES,
};
int i;
for (i = 0; i < ARRAYSIZE(rgidCtl); i++)
{
HWND hwnd = GetDlgItem(hDlg, rgidCtl[i]);
if (NULL != hwnd)
{
EnableWindow(hwnd, bEnable);
}
}
}
////////////////////////////////////////////////////////////////////////////
//
// SetScrollWheelLines
//
////////////////////////////////////////////////////////////////////////////
void SetScrollWheelLines(HWND hDlg, BOOL bSaveSettings)
{
UINT uNumLines = SCROLL_DEFAULT;
UINT uiSaveFlag = (bSaveSettings) ? SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE : FALSE;
if (IsDlgButtonChecked(hDlg, IDRAD_SCROLL_LINES))
{
//Scrolling n Lines at a time
BOOL fTranslated = FALSE; // numeric conversion successful
// Retrieve number of scroll-lines from edit control.
uNumLines = GetDlgItemInt(hDlg, IDE_BUDDY_SCROLL_LINES,
&fTranslated, FALSE);
if (!fTranslated)
{
uNumLines = SCROLL_DEFAULT;
}
}
else
{
//Scrolling a page at a time
uNumLines = WHEEL_PAGESCROLL;
}
SystemParametersInfo( SPI_SETWHEELSCROLLLINES,
uNumLines,
NULL,
uiSaveFlag);
}
////////////////////////////////////////////////////////////////////////////
//
// DestroyMouseWheelDlg
//
////////////////////////////////////////////////////////////////////////////
void DestroyMouseWheelDlg(
PMOUSEWHLSTR pMstr)
{
HWND hDlg = NULL;
if( pMstr )
{
hDlg = pMstr->hDlg;
LocalFree( (HGLOBAL)pMstr );
SetWindowLongPtr( hDlg, DWLP_USER, 0 );
}
}
////////////////////////////////////////////////////////////////////////////
//
// InitMouseWheelDlg
//
////////////////////////////////////////////////////////////////////////////
void InitMouseWheelDlg(
HWND hDlg)
{
PMOUSEWHLSTR pMstr = NULL;
HWND hWndBuddy = NULL;
UINT nScrollLines = SCROLL_DEFAULT;
pMstr = (PMOUSEWHLSTR)LocalAlloc(LPTR, sizeof(MOUSEWHLSTR));
if (pMstr == NULL)
{
return;
}
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pMstr);
pMstr->hDlg = hDlg;
//////////////////////
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &nScrollLines, 0);
if (nScrollLines < MIN_SCROLL_LINES)
{
nScrollLines = SCROLL_DEFAULT;
}
pMstr->nOrigScrollLines = nScrollLines;
//Set the buddy window
hWndBuddy = GetDlgItem (hDlg, IDE_BUDDY_SCROLL_LINES);
SendDlgItemMessage (hDlg, IDC_SPIN_SCROLL_LINES, UDM_SETBUDDY,
(WPARAM)hWndBuddy, 0L);
//Set the range. The maximum range is UINT_MAX for the scroll-lines feature
//but the up-down control can only accept a max value of UD_MAXVAL. Therefore,
//the scroll-lines feature will only have a setting of UINT_MAX when user
//explicitly specifies to scroll one page at a time.
SendDlgItemMessage (hDlg, IDC_SPIN_SCROLL_LINES, UDM_SETRANGE, 0L,
MAKELONG(MAX_SCROLL_LINES, MIN_SCROLL_LINES));
//Initialize appropriate scroll-line controls depending on value of
//scroll-lines setting.
if (nScrollLines > MAX_SCROLL_LINES)
{
EnableMouseWheelDlgControls(hDlg, FALSE);
SetDlgItemInt (hDlg, IDE_BUDDY_SCROLL_LINES, SCROLL_DEFAULT, FALSE);
CheckRadioButton (hDlg, IDRAD_SCROLL_LINES, IDRAD_SCROLL_PAGE, IDRAD_SCROLL_PAGE);
}
else
{
//Display current value in edit control
SetDlgItemInt (hDlg, IDE_BUDDY_SCROLL_LINES, nScrollLines, FALSE);
//Check scroll-lines or scroll-page button
CheckRadioButton (hDlg, IDRAD_SCROLL_LINES, IDRAD_SCROLL_PAGE, IDRAD_SCROLL_LINES);
}
Edit_LimitText (GetDlgItem (hDlg, IDE_BUDDY_SCROLL_LINES),
MAX_CHARS_FOR_SCROLL_LINES);
}
////////////////////////////////////////////////////////////////////////////
//
// MouseWheelDlg
//
////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK MouseWheelDlg(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PMOUSEWHLSTR pMstr = NULL;
BOOL bRet = FALSE;
pMstr = (PMOUSEWHLSTR)GetWindowLongPtr(hDlg, DWLP_USER);
switch (message)
{
case ( WM_INITDIALOG ) :
{
InitMouseWheelDlg(hDlg);
break;
}
case ( WM_DESTROY ) :
{
DestroyMouseWheelDlg(pMstr);
break;
}
case WM_VSCROLL:
{
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
break;
}
case ( WM_COMMAND ) :
{
switch (LOWORD(wParam))
{
case IDRAD_SCROLL_LINES:
case IDRAD_SCROLL_PAGE :
{
UINT code = HIWORD(wParam);
if (code == BN_CLICKED)
{
EnableMouseWheelDlgControls(hDlg, IsDlgButtonChecked(hDlg, IDRAD_SCROLL_LINES) );
// Set the property
SetScrollWheelLines(hDlg, FALSE);
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
}
break;
}
case IDE_BUDDY_SCROLL_LINES:
{
UINT code = HIWORD(wParam);
if (code == EN_UPDATE)
{
BOOL fTranslated = FALSE; // numeric conversion successful
// Retrieve number of scroll-lines from edit control.
UINT uNumLines = GetDlgItemInt(hDlg, IDE_BUDDY_SCROLL_LINES,
&fTranslated, FALSE);
if (fTranslated) // valid number converted from text
{
if (uNumLines >= MIN_SCROLL_LINES &&
uNumLines <= MAX_SCROLL_LINES)
{ // spin-control range
if (uNumLines != pMstr->nOrigScrollLines) // different value
{
// Set the property
SetScrollWheelLines(hDlg, FALSE);
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
}
}
else // value out of range
{
fTranslated = FALSE; // discard value
}
}
if (!fTranslated && // invalid (non-numeric) data
// or out of range numeric value
pMstr) //and the Window has been initialized.
{
SetDlgItemInt (hDlg, IDE_BUDDY_SCROLL_LINES,
pMstr->nOrigScrollLines, FALSE); // unsigned
//MessageBeep (0xFFFFFFFF); // chastise user
}
}
}
}//switch
break;
} //WM_COMMAND
case ( WM_NOTIFY ) :
{
ASSERT (lParam);
switch (((NMHDR *)lParam)->code)
{
case ( PSN_APPLY ) :
{
SetScrollWheelLines(hDlg, TRUE);
break;
}
case ( PSN_RESET ) :
{
//
// Restore the original
//
SystemParametersInfo( SPI_SETWHEELSCROLLLINES,
pMstr->nOrigScrollLines,
NULL,
FALSE);
break;
}
default :
{
return (FALSE);
}
}
break;
}
case ( WM_HELP ) : // F1
{
WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle,
HELP_FILE,
HELP_WM_HELP,
(DWORD_PTR)(LPTSTR)aMouseWheelHelpIds );
break;
}
case ( WM_CONTEXTMENU ) : // right mouse click
{
WinHelp( (HWND)wParam,
HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR)(LPTSTR)aMouseWheelHelpIds );
break;
}
case ( WM_DISPLAYCHANGE ) :
case ( WM_WININICHANGE ) :
case ( WM_SYSCOLORCHANGE ) :
{
SHPropagateMessage(hDlg, message, wParam, lParam, TRUE);
return TRUE;
}
default :
{
return (FALSE);
}
}
return (TRUE);
}