windows-nt/Source/XPSP1/NT/shell/osshell/accessib/accwiz/select.cpp
2020-09-26 16:20:57 +08:00

509 lines
12 KiB
C++

// Copyright (c) 1997-2000 Microsoft Corporation
// Select.cpp
#include "pch.hxx" // PCH
#pragma hdrstop
#include "pgbase.h"
#include "AccWiz.h"
#include "resource.h"
#include "Select.h"
extern HPALETTE g_hpal3D;
// Re-Write to use owner drawn controls....:a-anilk
//////////////////////////////////////////////////////////////
// CIconSizePg member functions
//
UINT IDMap[3][2] = { 0, IDC_ICON1,
1, IDC_ICON2,
2, IDC_ICON3
};
CIconSizePg::CIconSizePg(LPPROPSHEETPAGE ppsp)
: WizardPage(ppsp, IDS_LKPREV_ICONTITLE, IDS_LKPREV_ICONSUBTITLE)
{
m_dwPageId = IDD_PREV_ICON2;
ppsp->pszTemplate = MAKEINTRESOURCE(m_dwPageId);
m_nCountValues = 3;
m_rgnValues[0] = 32;
m_rgnValues[1] = 48;
m_rgnValues[2] = 64;
}
LRESULT CIconSizePg::OnInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
// Initialize the current selection..
if(g_Options.m_schemePreview.m_nIconSize <= 32)
m_nCurValueIndex = 0;
else if(g_Options.m_schemePreview.m_nIconSize <= 48)
m_nCurValueIndex = 1;
else
m_nCurValueIndex = 2;
m_nCurrentHilight = m_nCurValueIndex;
return 1;
}
// These is to set the Focus and sync the painting
LRESULT CIconSizePg::OnPSN_SetActive(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{
syncInit = FALSE;
uIDEvent = SetTimer(hwnd, NULL, 100, NULL);
return 0;
}
LRESULT CIconSizePg::OnTimer( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
KillTimer(hwnd, uIDEvent);
syncInit = TRUE;
return 1;
}
// Selection has chnaged, So Apply for preview.
LRESULT CIconSizePg::SelectionChanged(int nNewSelection)
{
g_Options.m_schemePreview.m_nIconSize = m_rgnValues[nNewSelection];
g_Options.ApplyPreview();
return 0;
}
// Re-paints the previous radio control.
void CIconSizePg::InvalidateRects(int PrevHilight)
{
InvalidateRect(GetDlgItem(m_hwnd, IDMap[PrevHilight][1]), NULL, TRUE);
}
// Sets the focus to the current item in OnInitDialog.
void CIconSizePg::SetFocussedItem(int m_nCurrentHilight)
{
SetFocus(GetDlgItem(m_hwnd, IDMap[m_nCurrentHilight][1]));
}
// DrawItem. Handles painting checks the focussed item
// to determine selection changes
LRESULT CIconSizePg::OnDrawItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
UINT idCtrl = (UINT) wParam;
LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT) lParam;
int index;
BOOL hasChanged = FALSE;
if ( !syncInit)
SetFocussedItem(m_nCurrentHilight);
switch(idCtrl)
{
case IDC_ICON1:
index = 0;
break;
case IDC_ICON2:
index = 1;
break;
case IDC_ICON3:
index = 2;
break;
default:
_ASSERTE(FALSE);
return 1; // Prefix #113781 (this should never happen; only three controls on dialog)
break;
}
// For each button, Check the state, And if the button is selected,
// means that it has current focus, So Re-paint the previously hilighted and
// the current selected buttons....
// Make sure we ignore the initial events so that we minimize the flicker...
if ( (lpDrawItemStruct->itemState & ODS_FOCUS) && (m_nCurrentHilight != index))
{
// If focussed item!
if ( syncInit )
{
// Erase the previous one...
InvalidateRects(m_nCurrentHilight);
m_nCurrentHilight= m_nCurValueIndex = index;
SelectionChanged(m_nCurValueIndex);
}
}
Draw( lpDrawItemStruct, index );
return 1;
}
void CIconSizePg::Draw(LPDRAWITEMSTRUCT ldi, int i)
{
HDC hdc = ldi->hDC;
int nOldBkMode = SetBkMode(hdc, TRANSPARENT);
int nOldAlign = SetTextAlign(hdc, TA_CENTER);
RECT rcOriginal = ldi->rcItem ;
TCHAR sz[100];
LPCTSTR szBitmap = NULL;
int nFontSize = 8;
int nOffset = 0;
HBITMAP hBitmap;
switch(i)
{
case 0:
szBitmap = __TEXT("IDB_ICON_SAMPLE_NORMAL2"); // NO NEED TO LOCALIZE
LoadString(g_hInstDll, IDS_ICONSIZENAMENORMAL, sz, ARRAYSIZE(sz));
nFontSize = 8;
nOffset = 16 + 2;
break;
case 1:
szBitmap = __TEXT("IDB_ICON_SAMPLE_LARGE2"); // NO NEED TO LOCALIZE
LoadString(g_hInstDll, IDS_ICONSIZENAMELARGE, sz, ARRAYSIZE(sz));
nFontSize = 12;
nOffset = 24 + 2;
break;
case 2:
szBitmap = __TEXT("IDB_ICON_SAMPLE_EXLARGE2"); // NO NEED TO LOCALIZE
LoadString(g_hInstDll, IDS_ICONSIZENAMEEXTRALARGE, sz, ARRAYSIZE(sz));
nFontSize = 18;
nOffset = 32 + 2;
break;
default:
_ASSERTE(FALSE);
break;
}
HFONT hFontOld = (HFONT)SelectObject(hdc, g_Options.GetClosestMSSansSerif(nFontSize, (m_nCurrentHilight == i)));
TextOut(hdc,
(rcOriginal.left + rcOriginal.right)/2,
(rcOriginal.top + rcOriginal.bottom)/2 + nOffset,
sz, lstrlen(sz));
SelectObject(hdc, hFontOld);
HDC hDC = CreateCompatibleDC(hdc);
if (!hDC)
return; // Prefix #113779 (out of resources; give up)
// Paint the selected Bitmap.
hBitmap = (HBITMAP) LoadImage( g_hInstDll, szBitmap, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_SHARED | LR_LOADMAP3DCOLORS);
SelectObject(hDC, hBitmap);
BitBlt(hdc, (rcOriginal.left + rcOriginal.right)/2 - nOffset,
(rcOriginal.top + rcOriginal.bottom)/2 - nOffset, 100, 100, hDC, 0, 0, SRCCOPY);
DeleteDC(hDC);
SetTextAlign(hdc, nOldAlign);
SetBkMode(hdc, nOldBkMode);
//If current hi-lighted item, Then draw the bounding rectangle.
if ( m_nCurrentHilight == i)
{
DrawHilight(m_hwnd, ldi);
}
}
/////////////////////////////////
//CScrollBarPg members
/////////////////////////////////
//
// Map the button-ID and the selection index
//
UINT IDMapS[4][2] = { 0, IDC_SCROLL1,
1, IDC_SCROLL2,
2, IDC_SCROLL3,
3, IDC_SCROLL4
};
CScrollBarPg::CScrollBarPg(LPPROPSHEETPAGE ppsp)
: WizardPage(ppsp, IDS_LKPREV_SCROLLBARTITLE, IDS_LKPREV_SCROLLBARSUBTITLE)
{
m_dwPageId = IDD_FNTWIZSCROLLBAR;
ppsp->pszTemplate = MAKEINTRESOURCE(m_dwPageId);
// Initializes the scroll bar widths and number of elements from string table.
LoadArrayFromStringTable(IDS_LKPREV_SCROLLSIZES, m_rgnValues, &m_nCountValues);
}
LRESULT CScrollBarPg::OnInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
m_nCurValueIndex = m_nCountValues - 1;
// Compute the current scroll bar type...
for(int i=0; i < m_nCountValues; i++)
{
if(g_Options.m_schemePreview.m_PortableNonClientMetrics.m_iScrollWidth <= m_rgnValues[i])
{
m_nCurValueIndex = i;
break;
}
}
m_nCurrentHilight = m_nCurValueIndex;
return 1;
}
// When page set active, Start Timer to set the Focus and ignore the
// Hilighted events....
LRESULT CScrollBarPg::OnPSN_SetActive(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{
syncInit = FALSE;
uIDEvent = SetTimer(hwnd, NULL, 100, NULL);
return 0;
}
// Timer Handler
LRESULT CScrollBarPg::OnTimer( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
KillTimer(hwnd, uIDEvent);
syncInit = TRUE;
return 1;
}
// Apply new settings...
LRESULT CScrollBarPg::SettingChanged(int nNewSelection)
{
int nNewValue = (int) m_rgnValues[nNewSelection];
g_Options.m_schemePreview.m_PortableNonClientMetrics.m_iScrollWidth = nNewValue;
g_Options.m_schemePreview.m_PortableNonClientMetrics.m_iScrollHeight = nNewValue;
g_Options.m_schemePreview.m_PortableNonClientMetrics.m_iBorderWidth = nNewSelection;
g_Options.ApplyPreview();
return 0;
}
// Set the current focussed item....
void CScrollBarPg::SetFocussedItem(int m_nCurrentHilight)
{
SetFocus(GetDlgItem(m_hwnd, IDMapS[m_nCurrentHilight][1]));
}
// Erase the previous one....
void CScrollBarPg::InvalidateRects(int PrevHilight)
{
InvalidateRect(GetDlgItem(m_hwnd, IDMapS[PrevHilight][1]), NULL, TRUE);
}
// Owner Draw message
LRESULT CScrollBarPg::OnDrawItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
UINT idCtrl = (UINT) wParam;
LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT) lParam;
int index;
if ( !syncInit)
SetFocussedItem(m_nCurrentHilight);
switch(idCtrl)
{
case IDC_SCROLL1:
index = 0;
break;
case IDC_SCROLL2:
index = 1;
break;
case IDC_SCROLL3:
index = 2;
break;
case IDC_SCROLL4:
index = 3;
break;
default:
// Error
_ASSERTE(FALSE);
return 1; // Prefix #113782 (this should never happen; only four controls on dialog)
break;
}
// For each button, Check the state, And if the button is selected,
// means that it has current focus, So Re-paint the previously hilighted and
// the current selected buttons....
// Make sure we ignore the initial events so that we minimize the flicker...
if ( (lpDrawItemStruct->itemState & ODS_FOCUS) && (m_nCurrentHilight != index))
{
if ( syncInit )
{
// Erase the previous one...
InvalidateRects(m_nCurrentHilight);
m_nCurrentHilight= m_nCurValueIndex = index;
SettingChanged(m_nCurValueIndex);
// dirty = TRUE;
}
}
Draw( lpDrawItemStruct, index );
return 1;
}
// Paints the scroll bars and the selected item
void CScrollBarPg::Draw(LPDRAWITEMSTRUCT ldi, int i)
{
HDC hdc = ldi->hDC;
RECT rcOriginal = ldi->rcItem ;
RECT rci = rcOriginal;
InflateRect(&rcOriginal, -10, -10);
// Draw border
DrawEdge(hdc, &rcOriginal, EDGE_RAISED, BF_BOTTOMRIGHT| BF_ADJUST);
DrawEdge(hdc, &rcOriginal, BDR_RAISEDINNER, BF_FLAT | BF_BOTTOMRIGHT | BF_ADJUST);
DrawEdge(hdc, &rcOriginal, BDR_RAISEDINNER, BF_FLAT | BF_BOTTOMRIGHT | BF_ADJUST);
// Adjust for the border
rcOriginal.right -= i;
rcOriginal.bottom -= i;
// Adjust to the width of the scroll bar
rcOriginal.left = rcOriginal.right - m_rgnValues[i];
RECT rc = rcOriginal;
// Drop the top
rc.bottom = rc.top + m_rgnValues[i];
DrawFrameControl(hdc, &rc, DFC_SCROLL, DFCS_SCROLLUP);
// Draw the middle
rc.top = rc.bottom;
rc.bottom = rcOriginal.bottom - 2 * m_rgnValues[i];
HBRUSH hbr = (HBRUSH)DefWindowProc(m_hwnd, WM_CTLCOLORSCROLLBAR, (WPARAM)hdc, (LPARAM)m_hwnd);
HBRUSH hbrOld = (HBRUSH)SelectObject(hdc, hbr);
HPEN hpenOld = (HPEN)SelectObject(hdc, GetStockObject(NULL_PEN));
// ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
SelectObject(hdc, hbrOld);
SelectObject(hdc, hpenOld);
// Draw the bottom
rc.top = rc.bottom;
rc.bottom = rc.top + m_rgnValues[i];
DrawFrameControl(hdc, &rc, DFC_SCROLL, DFCS_SCROLLDOWN);
// Draw the thumb
rc.top = rc.bottom;
rc.bottom = rc.top + m_rgnValues[i];
DrawFrameControl(hdc, &rc, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
// Draw the right arrow
rc.right = rc.left;
rc.left = rc.right - m_rgnValues[i];
DrawFrameControl(hdc, &rc, DFC_SCROLL, DFCS_SCROLLRIGHT);
// Draw the middle of the bottom scroll bar
rc.right = rc.left;
rc.left = rci.left + 10;
hbr = (HBRUSH)DefWindowProc(m_hwnd, WM_CTLCOLORSCROLLBAR, (WPARAM)hdc, (LPARAM)m_hwnd);
hbrOld = (HBRUSH)SelectObject(hdc, hbr);
hpenOld = (HPEN)SelectObject(hdc, GetStockObject(NULL_PEN));
// ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
SelectObject(hdc, hbrOld);
SelectObject(hdc, hpenOld);
//If current hi-lighted item, Then draw the bounding rectangle.
if ( m_nCurrentHilight == i)
{
DrawHilight(m_hwnd, ldi);
}
}
// Global function to draw the hilighted rectangle....
void DrawHilight(HWND hWnd, LPDRAWITEMSTRUCT ldi)
{
HDC hdc = ldi->hDC;
UINT clrH = COLOR_HIGHLIGHT;
HPALETTE hpalOld = NULL;
SaveDC(hdc);
if (g_hpal3D)
{
hpalOld = SelectPalette(hdc, g_hpal3D, TRUE);
RealizePalette(hdc);
}
// Set the color for drawing the scroll bar
COLORREF clrrefOld = SetBkColor(hdc, GetSysColor(COLOR_3DHILIGHT));
COLORREF clrrefOldText = SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
// OnDraw(hdc);
// Draw the focus
RECT rc = ldi->rcItem;
InflateRect(&rc, -2, -2);
RECT rcTemp;
// If current window not in focus
if ( GetForegroundWindow() != GetParent(hWnd) )
clrH = COLOR_GRAYTEXT;
HWND hwF = GetFocus();
// Use 'selected' color for scroll bar selection
COLORREF clrrefSelected = GetSysColor(COLOR_GRAYTEXT);
if ( (hwF != NULL) && (GetParent(hwF) == hWnd))
clrrefSelected = GetSysColor(COLOR_HIGHLIGHT); // Use 'Gray' or 'Selected'
SetBkColor(hdc, clrrefSelected);
// Draw left
rcTemp = rc;
rcTemp.right = rcTemp.left + 5;
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rcTemp, NULL, 0, NULL);
// Draw top
rcTemp = rc;
rcTemp.bottom = rcTemp.top + 5;
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rcTemp, NULL, 0, NULL);
// Draw right
rcTemp = rc;
rcTemp.left = rcTemp.right - 5;
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rcTemp, NULL, 0, NULL);
// Draw bottom
rcTemp = rc;
rcTemp.top = rcTemp.bottom - 5;
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rcTemp, NULL, 0, NULL);
// Reset the color from drawing the scroll bar
SetBkColor(hdc, clrrefOld);
SetTextColor(hdc, clrrefOldText);
if (hpalOld)
{
hpalOld = SelectPalette(hdc, hpalOld, FALSE);
RealizePalette(hdc);
}
RestoreDC(hdc, -1);
}