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