#include "pch.hxx" // pch #pragma hdrstop #include "resource.h" #include "pgcaret.h" #include "w95trace.c" #define BLINK 1000 #define BLINK_OFF -1 #define CURSORMIN 200 #define CURSORMAX 1300 #define CURSORSUM (CURSORMIN + CURSORMAX) #define CURSORRANGE (CURSORMAX - CURSORMIN) CCaretPg::CCaretPg( LPPROPSHEETPAGE ppsp ) : WizardPage(ppsp, IDS_CARETTITLE, IDS_CARETSUBTITLE) { m_dwPageId = IDD_CARET; ppsp->pszTemplate = MAKEINTRESOURCE(m_dwPageId); hwndCursorScroll = NULL; uNewBlinkTime = uBlinkTime = 0; dwOriginalSize = dwNewSize = 0; fBlink = TRUE; } CCaretPg::~CCaretPg(void) { } LRESULT CCaretPg::OnInitDialog( HWND hwnd, WPARAM wParam,LPARAM lParam ) { DBPRINTF(TEXT("OnInitDialog\r\n")); BOOL fRv = SystemParametersInfo(SPI_GETCARETWIDTH, 0, (PVOID)&dwOriginalSize, 0); dwNewSize = dwOriginalSize; uBlinkTime = RegQueryStrDW( DEFAULT_BLINK_RATE , HKEY_CURRENT_USER , CONTROL_PANEL_DESKTOP , CURSOR_BLINK_RATE); // Blink rate of -1 means it is off; a special case to CURSORMAX if (uBlinkTime == BLINK_OFF) uBlinkTime = CURSORMAX; uNewBlinkTime = uBlinkTime; // Update the Caret UI SendMessage(GetDlgItem(hwnd, KCURSOR_WIDTH), TBM_SETRANGE, 0, MAKELONG(1, 20)); SendMessage(GetDlgItem(hwnd, KCURSOR_WIDTH), TBM_SETPOS, TRUE, (LONG)dwOriginalSize); SendMessage(GetDlgItem(hwnd, KCURSOR_RATE), TBM_SETRANGE, 0, MAKELONG(CURSORMIN / 100, CURSORMAX / 100)); SendMessage(GetDlgItem(hwnd, KCURSOR_RATE), TBM_SETPOS, TRUE, (LONG)(CURSORSUM - uBlinkTime) / 100); // Update Blink and caret size hwndCaret = GetDlgItem(hwnd, KCURSOR_BLINK); GetWindowRect(hwndCaret, &rCursor); MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&rCursor, 2); rCursor.right = rCursor.left + dwOriginalSize; return 1; } void CCaretPg::UpdateControls() { // Nothing to do } void CCaretPg::DrawCaret(HWND hwnd, BOOL fClearFirst) { HDC hDC = GetDC(hwnd); if (hDC) { HBRUSH hBrush; if (fClearFirst) { hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); if (hBrush) { RECT rect; GetWindowRect(hwndCaret, &rect); MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&rect, 2); FillRect(hDC, &rect, hBrush); InvalidateRect(hwndCaret, &rect, TRUE); DeleteObject(hBrush); } } hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNTEXT)); if (hBrush) { FillRect(hDC, &rCursor, hBrush); InvalidateRect(hwndCaret, &rCursor, TRUE); DeleteObject(hBrush); } ReleaseDC(hwnd,hDC); } } LRESULT CCaretPg::OnTimer( HWND hwnd, WPARAM wParam, LPARAM lParam ) { if (wParam == BLINK) { BOOL fNoBlinkRate = (uNewBlinkTime == CURSORMAX)?TRUE:FALSE; if (fBlink || fNoBlinkRate) { DrawCaret(hwnd, fNoBlinkRate); } else { InvalidateRect(hwndCaret, NULL, TRUE); } if (fNoBlinkRate) KillTimer(hwnd, wParam); fBlink = !fBlink; } return 1; } LRESULT CCaretPg::OnHScroll( HWND hwnd, WPARAM wParam, LPARAM lParam ) { if ((HWND)lParam == GetDlgItem(hwnd, KCURSOR_RATE)) { // blink rate setting int nCurrent = (int)SendMessage( (HWND)lParam, TBM_GETPOS, 0, 0L ); uNewBlinkTime = CURSORSUM - (nCurrent * 100); // reset the bink rate timer SetTimer(hwnd, BLINK, uNewBlinkTime, NULL); if (uNewBlinkTime == CURSORMAX) // draw the caret immediately; if we wait DrawCaret(hwnd, TRUE); // for the timer there is a visible delay } else { // cursor width setting dwNewSize = (int)SendMessage( (HWND)lParam, TBM_GETPOS, 0, 0L ); rCursor.right = rCursor.left + dwNewSize; DrawCaret(hwnd, (uNewBlinkTime == CURSORMAX)); } return 1; } LRESULT CCaretPg::OnPSN_SetActive(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh) { DBPRINTF(TEXT("OnPSN_SetActive: uNewBlinkTime = %d\r\n"), uNewBlinkTime); if (uNewBlinkTime < CURSORMAX) { // start the blink rate timer to simulate cursor SetTimer(hwnd, BLINK, uBlinkTime, NULL); } else { // get the timer to draw the caret immediately SetTimer(hwnd, BLINK, 0, NULL); } return 1; } LRESULT CCaretPg::OnPSN_WizNext(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh) { g_Options.m_schemePreview.m_uCursorBlinkTime = (uNewBlinkTime < CURSORMAX)?uNewBlinkTime:BLINK_OFF; g_Options.m_schemePreview.m_dwCaretWidth = dwNewSize; g_Options.ApplyPreview(); return WizardPage::OnPSN_WizNext(hwnd, idCtl, pnmh); }