|
|
// 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 changed, 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)); HGDIOBJ hObject = SelectObject(hdc, hFontOld); DeleteObject(hObject);
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); HGDIOBJ hBitmapOld = SelectObject(hDC, hBitmap);
BitBlt(hdc, (rcOriginal.left + rcOriginal.right)/2 - nOffset, (rcOriginal.top + rcOriginal.bottom)/2 - nOffset, 100, 100, hDC, 0, 0, SRCCOPY); SelectObject(hdc, hBitmapOld); DeleteObject(hBitmap);
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); HGDIOBJ hObject = SelectObject(hdc, hbrOld); DeleteObject(hObject); 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); hObject = SelectObject(hdc, hbrOld); DeleteObject(hObject); hObject = SelectObject(hdc, hpenOld); DeleteObject(hObject);
//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); DeleteObject(hpalOld); RealizePalette(hdc); }
RestoreDC(hdc, -1); }
|