Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

178 lines
4.7 KiB

#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);
}