3 * Copyright (C) 2004, 2007 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * PROJECT: ReactOS Main Control Panel
22 * FILE: lib/cpl/main/mouse.c
23 * PURPOSE: Mouse Control Panel
24 * PROGRAMMER: Eric Kohl
48 #define DEFAULT_DOUBLE_CLICK_SPEED 500
49 #define DEFAULT_CLICK_LOCK_TIME 2200
50 #define DEFAULT_MOUSE_SPEED 10
51 #define DEFAULT_MOUSE_ACCELERATION 1
52 #define DEFAULT_MOUSE_THRESHOLD1 6
53 #define DEFAULT_MOUSE_THRESHOLD2 10
54 #define MIN_DOUBLE_CLICK_SPEED 200
55 #define MAX_DOUBLE_CLICK_SPEED 900
56 #define DEFAULT_WHEEL_SCROLL_LINES 3
58 typedef struct _BUTTON_DATA
60 ULONG g_SwapMouseButtons
;
61 ULONG g_OrigSwapMouseButtons
;
62 ULONG g_DoubleClickSpeed
; // = DEFAULT_DOUBLE_CLICK_SPEED;
63 ULONG g_OrigDoubleClickSpeed
;
64 BOOL g_ClickLockEnabled
; // = 0;
65 DWORD g_ClickLockTime
; // = DEFAULT_CLICK_LOCK_TIME;
73 } BUTTON_DATA
, *PBUTTON_DATA
;
76 typedef struct _POINTER_DATA
83 } POINTER_DATA
, *PPOINTER_DATA
;
86 typedef struct _MOUSE_ACCEL
93 typedef struct _OPTION_DATA
96 ULONG ulOrigMouseSpeed
;
98 MOUSE_ACCEL MouseAccel
;
99 MOUSE_ACCEL OrigMouseAccel
;
101 BOOL bSnapToDefaultButton
;
102 BOOL bOrigSnapToDefaultButton
;
105 UINT uOrigMouseTrails
;
108 BOOL bOrigMouseVanish
;
111 BOOL bOrigMouseSonar
;
112 } OPTION_DATA
, *POPTION_DATA
;
115 typedef struct _WHEEL_DATA
117 UINT uWheelScrollLines
;
118 } WHEEL_DATA
, *PWHEEL_DATA
;
121 typedef struct _CURSOR_DATA
124 UINT uDefaultCursorId
;
127 TCHAR szCursorName
[MAX_PATH
];
128 TCHAR szCursorPath
[MAX_PATH
];
129 } CURSOR_DATA
, *PCURSOR_DATA
;
132 CURSOR_DATA g_CursorData
[] =
133 {{IDS_ARROW
, 100/*OCR_NORMAL*/, _T("Arrow"), 0, _T(""), _T("")},
134 {IDS_HELP
, 112/*OCR_HELP*/, _T("Help"), 0, _T(""), _T("")},
135 {IDS_APPSTARTING
, 111/*OCR_APPSTARTING*/, _T("AppStarting"), 0, _T(""), _T("")},
136 {IDS_WAIT
, 102/*OCR_WAIT*/, _T("Wait"), 0, _T(""), _T("")},
137 {IDS_CROSSHAIR
, 103/*OCR_CROSS*/, _T("Crosshair"), 0, _T(""), _T("")},
138 {IDS_IBEAM
, 101/*OCR_IBEAM*/, _T("IBeam"), 0, _T(""), _T("")},
139 {IDS_NWPEN
, 113/*OCR_NWPEN*/, _T("NWPen"), 0, _T(""), _T("")},
140 {IDS_NO
, 110/*OCR_NO*/, _T("No"), 0, _T(""), _T("")},
141 {IDS_SIZENS
, 108/*OCR_SIZENS*/, _T("SizeNS"), 0, _T(""), _T("")},
142 {IDS_SIZEWE
, 107/*OCR_SIZEWE*/, _T("SizeWE"), 0, _T(""), _T("")},
143 {IDS_SIZENWSE
, 105/*OCR_SIZENWSE*/, _T("SizeNWSE"), 0, _T(""), _T("")},
144 {IDS_SIZENESW
, 106/*OCR_SIZENESW*/, _T("SizeNESW"), 0, _T(""), _T("")},
145 {IDS_SIZEALL
, 109/*OCR_SIZEALL*/, _T("SizeAll"), 0, _T(""), _T("")},
146 {IDS_UPARROW
, 104/*OCR_UP*/, _T("UpArrow"), 0, _T(""), _T("")},
147 {IDS_HAND
, 114/*OCR_HAND*/, _T("Hand"), 0, _T(""), _T("")}};
152 DebugMsg(LPTSTR fmt
, ...)
154 TCHAR szBuffer
[2048];
157 va_start(marker
, fmt
);
158 _vstprintf(szBuffer
, fmt
, marker
);
161 MessageBox(NULL
, szBuffer
, _T("Debug message"), MB_OK
);
166 /* Property page dialog callback */
167 static INT_PTR CALLBACK
168 MouseHardwareProc(IN HWND hwndDlg
,
174 Guids
[0] = GUID_DEVCLASS_MOUSE
;
176 UNREFERENCED_PARAMETER(lParam
);
177 UNREFERENCED_PARAMETER(wParam
);
182 /* create the hardware page */
183 DeviceCreateHardwarePageEx(hwndDlg
,
185 sizeof(Guids
) / sizeof(Guids
[0]),
194 static INT_PTR CALLBACK
195 ClickLockProc(IN HWND hwndDlg
,
204 PBUTTON_DATA pButtonData
;
206 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
211 pButtonData
= (PBUTTON_DATA
)lParam
;
212 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
214 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
215 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
216 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
217 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
219 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_LOOK_KEY
),
220 IMAGE_ICON
, 16, 16, 0);
221 SendMessage(hwndDlg
, WM_SETICON
, ICON_SMALL
, (LPARAM
)hIcon
);
225 if (LOWORD(wParam
) == IDOK
)
227 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
228 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
229 EndDialog(hwndDlg
, TRUE
);
230 if (hIcon
) DestroyIcon(hIcon
);
232 else if (LOWORD(wParam
) == IDCANCEL
)
234 EndDialog(hwndDlg
, FALSE
);
235 if (hIcon
) DestroyIcon(hIcon
);
244 static INT_PTR CALLBACK
245 ButtonProc(IN HWND hwndDlg
,
254 PBUTTON_DATA pButtonData
;
256 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
261 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
262 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
264 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
265 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
266 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
267 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
269 /* Click lock time */
270 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
271 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
273 /* Load mouse button icons */
274 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
275 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
277 /* Load folder icons */
278 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
279 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
281 if (pButtonData
->g_SwapMouseButtons
)
283 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
284 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
288 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
291 if (pButtonData
->g_ClickLockEnabled
)
293 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
294 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
298 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
299 EnableWindow(hDlgCtrl
, FALSE
);
302 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
303 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
304 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
307 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
308 pButtonData
->bClicked
= TRUE
;
312 DestroyIcon(pButtonData
->hButtonLeft
);
313 DestroyIcon(pButtonData
->hButtonRight
);
314 DestroyIcon(pButtonData
->hIcon1
);
315 DestroyIcon(pButtonData
->hIcon2
);
316 HeapFree(GetProcessHeap(), 0, pButtonData
);
320 switch(LOWORD(wParam
))
322 case IDC_SWAP_MOUSE_BUTTONS
:
323 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
324 if (lResult
== BST_CHECKED
)
326 pButtonData
->g_SwapMouseButtons
= FALSE
;
327 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
328 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
330 else if (lResult
== BST_UNCHECKED
)
332 pButtonData
->g_SwapMouseButtons
= TRUE
;
333 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
334 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
336 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
339 case IDC_CHECK_CLICK_LOCK
:
340 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
341 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
342 if (lResult
== BST_CHECKED
)
344 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
345 pButtonData
->g_ClickLockEnabled
= FALSE
;
346 EnableWindow(hDlgCtrl
, FALSE
);
348 else if (lResult
== BST_UNCHECKED
)
350 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
351 pButtonData
->g_ClickLockEnabled
= TRUE
;
352 EnableWindow(hDlgCtrl
, TRUE
);
354 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
357 case IDC_BUTTON_CLICK_LOCK
:
358 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
361 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
362 if (HIWORD(wParam
) == STN_DBLCLK
)
364 pButtonData
->bClicked
= !pButtonData
->bClicked
;
365 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
366 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
373 lppsn
= (LPPSHNOTIFY
) lParam
;
374 if (lppsn
->hdr
.code
== PSN_APPLY
)
376 if (pButtonData
->g_OrigSwapMouseButtons
!= pButtonData
->g_SwapMouseButtons
)
378 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
379 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
383 #if (WINVER >= 0x0500)
384 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
385 if (pButtonData
->g_ClickLockEnabled
)
386 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
389 else if (lppsn
->hdr
.code
== PSN_RESET
)
391 /* Reset swap mouse button setting */
392 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, 0);
394 /* Reset double click speed setting */
395 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, 0);
396 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
401 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
403 switch (LOWORD(wParam
))
412 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
413 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
414 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
415 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
416 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
420 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
421 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
422 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
423 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
435 CompressPath(LPTSTR lpShortPath
, LPTSTR lpPath
)
437 TCHAR szUserProfile
[MAX_PATH
];
438 TCHAR szSystemRoot
[MAX_PATH
];
439 TCHAR szProgramFiles
[MAX_PATH
];
442 DWORD dwProgramFiles
;
444 dwUserProfile
= GetEnvironmentVariable(_T("USERPROFILE"), szUserProfile
, MAX_PATH
);
445 dwSystemRoot
= GetEnvironmentVariable(_T("SystemRoot"), szSystemRoot
, MAX_PATH
);
446 dwProgramFiles
= GetEnvironmentVariable(_T("ProgramFiles"), szProgramFiles
, MAX_PATH
);
448 if (dwUserProfile
> 0 && _tcsncmp(lpPath
, szUserProfile
, dwUserProfile
) == 0)
450 _tcscpy(lpShortPath
, _T("%USERPROFILE%"));
451 _tcscat(lpShortPath
, &lpPath
[dwUserProfile
]);
453 else if (dwSystemRoot
> 0 && _tcsncmp(lpPath
, szSystemRoot
, dwSystemRoot
) == 0)
455 _tcscpy(lpShortPath
, _T("%SystemRoot%"));
456 _tcscat(lpShortPath
, &lpPath
[dwSystemRoot
]);
458 else if (dwProgramFiles
> 0 && _tcsncmp(lpPath
, szProgramFiles
, dwProgramFiles
) == 0)
460 _tcscpy(lpShortPath
, _T("%ProgramFiles%"));
461 _tcscat(lpShortPath
, &lpPath
[dwProgramFiles
]);
465 _tcscpy(lpShortPath
, lpPath
);
471 EnumerateCursorSchemes(HWND hwndDlg
)
475 TCHAR szValueName
[MAX_PATH
];
477 TCHAR szSystemScheme
[MAX_PATH
];
478 TCHAR szValueData
[2000];
479 TCHAR szTempData
[2000];
485 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
486 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
488 /* Read the users cursor schemes */
489 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors\\Schemes"),
490 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
491 if (lError
== ERROR_SUCCESS
)
493 for (dwIndex
= 0;; dwIndex
++)
495 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
496 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
497 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
498 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
499 if (lError
== ERROR_NO_MORE_ITEMS
)
502 ExpandEnvironmentStrings(szValueData
, szTempData
, 2000);
504 if (_tcslen(szTempData
) > 0)
506 LPTSTR lpCopy
, lpStart
;
508 /* Remove quotation marks */
509 if (szTempData
[0] == _T('"'))
511 lpStart
= szValueData
+ 1;
512 szTempData
[_tcslen(szTempData
) - 1] = 0;
516 lpStart
= szTempData
;
519 lpCopy
= _tcsdup(lpStart
);
521 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
522 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
526 RegCloseKey(hCursorKey
);
529 /* Read the system cursor schemes */
530 lError
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
531 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
532 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
533 if (lError
== ERROR_SUCCESS
)
535 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
537 for (dwIndex
= 0;; dwIndex
++)
539 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
540 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
541 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
542 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
543 if (lError
== ERROR_NO_MORE_ITEMS
)
546 if (_tcslen(szValueData
) > 0)
548 LPTSTR lpCopy
, lpStart
;
550 /* Remove quotation marks */
551 if (szValueData
[0] == _T('"'))
553 lpStart
= szValueData
+ 1;
554 szValueData
[_tcslen(szValueData
) - 1] = 0;
558 lpStart
= szValueData
;
561 lpCopy
= _tcsdup(lpStart
);
563 _tcscat(szValueName
, TEXT(" "));
564 _tcscat(szValueName
, szSystemScheme
);
566 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
567 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
571 RegCloseKey(hCursorKey
);
574 /* Add the "(none)" entry */
575 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
576 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
577 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
584 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
590 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
594 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
595 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
597 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
598 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
601 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
605 InvalidateRect(GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
), NULL
, FALSE
);
608 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
609 (LPARAM
)g_CursorData
[nSel
].hCursor
);
611 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), (g_CursorData
[nSel
].szCursorPath
[0] != 0));
616 DeleteUserCursorScheme(HWND hwndDlg
)
618 TCHAR szSchemeName
[MAX_PATH
];
620 TCHAR szRawText
[256];
628 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
629 nSel
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
633 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
635 LoadString(hApplet
, IDS_REMOVE_TITLE
, szTitle
, 128);
636 LoadString(hApplet
, IDS_REMOVE_TEXT
, szRawText
, 256);
638 _stprintf(szText
, szRawText
, szSchemeName
);
640 /* Confirm scheme removal */
641 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
644 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
647 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
653 lResult
= RegDeleteValue(hCuCursorKey
, szSchemeName
);
655 RegCloseKey(hCuCursorKey
);
658 if (lResult
== ERROR_SUCCESS
)
660 SendMessage(hDlgCtrl
, CB_DELETESTRING
, nSel
, 0);
661 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
664 return (lResult
== ERROR_SUCCESS
);
668 static INT_PTR CALLBACK
669 SaveSchemeProc(IN HWND hwndDlg
,
679 pSchemeName
= (LPTSTR
)lParam
;
680 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSchemeName
);
681 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_SETTEXT
,
682 0, (LPARAM
)pSchemeName
);
686 if (LOWORD(wParam
) == IDOK
)
688 pSchemeName
= (LPTSTR
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
689 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_GETTEXT
,
690 (WPARAM
)MAX_PATH
, (LPARAM
)pSchemeName
);
691 EndDialog(hwndDlg
, TRUE
);
693 else if (LOWORD(wParam
) == IDCANCEL
)
695 EndDialog(hwndDlg
, FALSE
);
705 SaveCursorScheme(HWND hwndDlg
)
707 TCHAR szSystemScheme
[MAX_PATH
];
708 TCHAR szSchemeName
[MAX_PATH
];
709 TCHAR szNewSchemeName
[MAX_PATH
];
710 TCHAR szTempPath
[MAX_PATH
];
714 INT index
, i
, nLength
;
718 LONG lError
= ERROR_SUCCESS
;
721 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
723 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
733 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szNewSchemeName
);
735 if (_tcsstr(szNewSchemeName
, szSystemScheme
))
737 szNewSchemeName
[_tcslen(szNewSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
741 /* Ask for a name for the new cursor scheme */
742 if (!DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
),
743 hwndDlg
, SaveSchemeProc
, (LPARAM
)szNewSchemeName
))
746 /* Check all non-system schemes for the new name */
747 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCOUNT
, 0, 0);
751 bSchemeExists
= FALSE
;
752 for (i
= 0; i
< nSel
; i
++)
754 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, i
, (LPARAM
)szSchemeName
);
755 if (_tcsstr(szSchemeName
, szSystemScheme
) == NULL
)
757 if (_tcscmp(szSchemeName
, szNewSchemeName
) == 0)
759 bSchemeExists
= TRUE
;
767 LoadString(hApplet
, IDS_OVERWRITE_TITLE
, szTitle
, 128);
768 LoadString(hApplet
, IDS_OVERWRITE_TEXT
, szText
, 256);
770 /* Confirm scheme overwrite */
771 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
775 /* Save the cursor scheme */
777 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
781 nLength
+= _tcslen(g_CursorData
[i
].szCursorPath
);
785 lpSchemeData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nLength
* sizeof(TCHAR
));
787 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
789 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
791 _tcscat(lpSchemeData
, _T(","));
792 _tcscat(lpSchemeData
, szTempPath
);
795 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
798 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
804 lError
= RegSetValueEx(hCuCursorKey
, szNewSchemeName
, 0,
805 REG_EXPAND_SZ
, (LPBYTE
)lpSchemeData
,
806 (_tcslen(lpSchemeData
) + 1) * sizeof(TCHAR
));
808 RegCloseKey(hCuCursorKey
);
811 /* Add the new scheme to the scheme list and select it */
812 if (lError
== ERROR_SUCCESS
)
814 LPTSTR copy
= _tcsdup(lpSchemeData
);
816 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szNewSchemeName
);
817 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETITEMDATA
, (WPARAM
)nSel
, (LPARAM
)copy
);
818 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
821 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
823 return (lError
== ERROR_SUCCESS
);
828 BrowseCursor(HWND hwndDlg
)
830 TCHAR szFileName
[MAX_PATH
];
831 TCHAR szFilter
[MAX_PATH
];
832 TCHAR szTitle
[MAX_PATH
];
836 LoadString(hApplet
, IDS_BROWSE_FILTER
, szFilter
, MAX_PATH
);
837 LoadString(hApplet
, IDS_BROWSE_TITLE
, szTitle
, MAX_PATH
);
839 memset(szFileName
, 0x0, sizeof(szFileName
));
840 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
843 MessageBox(hwndDlg
, _T("LB_ERR"), _T(""), MB_ICONERROR
);
847 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
848 ofn
.lStructSize
= sizeof(OPENFILENAME
);
849 ofn
.hwndOwner
= hwndDlg
;
850 ofn
.lpstrFilter
= szFilter
;
851 ofn
.nFilterIndex
= 1;
852 ofn
.lpstrFile
= szFileName
;
853 ofn
.nMaxFile
= MAX_PATH
;
854 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
855 ofn
.lpstrTitle
= szTitle
;
856 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
858 if (!GetOpenFileName(&ofn
))
861 /* Store the new cursor file path */
862 _tcsncpy(g_CursorData
[nSel
].szCursorPath
, szFileName
, MAX_PATH
);
869 LoadCursorScheme(LPTSTR lpName
, BOOL bSystem
)
873 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
875 if (g_CursorData
[i
].hCursor
!= NULL
)
877 DestroyCursor(g_CursorData
[i
].hCursor
);
878 g_CursorData
[i
].hCursor
= 0;
880 g_CursorData
[i
].szCursorPath
[0] = 0;
885 LPTSTR pStart
= lpName
;
886 LPTSTR pEnd
= pStart
;
892 pEnd
= _tcschr(pStart
, _T(','));
894 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
896 nLength
= _tcslen(pStart
);
898 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
899 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
901 pStart
= pStart
+ (nLength
+ 1);
907 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
909 if (g_CursorData
[i
].szCursorPath
[0] == 0)
910 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
912 LR_DEFAULTSIZE
| LR_SHARED
);
914 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
916 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
922 ReloadCurrentCursorScheme(VOID
)
926 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
928 if (g_CursorData
[i
].hCursor
!= NULL
)
929 DestroyCursor(g_CursorData
[i
].hCursor
);
931 if (g_CursorData
[i
].szCursorPath
[0] == 0)
932 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
934 LR_DEFAULTSIZE
| LR_SHARED
);
936 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
938 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
944 OnDrawItem(UINT idCtl
,
945 LPDRAWITEMSTRUCT lpdis
,
946 PPOINTER_DATA pPointerData
)
950 if (lpdis
->itemState
& ODS_SELECTED
)
954 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
955 SetBkColor(lpdis
->hDC
,
956 GetSysColor(COLOR_HIGHLIGHT
));
957 SetTextColor(lpdis
->hDC
,
958 GetSysColor(COLOR_HIGHLIGHTTEXT
));
964 (HBRUSH
)(COLOR_WINDOW
+ 1));
965 SetBkColor(lpdis
->hDC
,
966 GetSysColor(COLOR_WINDOW
));
967 SetTextColor(lpdis
->hDC
,
968 GetSysColor(COLOR_WINDOWTEXT
));
971 if (lpdis
->itemID
!= -1U)
973 CopyRect(&rc
, &lpdis
->rcItem
);
976 g_CursorData
[lpdis
->itemData
].szCursorName
,
979 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
981 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
984 lpdis
->rcItem
.right
- pPointerData
->cxCursor
- 4,
985 lpdis
->rcItem
.top
+ 2,
986 g_CursorData
[lpdis
->itemData
].hCursor
);
990 if (lpdis
->itemState
& ODS_FOCUS
)
992 CopyRect(&rc
, &lpdis
->rcItem
);
993 InflateRect(&rc
, -1, -1);
994 DrawFocusRect(lpdis
->hDC
, &rc
);
1000 LoadNewCursorScheme(HWND hwndDlg
)
1002 TCHAR buffer
[MAX_PATH
];
1003 TCHAR szSystemScheme
[MAX_PATH
];
1009 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1013 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)buffer
);
1015 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1016 if (_tcsstr(buffer
, szSystemScheme
) || nSel
== 0) //avoid the default scheme can be deleted
1022 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
1023 EnableWindow(hDlgCtrl
, bEnable
);
1025 lpName
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1026 LoadCursorScheme(lpName
, !bEnable
);
1027 RefreshCursorList(hwndDlg
, FALSE
);
1032 LoadInitialCursorScheme(HWND hwndDlg
)
1034 TCHAR szSchemeName
[256];
1035 TCHAR szSystemScheme
[256];
1036 TCHAR szCursorPath
[256];
1040 DWORD dwSchemeSource
= 0;
1045 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1047 g_CursorData
[i
].hCursor
= 0;
1048 g_CursorData
[i
].szCursorPath
[0] = 0;
1051 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
,
1052 _T("Control Panel\\Cursors"),
1054 KEY_READ
| KEY_QUERY_VALUE
,
1056 if (lError
!= ERROR_SUCCESS
)
1059 dwDataSize
= sizeof(DWORD
);
1060 lError
= RegQueryValueEx(hCursorKey
,
1061 _T("Scheme Source"),
1064 (LPBYTE
)&dwSchemeSource
,
1067 if (dwSchemeSource
!= 0)
1069 dwDataSize
= 256 * sizeof(TCHAR
);
1070 lError
= RegQueryValueEx(hCursorKey
,
1074 (LPBYTE
)szSchemeName
,
1077 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1079 dwDataSize
= MAX_PATH
* sizeof(TCHAR
);
1080 lError
= RegQueryValueEx(hCursorKey
,
1081 g_CursorData
[i
].lpValueName
,
1084 (LPBYTE
)szCursorPath
,
1086 if (lError
== ERROR_SUCCESS
)
1088 if (dwType
== REG_EXPAND_SZ
)
1090 ExpandEnvironmentStrings(szCursorPath
, g_CursorData
[i
].szCursorPath
, MAX_PATH
);
1094 _tcscpy(g_CursorData
[i
].szCursorPath
, szCursorPath
);
1100 RegCloseKey(hCursorKey
);
1102 ReloadCurrentCursorScheme();
1103 RefreshCursorList(hwndDlg
, TRUE
);
1105 /* Build the full scheme name */
1106 if (dwSchemeSource
== 0)
1108 LoadString(hApplet
, IDS_NONE
, szSchemeName
, MAX_PATH
);
1110 else if (dwSchemeSource
== 2)
1112 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1113 _tcscat(szSchemeName
, _T(" "));
1114 _tcscat(szSchemeName
, szSystemScheme
);
1117 /* Search and select the curent scheme name from the scheme list */
1118 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)szSchemeName
);
1120 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
1122 /* Enable /disable delete button */
1123 EnableWindow(GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
), (dwSchemeSource
== 1));
1128 ApplyCursorScheme(HWND hwndDlg
)
1130 TCHAR szSchemeName
[MAX_PATH
];
1131 TCHAR szSystemScheme
[MAX_PATH
];
1132 TCHAR szTempPath
[MAX_PATH
];
1133 LPTSTR lpSchemeData
;
1135 DWORD dwSchemeSource
;
1140 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1144 lpSchemeData
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1145 if (lpSchemeData
== NULL
)
1147 /* "None" cursor scheme */
1149 szSchemeName
[0] = 0;
1154 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
1155 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1157 if (_tcsstr(szSchemeName
, szSystemScheme
))
1161 szSchemeName
[_tcslen(szSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
1169 dwNameLength
= (_tcslen(szSchemeName
) + 1) * sizeof(TCHAR
);
1172 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0,
1173 KEY_READ
| KEY_SET_VALUE
, &hCursorKey
) != ERROR_SUCCESS
)
1176 RegSetValueEx(hCursorKey
, NULL
, 0, REG_SZ
,
1177 (LPBYTE
)szSchemeName
, dwNameLength
);
1179 RegSetValueEx(hCursorKey
, _T("Scheme Source"), 0, REG_DWORD
,
1180 (LPBYTE
)&dwSchemeSource
, sizeof(DWORD
));
1182 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1184 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
1185 RegSetValueEx(hCursorKey
, g_CursorData
[i
].lpValueName
, 0,
1186 REG_EXPAND_SZ
, (LPBYTE
)szTempPath
,
1187 (_tcslen(szTempPath
) + 1) * sizeof(TCHAR
));
1190 RegCloseKey(hCursorKey
);
1192 /* Force the system to reload its cursors */
1193 SystemParametersInfo(SPI_SETCURSORS
, 0, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1199 static INT_PTR CALLBACK
1200 PointerProc(IN HWND hwndDlg
,
1205 PPOINTER_DATA pPointerData
;
1209 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1214 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
1215 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
1217 pPointerData
->cxCursor
= GetSystemMetrics(SM_CXCURSOR
);
1218 pPointerData
->cyCursor
= GetSystemMetrics(SM_CYCURSOR
);
1220 EnumerateCursorSchemes(hwndDlg
);
1221 LoadInitialCursorScheme(hwndDlg
);
1223 /* Get drop shadow setting */
1224 if (!SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &pPointerData
->bDropShadow
, 0))
1225 pPointerData
->bDropShadow
= FALSE
;
1227 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1229 if (pPointerData
->bDropShadow
)
1231 SendDlgItemMessage(hwndDlg
, IDC_CHECK_DROP_SHADOW
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1234 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
1239 case WM_MEASUREITEM
:
1240 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= GetSystemMetrics(SM_CYCURSOR
) + 4;
1244 if (wParam
== IDC_LISTBOX_CURSOR
)
1245 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
, pPointerData
);
1249 HeapFree(GetProcessHeap(), 0, pPointerData
);
1253 lppsn
= (LPPSHNOTIFY
) lParam
;
1254 if (lppsn
->hdr
.code
== PSN_APPLY
)
1256 ApplyCursorScheme(hwndDlg
);
1257 //#if (WINVER >= 0x0500)
1258 if (pPointerData
->bOrigDropShadow
!= pPointerData
->bDropShadow
)
1260 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, IntToPtr(pPointerData
->bDropShadow
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1261 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1266 else if (lppsn
->hdr
.code
== PSN_RESET
)
1268 //#if (WINVER >= 0x0500)
1269 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, IntToPtr(pPointerData
->bOrigDropShadow
), 0);
1275 switch (LOWORD(wParam
))
1277 case IDC_COMBO_CURSOR_SCHEME
:
1278 if (HIWORD(wParam
) == CBN_SELENDOK
)
1280 LoadNewCursorScheme(hwndDlg
);
1281 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1285 case IDC_LISTBOX_CURSOR
:
1286 switch (HIWORD(wParam
))
1289 nSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
1290 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
1291 (LPARAM
)g_CursorData
[nSel
].hCursor
);
1292 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
),
1293 (g_CursorData
[nSel
].szCursorPath
[0] != 0));
1297 if (BrowseCursor(hwndDlg
))
1299 /* Update cursor list and preview */
1300 ReloadCurrentCursorScheme();
1301 RefreshCursorList(hwndDlg
, FALSE
);
1303 /* Enable the "Set Default" button */
1304 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1306 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1312 case IDC_BUTTON_SAVEAS_SCHEME
:
1313 SaveCursorScheme(hwndDlg
);
1316 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
1317 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
1320 /* Clean the path of the currently selected cursor */
1321 memset(g_CursorData
[nSel
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1323 /* Update cursor list and preview */
1324 ReloadCurrentCursorScheme();
1325 RefreshCursorList(hwndDlg
, FALSE
);
1327 /* Disable the "Set Default" button */
1328 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), FALSE
);
1330 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1334 case IDC_BUTTON_BROWSE_CURSOR
:
1335 if (BrowseCursor(hwndDlg
))
1337 /* Update cursor list and preview */
1338 ReloadCurrentCursorScheme();
1339 RefreshCursorList(hwndDlg
, FALSE
);
1341 /* Enable the "Set Default" button */
1342 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1344 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1348 case IDC_BUTTON_DELETE_SCHEME
:
1349 DeleteUserCursorScheme(hwndDlg
);
1352 case IDC_CHECK_DROP_SHADOW
:
1353 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1355 pPointerData
->bDropShadow
= FALSE
;
1356 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1357 //#if (WINVER >= 0x0500)
1358 // SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID)pPointerData->bDropShadow, 0);
1360 // PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1364 pPointerData
->bDropShadow
= TRUE
;
1365 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1367 //#if (WINVER >= 0x0500)
1368 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, IntToPtr(pPointerData
->bDropShadow
), 0);
1370 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1380 static INT_PTR CALLBACK
1381 OptionProc(IN HWND hwndDlg
,
1386 POPTION_DATA pOptionData
;
1390 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1395 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1396 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1398 /* Get mouse sensitivity */
1399 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSpeed
, 0))
1400 pOptionData
->ulMouseSpeed
= DEFAULT_MOUSE_SPEED
;
1401 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1404 if (!SystemParametersInfo(SPI_GETMOUSE
, 0, &pOptionData
->MouseAccel
, 0))
1406 pOptionData
->MouseAccel
.nAcceleration
= DEFAULT_MOUSE_ACCELERATION
;
1407 pOptionData
->MouseAccel
.nThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1408 pOptionData
->MouseAccel
.nThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1410 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1411 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1412 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1414 /* snap to default button */
1415 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->bSnapToDefaultButton
, 0))
1416 pOptionData
->bSnapToDefaultButton
= FALSE
;
1417 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1420 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->uMouseTrails
, 0))
1421 pOptionData
->uMouseTrails
= 0;
1422 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1424 /* hide pointer while typing */
1425 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->bMouseVanish
, 0))
1426 pOptionData
->bMouseVanish
= FALSE
;
1427 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1429 /* show pointer with Ctrl-Key */
1430 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->bMouseSonar
, 0))
1431 pOptionData
->bMouseSonar
= FALSE
;
1432 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1434 /* Set mouse speed */
1435 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
);
1436 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1437 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSpeed
- 1);
1439 if (pOptionData
->MouseAccel
.nAcceleration
)
1441 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1442 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1445 if (pOptionData
->bSnapToDefaultButton
)
1447 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1448 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1451 /* set mouse trail */
1452 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1453 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1454 if (pOptionData
->uMouseTrails
< 2)
1456 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)5);
1457 EnableWindow(hDlgCtrl
, FALSE
);
1458 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1459 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1463 SendDlgItemMessage(hwndDlg
, IDC_CHECK_POINTER_TRAIL
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1464 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->uMouseTrails
- 2);
1467 if (pOptionData
->bMouseVanish
)
1469 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1470 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1473 if (pOptionData
->bMouseSonar
)
1475 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1476 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1482 HeapFree(GetProcessHeap(), 0, pOptionData
);
1486 switch(LOWORD(wParam
))
1488 case IDC_CHECK_POINTER_PRECISION
:
1489 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1491 pOptionData
->MouseAccel
.nAcceleration
= 0;
1492 pOptionData
->MouseAccel
.nThreshold1
= 0;
1493 pOptionData
->MouseAccel
.nThreshold2
= 0;
1494 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1498 pOptionData
->MouseAccel
.nAcceleration
= 1;
1499 pOptionData
->MouseAccel
.nThreshold1
= 6;
1500 pOptionData
->MouseAccel
.nThreshold2
= 10;
1501 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1503 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, 0);
1506 case IDC_CHECK_SNAP_TO
:
1507 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1509 pOptionData
->bSnapToDefaultButton
= 0;
1510 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1514 pOptionData
->bSnapToDefaultButton
= 1;
1515 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1517 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, 0);
1520 case IDC_CHECK_POINTER_TRAIL
:
1521 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1522 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1524 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1525 EnableWindow(hDlgCtrl
, FALSE
);
1526 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1527 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1528 pOptionData
->uMouseTrails
= 0;
1532 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1533 EnableWindow(hDlgCtrl
, TRUE
);
1534 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), TRUE
);
1535 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), TRUE
);
1536 pOptionData
->uMouseTrails
= (UINT
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1538 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, 0);
1541 case IDC_CHECK_HIDE_POINTER
:
1542 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1544 pOptionData
->bMouseVanish
= FALSE
;
1545 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1549 pOptionData
->bMouseVanish
= TRUE
;
1550 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1552 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bMouseVanish
), 0);
1555 case IDC_CHECK_SHOW_POINTER
:
1556 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1558 pOptionData
->bMouseSonar
= FALSE
;
1559 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1563 pOptionData
->bMouseSonar
= TRUE
;
1564 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1566 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, IntToPtr(pOptionData
->bMouseSonar
), 0);
1570 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1574 lppsn
= (LPPSHNOTIFY
)lParam
;
1575 if (lppsn
->hdr
.code
== PSN_APPLY
)
1577 /* Set mouse speed */
1578 if (pOptionData
->ulOrigMouseSpeed
!= pOptionData
->ulMouseSpeed
)
1580 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulMouseSpeed
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1581 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1584 if (pOptionData
->OrigMouseAccel
.nAcceleration
!= pOptionData
->MouseAccel
.nAcceleration
)
1586 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1587 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1588 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1589 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1593 /* set snap to default button */
1594 if (pOptionData
->bOrigSnapToDefaultButton
!= pOptionData
->bSnapToDefaultButton
)
1596 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1597 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1600 /* Set mouse trails setting */
1601 if (pOptionData
->uOrigMouseTrails
!= pOptionData
->uMouseTrails
)
1603 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1604 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1607 /* hide pointer while typing */
1608 if (pOptionData
->bOrigMouseVanish
!= pOptionData
->bMouseVanish
)
1610 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bMouseVanish
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1611 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1614 /* show pointer with Ctrl-Key */
1615 if (pOptionData
->bOrigMouseSonar
!= pOptionData
->bMouseSonar
)
1617 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, IntToPtr(pOptionData
->bMouseSonar
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1618 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1622 else if (lppsn
->hdr
.code
== PSN_RESET
)
1624 /* Set the original mouse speed */
1625 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulOrigMouseSpeed
), 0);
1626 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->OrigMouseAccel
, 0);
1627 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bOrigSnapToDefaultButton
, 0, 0);
1628 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uOrigMouseTrails
, 0, 0);
1629 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bOrigMouseVanish
), 0);
1630 SystemParametersInfo(SPI_SETMOUSESONAR
, 0,IntToPtr(pOptionData
->bOrigMouseSonar
), 0);
1635 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
))
1637 switch (LOWORD(wParam
))
1646 pOptionData
->ulMouseSpeed
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
, TBM_GETPOS
, 0, 0) + 1;
1647 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulMouseSpeed
), SPIF_SENDCHANGE
);
1648 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1652 pOptionData
->ulMouseSpeed
= (ULONG
)HIWORD(wParam
) + 1;
1653 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1654 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1659 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1661 switch (LOWORD(wParam
))
1670 pOptionData
->uMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1671 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1672 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1676 pOptionData
->uMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1677 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1678 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1690 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1694 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1696 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1697 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1699 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1700 EnableWindow(hDlgCtrl
, TRUE
);
1702 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1703 EnableWindow(hDlgCtrl
, TRUE
);
1705 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1706 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1710 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1711 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1713 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1714 EnableWindow(hDlgCtrl
, FALSE
);
1716 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1717 EnableWindow(hDlgCtrl
, FALSE
);
1719 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1720 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1722 /* Set the default scroll lines value */
1724 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1729 static INT_PTR CALLBACK
1730 WheelProc(IN HWND hwndDlg
,
1736 PWHEEL_DATA pWheelData
;
1738 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1743 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1744 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1746 /* Get wheel scroll lines */
1747 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1749 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1752 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1753 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1754 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1756 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1761 HeapFree(GetProcessHeap(), 0, pWheelData
);
1765 switch (LOWORD(wParam
))
1767 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1768 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1769 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1770 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1773 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1774 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1775 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1776 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1779 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1780 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1782 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1783 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1790 lppsn
= (LPPSHNOTIFY
)lParam
;
1791 if (lppsn
->hdr
.code
== PSN_APPLY
)
1793 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1794 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1810 { IDD_PAGE_BUTTON
, ButtonProc
, CPLPAGE_MOUSE_BUTTONS
},
1811 { IDD_PAGE_POINTER
, PointerProc
, 0 },
1812 { IDD_PAGE_OPTION
, OptionProc
, CPLPAGE_MOUSE_PTRMOTION
},
1813 { IDD_PAGE_WHEEL
, WheelProc
, CPLPAGE_MOUSE_WHEEL
},
1814 { IDD_HARDWARE
, MouseHardwareProc
, 0 },
1818 MouseApplet(HWND hwnd
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
)
1820 HPROPSHEETPAGE hpsp
[MAX_CPL_PAGES
];
1821 PROPSHEETHEADER psh
;
1827 UNREFERENCED_PARAMETER(lParam1
);
1828 UNREFERENCED_PARAMETER(lParam2
);
1829 UNREFERENCED_PARAMETER(uMsg
);
1830 UNREFERENCED_PARAMETER(hwnd
);
1832 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1834 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1835 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1836 psh
.dwFlags
= PSH_PROPTITLE
;
1837 psh
.hwndParent
= hwnd
;
1838 psh
.hInstance
= hApplet
;
1839 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1840 psh
.pszCaption
= Caption
;
1844 /* Load additional pages provided by shell extensions */
1845 hpsxa
= SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Mouse"), MAX_CPL_PAGES
- psh
.nPages
);
1847 for (i
= 0; i
!= sizeof(PropPages
) / sizeof(PropPages
[0]); i
++)
1849 /* Override the background page if requested by a shell extension */
1850 if (PropPages
[i
].uiReplaceWith
!= 0 && hpsxa
!= NULL
&&
1851 SHReplaceFromPropSheetExtArray(hpsxa
, PropPages
[i
].uiReplaceWith
, PropSheetAddPage
, (LPARAM
)&psh
) != 0)
1853 /* The shell extension added one or more pages to replace a page.
1854 Don't create the built-in page anymore! */
1858 InitPropSheetPage(&psh
, PropPages
[i
].idDlg
, PropPages
[i
].DlgProc
);
1862 SHAddFromPropSheetExtArray(hpsxa
, PropSheetAddPage
, (LPARAM
)&psh
);
1864 ret
= (LONG
)(PropertySheet(&psh
) != -1);
1867 SHDestroyPropSheetExtArray(hpsxa
);