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
47 #define DEFAULT_DOUBLE_CLICK_SPEED 500
48 #define DEFAULT_CLICK_LOCK_TIME 2200
49 #define DEFAULT_MOUSE_SPEED 10
50 #define DEFAULT_MOUSE_ACCELERATION 1
51 #define DEFAULT_MOUSE_THRESHOLD1 6
52 #define DEFAULT_MOUSE_THRESHOLD2 10
53 #define MIN_DOUBLE_CLICK_SPEED 200
54 #define MAX_DOUBLE_CLICK_SPEED 900
55 #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
,
203 PBUTTON_DATA pButtonData
;
205 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
210 pButtonData
= (PBUTTON_DATA
)lParam
;
211 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
213 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
214 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
215 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
216 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
220 if (LOWORD(wParam
) == IDOK
)
222 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
223 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
224 EndDialog(hwndDlg
, TRUE
);
226 else if (LOWORD(wParam
) == IDCANCEL
)
228 EndDialog(hwndDlg
, FALSE
);
237 static INT_PTR CALLBACK
238 ButtonProc(IN HWND hwndDlg
,
247 PBUTTON_DATA pButtonData
;
249 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
254 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
255 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
257 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
258 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
259 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
260 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
262 /* Click lock time */
263 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
264 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
266 /* Load mouse button icons */
267 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
268 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
270 /* Load folder icons */
271 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
272 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
274 if (pButtonData
->g_SwapMouseButtons
)
276 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
277 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
281 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
284 if (pButtonData
->g_ClickLockEnabled
)
286 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
287 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
291 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
292 EnableWindow(hDlgCtrl
, FALSE
);
295 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
296 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
297 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
300 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
301 pButtonData
->bClicked
= TRUE
;
305 DestroyIcon(pButtonData
->hButtonLeft
);
306 DestroyIcon(pButtonData
->hButtonRight
);
307 DestroyIcon(pButtonData
->hIcon1
);
308 DestroyIcon(pButtonData
->hIcon2
);
309 HeapFree(GetProcessHeap(), 0, pButtonData
);
313 switch(LOWORD(wParam
))
315 case IDC_SWAP_MOUSE_BUTTONS
:
316 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
317 if (lResult
== BST_CHECKED
)
319 pButtonData
->g_SwapMouseButtons
= FALSE
;
320 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
321 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
323 else if (lResult
== BST_UNCHECKED
)
325 pButtonData
->g_SwapMouseButtons
= TRUE
;
326 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
327 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
329 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_SwapMouseButtons
, NULL
, 0);
330 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
333 case IDC_CHECK_CLICK_LOCK
:
334 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
335 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
336 if (lResult
== BST_CHECKED
)
338 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
339 pButtonData
->g_ClickLockEnabled
= FALSE
;
340 EnableWindow(hDlgCtrl
, FALSE
);
342 else if (lResult
== BST_UNCHECKED
)
344 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
345 pButtonData
->g_ClickLockEnabled
= TRUE
;
346 EnableWindow(hDlgCtrl
, TRUE
);
348 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
351 case IDC_BUTTON_CLICK_LOCK
:
352 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
355 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
356 if (HIWORD(wParam
) == STN_DBLCLK
)
358 pButtonData
->bClicked
= !pButtonData
->bClicked
;
359 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
360 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
367 lppsn
= (LPPSHNOTIFY
) lParam
;
368 if (lppsn
->hdr
.code
== PSN_APPLY
)
370 if (pButtonData
->g_OrigSwapMouseButtons
!= pButtonData
->g_SwapMouseButtons
)
372 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
373 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
376 #if (WINVER >= 0x0500)
377 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
378 if (pButtonData
->g_ClickLockEnabled
)
379 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
382 else if (lppsn
->hdr
.code
== PSN_RESET
)
384 /* Reset swap mouse button setting */
385 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, 0);
387 /* Reset double click speed setting */
388 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, 0);
389 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
394 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
396 switch (LOWORD(wParam
))
405 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
406 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
407 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
408 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
409 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
413 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
414 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
415 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
416 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
428 EnumerateCursorSchemes(HWND hwndDlg
)
432 TCHAR szValueName
[MAX_PATH
];
434 TCHAR szSystemScheme
[MAX_PATH
];
435 TCHAR szValueData
[2000];
441 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
442 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
444 /* Read the users cursor schemes */
445 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors\\Schemes"),
446 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
447 if (lError
== ERROR_SUCCESS
)
449 for (dwIndex
= 0;; dwIndex
++)
451 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
452 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
453 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
454 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
455 if (lError
== ERROR_NO_MORE_ITEMS
)
458 if (_tcslen(szValueData
) > 0)
460 LPTSTR lpCopy
, lpStart
;
462 /* Remove quotation marks */
463 if (szValueData
[0] == _T('"'))
465 lpStart
= szValueData
+ 1;
466 szValueData
[_tcslen(szValueData
) - 1] = 0;
470 lpStart
= szValueData
;
473 lpCopy
= _tcsdup(lpStart
);
475 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
476 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
480 RegCloseKey(hCursorKey
);
483 /* Read the system cursor schemes */
484 lError
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
485 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
486 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
487 if (lError
== ERROR_SUCCESS
)
489 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
491 for (dwIndex
= 0;; dwIndex
++)
493 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
494 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
495 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
496 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
497 if (lError
== ERROR_NO_MORE_ITEMS
)
500 if (_tcslen(szValueData
) > 0)
502 LPTSTR lpCopy
, lpStart
;
504 /* Remove quotation marks */
505 if (szValueData
[0] == _T('"'))
507 lpStart
= szValueData
+ 1;
508 szValueData
[_tcslen(szValueData
) - 1] = 0;
512 lpStart
= szValueData
;
515 lpCopy
= _tcsdup(lpStart
);
517 _tcscat(szValueName
, TEXT(" "));
518 _tcscat(szValueName
, szSystemScheme
);
520 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
521 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
525 RegCloseKey(hCursorKey
);
528 /* Add the "(none)" entry */
529 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
530 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
531 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
538 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
544 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
548 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
549 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
551 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
552 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
555 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
559 InvalidateRect(GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
), NULL
, FALSE
);
562 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
563 (LPARAM
)g_CursorData
[nSel
].hCursor
);
565 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), (g_CursorData
[nSel
].szCursorPath
[0] != 0));
570 DeleteUserCursorScheme(HWND hwndDlg
)
572 TCHAR szSchemeName
[MAX_PATH
];
574 TCHAR szRawText
[256];
582 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
583 nSel
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
587 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
589 LoadString(hApplet
, IDS_REMOVE_TITLE
, szTitle
, 128);
590 LoadString(hApplet
, IDS_REMOVE_TEXT
, szRawText
, 256);
592 _stprintf(szText
, szRawText
, szSchemeName
);
594 /* Confirm scheme removal */
595 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
598 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
601 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
607 lResult
= RegDeleteValue(hCuCursorKey
, szSchemeName
);
609 RegCloseKey(hCuCursorKey
);
612 if (lResult
== ERROR_SUCCESS
)
614 SendMessage(hDlgCtrl
, CB_DELETESTRING
, nSel
, 0);
615 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
618 return (lResult
== ERROR_SUCCESS
);
622 static INT_PTR CALLBACK
623 SaveSchemeProc(IN HWND hwndDlg
,
633 pSchemeName
= (LPTSTR
)lParam
;
634 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSchemeName
);
635 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_SETTEXT
,
636 0, (LPARAM
)pSchemeName
);
640 if (LOWORD(wParam
) == IDOK
)
642 pSchemeName
= (LPTSTR
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
643 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_GETTEXT
,
644 (WPARAM
)MAX_PATH
, (LPARAM
)pSchemeName
);
645 EndDialog(hwndDlg
, TRUE
);
647 else if (LOWORD(wParam
) == IDCANCEL
)
649 EndDialog(hwndDlg
, FALSE
);
659 SaveCursorScheme(HWND hwndDlg
)
661 TCHAR szSystemScheme
[MAX_PATH
];
662 TCHAR szSchemeName
[MAX_PATH
];
663 TCHAR szNewSchemeName
[MAX_PATH
];
667 INT index
, i
, nLength
;
671 LONG lError
= ERROR_SUCCESS
;
674 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
676 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
686 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szNewSchemeName
);
688 if (_tcsstr(szNewSchemeName
, szSystemScheme
))
690 szNewSchemeName
[_tcslen(szNewSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
694 /* Ask for a name for the new cursor scheme */
695 if (!DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
),
696 hwndDlg
, SaveSchemeProc
, (LPARAM
)szNewSchemeName
))
699 /* Check all non-system schemes for the new name */
700 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCOUNT
, 0, 0);
704 bSchemeExists
= FALSE
;
705 for (i
= 0; i
< nSel
; i
++)
707 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, i
, (LPARAM
)szSchemeName
);
708 if (_tcsstr(szSchemeName
, szSystemScheme
) == NULL
)
710 if (_tcscmp(szSchemeName
, szNewSchemeName
) == 0)
712 bSchemeExists
= TRUE
;
720 LoadString(hApplet
, IDS_OVERWRITE_TITLE
, szTitle
, 128);
721 LoadString(hApplet
, IDS_OVERWRITE_TEXT
, szText
, 256);
723 /* Confirm scheme overwrite */
724 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
728 /* Save the cursor scheme */
730 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
734 nLength
+= _tcslen(g_CursorData
[i
].szCursorPath
);
738 lpSchemeData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nLength
* sizeof(TCHAR
));
740 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
743 _tcscat(lpSchemeData
, _T(","));
744 _tcscat(lpSchemeData
, g_CursorData
[i
].szCursorPath
);
747 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
750 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
756 lError
= RegSetValueEx(hCuCursorKey
, szNewSchemeName
, 0, REG_EXPAND_SZ
,
757 (LPBYTE
)lpSchemeData
, nLength
* sizeof(TCHAR
));
759 RegCloseKey(hCuCursorKey
);
762 /* Add the new scheme to the scheme list and select it */
763 if (lError
== ERROR_SUCCESS
)
765 LPTSTR copy
= _tcsdup(lpSchemeData
);
767 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szNewSchemeName
);
768 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETITEMDATA
, (WPARAM
)nSel
, (LPARAM
)copy
);
769 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
772 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
774 return (lError
== ERROR_SUCCESS
);
779 BrowseCursor(HWND hwndDlg
)
781 TCHAR szFileName
[MAX_PATH
];
782 TCHAR szFilter
[MAX_PATH
];
783 TCHAR szTitle
[MAX_PATH
];
787 LoadString(hApplet
, IDS_BROWSE_FILTER
, szFilter
, MAX_PATH
);
788 LoadString(hApplet
, IDS_BROWSE_TITLE
, szTitle
, MAX_PATH
);
790 memset(szFileName
, 0x0, sizeof(szFileName
));
791 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
794 MessageBox(hwndDlg
, _T("LB_ERR"), _T(""), MB_ICONERROR
);
798 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
799 ofn
.lStructSize
= sizeof(OPENFILENAME
);
800 ofn
.hwndOwner
= hwndDlg
;
801 ofn
.lpstrFilter
= szFilter
;
802 ofn
.nFilterIndex
= 1;
803 ofn
.lpstrFile
= szFileName
;
804 ofn
.nMaxFile
= MAX_PATH
;
805 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
806 ofn
.lpstrTitle
= szTitle
;
807 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
809 if (!GetOpenFileName(&ofn
))
812 /* Store the new cursor file path */
813 _tcsncpy(g_CursorData
[nSel
].szCursorPath
, szFileName
, MAX_PATH
);
820 LoadCursorScheme(LPTSTR lpName
, BOOL bSystem
)
824 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
826 if (g_CursorData
[i
].hCursor
!= NULL
)
828 DestroyCursor(g_CursorData
[i
].hCursor
);
829 g_CursorData
[i
].hCursor
= 0;
831 g_CursorData
[i
].szCursorPath
[0] = 0;
836 LPTSTR pStart
= lpName
;
837 LPTSTR pEnd
= pStart
;
843 pEnd
= _tcschr(pStart
, _T(','));
845 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
847 nLength
= _tcslen(pStart
);
849 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
850 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
852 pStart
= pStart
+ (nLength
+ 1);
858 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
860 if (g_CursorData
[i
].szCursorPath
[0] == 0)
861 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
863 LR_DEFAULTSIZE
| LR_SHARED
);
865 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
867 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
873 ReloadCurrentCursorScheme(VOID
)
877 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
879 if (g_CursorData
[i
].hCursor
!= NULL
)
880 DestroyCursor(g_CursorData
[i
].hCursor
);
882 if (g_CursorData
[i
].szCursorPath
[0] == 0)
883 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
885 LR_DEFAULTSIZE
| LR_SHARED
);
887 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
889 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
895 OnDrawItem(UINT idCtl
,
896 LPDRAWITEMSTRUCT lpdis
,
897 PPOINTER_DATA pPointerData
)
901 if (lpdis
->itemState
& ODS_SELECTED
)
905 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
906 SetBkColor(lpdis
->hDC
,
907 GetSysColor(COLOR_HIGHLIGHT
));
908 SetTextColor(lpdis
->hDC
,
909 GetSysColor(COLOR_HIGHLIGHTTEXT
));
915 (HBRUSH
)(COLOR_WINDOW
+ 1));
916 SetBkColor(lpdis
->hDC
,
917 GetSysColor(COLOR_WINDOW
));
918 SetTextColor(lpdis
->hDC
,
919 GetSysColor(COLOR_WINDOWTEXT
));
922 if (lpdis
->itemID
!= -1)
924 CopyRect(&rc
, &lpdis
->rcItem
);
927 g_CursorData
[lpdis
->itemData
].szCursorName
,
930 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
932 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
935 lpdis
->rcItem
.right
- pPointerData
->cxCursor
- 4,
936 lpdis
->rcItem
.top
+ 2,
937 g_CursorData
[lpdis
->itemData
].hCursor
);
941 if (lpdis
->itemState
& ODS_FOCUS
)
943 CopyRect(&rc
, &lpdis
->rcItem
);
944 InflateRect(&rc
, -1, -1);
945 DrawFocusRect(lpdis
->hDC
, &rc
);
951 LoadNewCursorScheme(HWND hwndDlg
)
953 TCHAR buffer
[MAX_PATH
];
954 TCHAR szSystemScheme
[MAX_PATH
];
960 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
964 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)buffer
);
966 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
967 if (_tcsstr(buffer
, szSystemScheme
) || nSel
== 0) //avoid the default scheme can be deleted
973 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
974 EnableWindow(hDlgCtrl
, bEnable
);
976 lpName
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
977 LoadCursorScheme(lpName
, !bEnable
);
978 RefreshCursorList(hwndDlg
, FALSE
);
983 LoadInitialCursorScheme(HWND hwndDlg
)
985 TCHAR szSchemeName
[256];
986 TCHAR szSystemScheme
[256];
987 TCHAR szCursorPath
[256];
991 DWORD dwSchemeSource
= 0;
996 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
998 g_CursorData
[i
].hCursor
= 0;
999 g_CursorData
[i
].szCursorPath
[0] = 0;
1002 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
,
1003 _T("Control Panel\\Cursors"),
1005 KEY_READ
| KEY_QUERY_VALUE
,
1007 if (lError
!= ERROR_SUCCESS
)
1010 dwDataSize
= sizeof(DWORD
);
1011 lError
= RegQueryValueEx(hCursorKey
,
1012 _T("Scheme Source"),
1015 (LPBYTE
)&dwSchemeSource
,
1018 if (dwSchemeSource
!= 0)
1020 dwDataSize
= 256 * sizeof(TCHAR
);
1021 lError
= RegQueryValueEx(hCursorKey
,
1025 (LPBYTE
)szSchemeName
,
1028 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1030 dwDataSize
= MAX_PATH
* sizeof(TCHAR
);
1031 lError
= RegQueryValueEx(hCursorKey
,
1032 g_CursorData
[i
].lpValueName
,
1035 (LPBYTE
)szCursorPath
,
1037 if (lError
== ERROR_SUCCESS
)
1039 if (dwType
== REG_EXPAND_SZ
)
1041 ExpandEnvironmentStrings(szCursorPath
, g_CursorData
[i
].szCursorPath
, MAX_PATH
);
1045 _tcscpy(g_CursorData
[i
].szCursorPath
, szCursorPath
);
1051 RegCloseKey(hCursorKey
);
1053 ReloadCurrentCursorScheme();
1054 RefreshCursorList(hwndDlg
, TRUE
);
1056 /* Build the full scheme name */
1057 if (dwSchemeSource
== 0)
1059 LoadString(hApplet
, IDS_NONE
, szSchemeName
, MAX_PATH
);
1061 else if (dwSchemeSource
== 2)
1063 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1064 _tcscat(szSchemeName
, _T(" "));
1065 _tcscat(szSchemeName
, szSystemScheme
);
1068 /* Search and select the curent scheme name from the scheme list */
1069 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)szSchemeName
);
1071 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
1073 /* Enable /disable delete button */
1074 EnableWindow(GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
), (dwSchemeSource
== 1));
1079 ApplyCursorScheme(HWND hwndDlg
)
1081 TCHAR szSchemeName
[MAX_PATH
];
1082 TCHAR szSystemScheme
[MAX_PATH
];
1083 LPTSTR lpSchemeData
;
1085 DWORD dwSchemeSource
;
1090 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1094 lpSchemeData
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1095 if (lpSchemeData
== NULL
)
1097 /* "None" cursor scheme */
1099 szSchemeName
[0] = 0;
1104 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
1105 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1107 if (_tcsstr(szSchemeName
, szSystemScheme
))
1111 szSchemeName
[_tcslen(szSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
1119 dwNameLength
= (_tcslen(szSchemeName
) + 1) * sizeof(TCHAR
);
1122 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0,
1123 KEY_READ
| KEY_SET_VALUE
, &hCursorKey
) != ERROR_SUCCESS
)
1126 RegSetValueEx(hCursorKey
, NULL
, 0, REG_SZ
,
1127 (LPBYTE
)szSchemeName
, dwNameLength
);
1129 RegSetValueEx(hCursorKey
, _T("Scheme Source"), 0, REG_DWORD
,
1130 (LPBYTE
)&dwSchemeSource
, sizeof(DWORD
));
1132 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1134 RegSetValueEx(hCursorKey
, g_CursorData
[i
].lpValueName
, 0,
1135 REG_EXPAND_SZ
, (LPBYTE
)g_CursorData
[i
].szCursorPath
,
1136 (_tcslen(g_CursorData
[i
].szCursorPath
) + 1) * sizeof(TCHAR
));
1139 RegCloseKey(hCursorKey
);
1141 /* Force the system to reload its cursors */
1142 SystemParametersInfo(SPI_SETCURSORS
, 0, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1148 static INT_PTR CALLBACK
1149 PointerProc(IN HWND hwndDlg
,
1154 PPOINTER_DATA pPointerData
;
1158 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1163 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
1164 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
1166 pPointerData
->cxCursor
= GetSystemMetrics(SM_CXCURSOR
);
1167 pPointerData
->cyCursor
= GetSystemMetrics(SM_CYCURSOR
);
1169 EnumerateCursorSchemes(hwndDlg
);
1170 LoadInitialCursorScheme(hwndDlg
);
1172 /* Get drop shadow setting */
1173 if (!SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &pPointerData
->bDropShadow
, 0))
1174 pPointerData
->bDropShadow
= FALSE
;
1176 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1178 if (pPointerData
->bDropShadow
)
1180 SendDlgItemMessage(hwndDlg
, IDC_CHECK_DROP_SHADOW
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1183 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
1188 case WM_MEASUREITEM
:
1189 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= GetSystemMetrics(SM_CYCURSOR
) + 4;
1193 if (wParam
== IDC_LISTBOX_CURSOR
)
1194 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
, pPointerData
);
1198 HeapFree(GetProcessHeap(), 0, pPointerData
);
1202 lppsn
= (LPPSHNOTIFY
) lParam
;
1203 if (lppsn
->hdr
.code
== PSN_APPLY
)
1205 ApplyCursorScheme(hwndDlg
);
1206 //#if (WINVER >= 0x0500)
1207 if (pPointerData
->bOrigDropShadow
!= pPointerData
->bDropShadow
)
1209 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1210 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1215 else if (lppsn
->hdr
.code
== PSN_RESET
)
1217 //#if (WINVER >= 0x0500)
1218 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bOrigDropShadow
, 0);
1224 switch (LOWORD(wParam
))
1226 case IDC_COMBO_CURSOR_SCHEME
:
1227 if (HIWORD(wParam
) == CBN_SELENDOK
)
1229 LoadNewCursorScheme(hwndDlg
);
1230 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1234 case IDC_LISTBOX_CURSOR
:
1235 switch (HIWORD(wParam
))
1238 nSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
1239 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
1240 (LPARAM
)g_CursorData
[nSel
].hCursor
);
1241 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
),
1242 (g_CursorData
[nSel
].szCursorPath
[0] != 0));
1246 if (BrowseCursor(hwndDlg
))
1248 /* Update cursor list and preview */
1249 ReloadCurrentCursorScheme();
1250 RefreshCursorList(hwndDlg
, FALSE
);
1252 /* Enable the "Set Default" button */
1253 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1255 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1261 case IDC_BUTTON_SAVEAS_SCHEME
:
1262 SaveCursorScheme(hwndDlg
);
1265 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
1266 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
1269 /* Clean the path of the currently selected cursor */
1270 memset(g_CursorData
[nSel
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1272 /* Update cursor list and preview */
1273 ReloadCurrentCursorScheme();
1274 RefreshCursorList(hwndDlg
, FALSE
);
1276 /* Disable the "Set Default" button */
1277 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), FALSE
);
1279 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1283 case IDC_BUTTON_BROWSE_CURSOR
:
1284 if (BrowseCursor(hwndDlg
))
1286 /* Update cursor list and preview */
1287 ReloadCurrentCursorScheme();
1288 RefreshCursorList(hwndDlg
, FALSE
);
1290 /* Enable the "Set Default" button */
1291 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1293 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1297 case IDC_BUTTON_DELETE_SCHEME
:
1298 DeleteUserCursorScheme(hwndDlg
);
1301 case IDC_CHECK_DROP_SHADOW
:
1302 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1304 pPointerData
->bDropShadow
= FALSE
;
1305 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1306 //#if (WINVER >= 0x0500)
1307 // SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID)pPointerData->bDropShadow, 0);
1309 // PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1313 pPointerData
->bDropShadow
= TRUE
;
1314 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1316 //#if (WINVER >= 0x0500)
1317 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, 0);
1319 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1329 static INT_PTR CALLBACK
1330 OptionProc(IN HWND hwndDlg
,
1335 POPTION_DATA pOptionData
;
1339 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1344 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1345 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1347 /* Get mouse sensitivity */
1348 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSpeed
, 0))
1349 pOptionData
->ulMouseSpeed
= DEFAULT_MOUSE_SPEED
;
1350 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1353 if (!SystemParametersInfo(SPI_GETMOUSE
, 0, &pOptionData
->MouseAccel
, 0))
1355 pOptionData
->MouseAccel
.nAcceleration
= DEFAULT_MOUSE_ACCELERATION
;
1356 pOptionData
->MouseAccel
.nThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1357 pOptionData
->MouseAccel
.nThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1359 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1360 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1361 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1363 /* snap to default button */
1364 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->bSnapToDefaultButton
, 0))
1365 pOptionData
->bSnapToDefaultButton
= FALSE
;
1366 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1369 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->uMouseTrails
, 0))
1370 pOptionData
->uMouseTrails
= 0;
1371 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1373 /* hide pointer while typing */
1374 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->bMouseVanish
, 0))
1375 pOptionData
->bMouseVanish
= FALSE
;
1376 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1378 /* show pointer with Ctrl-Key */
1379 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->bMouseSonar
, 0))
1380 pOptionData
->bMouseSonar
= FALSE
;
1381 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1383 /* Set mouse speed */
1384 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
);
1385 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1386 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSpeed
- 1);
1388 if (pOptionData
->MouseAccel
.nAcceleration
)
1390 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1391 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1394 if (pOptionData
->bSnapToDefaultButton
)
1396 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1397 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1400 /* set mouse trail */
1401 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1402 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1403 if (pOptionData
->uMouseTrails
< 2)
1405 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)5);
1406 EnableWindow(hDlgCtrl
, FALSE
);
1407 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1408 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1412 SendDlgItemMessage(hwndDlg
, IDC_CHECK_POINTER_TRAIL
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1413 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->uMouseTrails
- 2);
1416 if (pOptionData
->bMouseVanish
)
1418 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1419 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1422 if (pOptionData
->bMouseSonar
)
1424 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1425 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1431 HeapFree(GetProcessHeap(), 0, pOptionData
);
1435 switch(LOWORD(wParam
))
1437 case IDC_CHECK_POINTER_PRECISION
:
1438 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1440 pOptionData
->MouseAccel
.nAcceleration
= 0;
1441 pOptionData
->MouseAccel
.nThreshold1
= 0;
1442 pOptionData
->MouseAccel
.nThreshold2
= 0;
1443 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1447 pOptionData
->MouseAccel
.nAcceleration
= 1;
1448 pOptionData
->MouseAccel
.nThreshold1
= 6;
1449 pOptionData
->MouseAccel
.nThreshold2
= 10;
1450 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1452 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, 0);
1455 case IDC_CHECK_SNAP_TO
:
1456 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1458 pOptionData
->bSnapToDefaultButton
= 0;
1459 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1463 pOptionData
->bSnapToDefaultButton
= 1;
1464 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1466 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, 0);
1469 case IDC_CHECK_POINTER_TRAIL
:
1470 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1471 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1473 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1474 EnableWindow(hDlgCtrl
, FALSE
);
1475 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1476 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1477 pOptionData
->uMouseTrails
= 0;
1481 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1482 EnableWindow(hDlgCtrl
, TRUE
);
1483 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), TRUE
);
1484 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), TRUE
);
1485 pOptionData
->uMouseTrails
= (UINT
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1487 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, 0);
1490 case IDC_CHECK_HIDE_POINTER
:
1491 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1493 pOptionData
->bMouseVanish
= FALSE
;
1494 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1498 pOptionData
->bMouseVanish
= TRUE
;
1499 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1501 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bMouseVanish
, 0);
1504 case IDC_CHECK_SHOW_POINTER
:
1505 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1507 pOptionData
->bMouseSonar
= FALSE
;
1508 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1512 pOptionData
->bMouseSonar
= TRUE
;
1513 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1515 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bMouseSonar
, 0);
1519 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1523 lppsn
= (LPPSHNOTIFY
)lParam
;
1524 if (lppsn
->hdr
.code
== PSN_APPLY
)
1526 /* Set mouse speed */
1527 if (pOptionData
->ulOrigMouseSpeed
!= pOptionData
->ulMouseSpeed
)
1529 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1530 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1533 if (pOptionData
->OrigMouseAccel
.nAcceleration
!= pOptionData
->MouseAccel
.nAcceleration
)
1535 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1536 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1537 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1538 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1542 /* set snap to default button */
1543 if (pOptionData
->bOrigSnapToDefaultButton
!= pOptionData
->bSnapToDefaultButton
)
1545 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1546 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1549 /* Set mouse trails setting */
1550 if (pOptionData
->uOrigMouseTrails
!= pOptionData
->uMouseTrails
)
1552 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1553 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1556 /* hide pointer while typing */
1557 if (pOptionData
->bOrigMouseVanish
!= pOptionData
->bMouseVanish
)
1559 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bMouseVanish
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1560 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1563 /* show pointer with Ctrl-Key */
1564 if (pOptionData
->bOrigMouseSonar
!= pOptionData
->bMouseSonar
)
1566 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bMouseSonar
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1567 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1571 else if (lppsn
->hdr
.code
== PSN_RESET
)
1573 /* Set the original mouse speed */
1574 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulOrigMouseSpeed
, 0);
1575 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->OrigMouseAccel
, 0);
1576 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bOrigSnapToDefaultButton
, 0, 0);
1577 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uOrigMouseTrails
, 0, 0);
1578 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bOrigMouseVanish
, 0);
1579 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bOrigMouseSonar
, 0);
1584 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
))
1586 switch (LOWORD(wParam
))
1595 pOptionData
->ulMouseSpeed
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
, TBM_GETPOS
, 0, 0) + 1;
1596 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1597 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1601 pOptionData
->ulMouseSpeed
= (ULONG
)HIWORD(wParam
) + 1;
1602 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1603 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1608 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1610 switch (LOWORD(wParam
))
1619 pOptionData
->uMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1620 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1621 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1625 pOptionData
->uMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1626 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1627 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1639 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1643 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1645 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1646 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1648 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1649 EnableWindow(hDlgCtrl
, TRUE
);
1651 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1652 EnableWindow(hDlgCtrl
, TRUE
);
1654 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1655 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1659 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1660 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1662 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1663 EnableWindow(hDlgCtrl
, FALSE
);
1665 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1666 EnableWindow(hDlgCtrl
, FALSE
);
1668 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1669 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1671 /* Set the default scroll lines value */
1673 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1678 static INT_PTR CALLBACK
1679 WheelProc(IN HWND hwndDlg
,
1685 PWHEEL_DATA pWheelData
;
1687 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1692 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1693 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1695 /* Get wheel scroll lines */
1696 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1698 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1701 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1702 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1703 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1705 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1710 HeapFree(GetProcessHeap(), 0, pWheelData
);
1714 switch (LOWORD(wParam
))
1716 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1717 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1718 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1719 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1722 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1723 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1724 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1725 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1728 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1729 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1731 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1732 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1739 lppsn
= (LPPSHNOTIFY
)lParam
;
1740 if (lppsn
->hdr
.code
== PSN_APPLY
)
1742 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1743 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1754 MouseApplet(HWND hwnd
, UINT uMsg
, LONG lParam1
, LONG lParam2
)
1756 PROPSHEETPAGE psp
[5];
1757 PROPSHEETHEADER psh
;
1760 UNREFERENCED_PARAMETER(lParam1
);
1761 UNREFERENCED_PARAMETER(lParam2
);
1762 UNREFERENCED_PARAMETER(uMsg
);
1763 UNREFERENCED_PARAMETER(hwnd
);
1765 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1767 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1768 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1769 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
1770 psh
.hwndParent
= NULL
;
1771 psh
.hInstance
= hApplet
;
1772 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1773 psh
.pszCaption
= Caption
;
1774 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
1778 InitPropSheetPage(&psp
[0], IDD_PAGE_BUTTON
, ButtonProc
);
1779 InitPropSheetPage(&psp
[1], IDD_PAGE_POINTER
, PointerProc
);
1780 InitPropSheetPage(&psp
[2], IDD_PAGE_OPTION
, OptionProc
);
1781 InitPropSheetPage(&psp
[3], IDD_PAGE_WHEEL
, WheelProc
);
1782 InitPropSheetPage(&psp
[4], IDD_HARDWARE
, MouseHardwareProc
);
1783 return (LONG
)(PropertySheet(&psh
) != -1);