/*++ 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); }