// // propdisplay.cpp: display property sheet dialog proc // // Tab B // // Copyright Microsoft Corporation 2000 // nadima #include "stdafx.h" #define TRC_GROUP TRC_GROUP_UI #define TRC_FILE "propdisplay" #include #include "sh.h" #include "commctrl.h" #include "propdisplay.h" COLORSTRINGMAP g_ColorStringTable[] = { {8, UI_IDS_COLOR_256, UI_IDB_COLOR8, UI_IDB_COLOR8_DITHER, TEXT("")}, #ifndef OS_WINCE {15, UI_IDS_COLOR_15bpp, UI_IDB_COLOR16, UI_IDB_COLOR8_DITHER, TEXT("")}, #endif {16, UI_IDS_COLOR_16bpp, UI_IDB_COLOR16, UI_IDB_COLOR8_DITHER, TEXT("")}, {24, UI_IDS_COLOR_24bpp, UI_IDB_COLOR24, UI_IDB_COLOR8_DITHER, TEXT("")} }; #define NUM_COLORSTRINGS sizeof(g_ColorStringTable)/sizeof(COLORSTRINGMAP) // // LUT of valid screen resolutions // const SCREENRES g_ScreenResolutions[] = { {640,480}, {800,600}, {1024,768}, {1152,864}, {1280,1024}, {1600,1200} }; #define NUM_SCREENRES sizeof(g_ScreenResolutions)/sizeof(SCREENRES) // // Controls that need to be disabled/enabled // during connection (for progress animation) // CTL_ENABLE connectingDisableCtlsPDisplay[] = { #ifndef OS_WINCE {IDC_RES_SLIDER, FALSE}, #endif {IDC_CHECK_DISPLAY_BBAR, FALSE}, {IDC_COMBO_COLOR_DEPTH, FALSE} }; const UINT numConnectingDisableCtlsPDisplay = sizeof(connectingDisableCtlsPDisplay)/ sizeof(connectingDisableCtlsPDisplay[0]); CPropDisplay* CPropDisplay::_pPropDisplayInstance = NULL; CPropDisplay::CPropDisplay(HINSTANCE hInstance, CTscSettings* pTscSet, CSH* pSh) { DC_BEGIN_FN("CPropDisplay"); _hInstance = hInstance; CPropDisplay::_pPropDisplayInstance = this; _pTscSet = pTscSet; _pSh = pSh; TRC_ASSERT(_pTscSet,(TB,_T("_pTscSet is null"))); TRC_ASSERT(_pSh,(TB,_T("_pSh is null"))); if(!LoadDisplayourcesPgStrings()) { TRC_ERR((TB, _T("Failed LoadDisplayourcesPgStrings()"))); } _fSwitchedColorComboBmp = FALSE; DC_END_FN(); } CPropDisplay::~CPropDisplay() { CPropDisplay::_pPropDisplayInstance = NULL; } INT_PTR CALLBACK CPropDisplay::StaticPropPgDisplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { // // Delegate to appropriate instance (only works for single instance dialogs) // DC_BEGIN_FN("StaticDialogBoxProc"); DCINT retVal = 0; TRC_ASSERT(_pPropDisplayInstance, (TB, _T("Display dialog has NULL static instance ptr\n"))); retVal = _pPropDisplayInstance->PropPgDisplayDialogProc( hwndDlg, uMsg, wParam, lParam); DC_END_FN(); return retVal; } INT_PTR CALLBACK CPropDisplay::PropPgDisplayDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { DC_BEGIN_FN("PropPgDisplayDialogProc"); switch(uMsg) { case WM_INITDIALOG: { #ifndef OS_WINCE int i; #endif // // Position the dialog within the tab // SetWindowPos( hwndDlg, HWND_TOP, _rcTabDispayArea.left, _rcTabDispayArea.top, _rcTabDispayArea.right - _rcTabDispayArea.left, _rcTabDispayArea.bottom - _rcTabDispayArea.top, 0); _fSwitchedColorComboBmp = FALSE; // // Fill the color combo up to the current // supported screen depth // InitColorCombo(hwndDlg); InitScreenResTable(); #ifndef OS_WINCE HWND hwndResTrackBar = GetDlgItem( hwndDlg, IDC_RES_SLIDER); if(!hwndResTrackBar) { return FALSE; } SendMessage(hwndResTrackBar, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(0, _numScreenResOptions-1)); SendMessage(hwndResTrackBar, TBM_SETPAGESIZE, (WPARAM) 0, (LPARAM) 1); // // Choose the current entry on the trackbar // int deskWidth = _pTscSet->GetDesktopWidth(); int deskHeight = _pTscSet->GetDesktopHeight(); int curSelection = 0; if(_pTscSet->GetStartFullScreen()) { //Fullscreen is the last option curSelection = _numScreenResOptions - 1; } else { for(i=0; i<_numScreenResOptions; i++) { if(deskWidth == _screenResTable[i].width && deskHeight == _screenResTable[i].height) { curSelection = i; break; } } } SendMessage(hwndResTrackBar, TBM_SETSEL, (WPARAM) TRUE, //redraw (LPARAM) 0); SendMessage(hwndResTrackBar, TBM_SETPOS, (WPARAM) TRUE, //redraw (LPARAM) curSelection); OnUpdateResTrackBar(hwndDlg); #endif CheckDlgButton(hwndDlg, IDC_CHECK_DISPLAY_BBAR, _pTscSet->GetDisplayBBar() ? BST_CHECKED : BST_UNCHECKED); OnUpdateColorCombo(hwndDlg); _pSh->SH_ThemeDialogWindow(hwndDlg, ETDT_ENABLETAB); return TRUE; } break; //WM_INITDIALOG #ifndef OS_WINCE case WM_DISPLAYCHANGE: { OnUpdateResTrackBar(hwndDlg); OnUpdateColorCombo(hwndDlg); } break; case WM_HSCROLL: { OnUpdateResTrackBar(hwndDlg); } break; //WM_HSCROLL #endif case WM_TSC_ENABLECONTROLS: { // // wParam is TRUE to enable controls, // FALSE to disable them // CSH::EnableControls( hwndDlg, connectingDisableCtlsPDisplay, numConnectingDisableCtlsPDisplay, wParam ? TRUE : FALSE); } break; // // On return to connection UI // (e.g after a disconnection) // case WM_TSC_RETURNTOCONUI: { // // Update the controls // #ifndef OS_WINCE OnUpdateResTrackBar(hwndDlg); #endif OnUpdateColorCombo(hwndDlg); } break; case WM_SAVEPROPSHEET: //Intentional fallthru case WM_DESTROY: { // // Save page settings // #ifndef OS_WINCE HWND hwndResTrackBar = GetDlgItem( hwndDlg, IDC_RES_SLIDER); int maxRes = (int)SendMessage( hwndResTrackBar, TBM_GETRANGEMAX, TRUE, 0); int iRes = (int)SendMessage( hwndResTrackBar, TBM_GETPOS, 0, 0); #else int iRes = _numScreenResOptions - 1; int maxRes = iRes; #endif int bppIdx = (int)SendMessage( GetDlgItem(hwndDlg,IDC_COMBO_COLOR_DEPTH), CB_GETCURSEL, 0, 0); _pTscSet->SetColorDepth(g_ColorStringTable[bppIdx].bpp); //rightmost setting, display 'fullscreen' _pTscSet->SetStartFullScreen(iRes == maxRes); _pTscSet->SetDesktopWidth(_screenResTable[iRes].width); _pTscSet->SetDesktopHeight(_screenResTable[iRes].height); BOOL fShowBBar = IsDlgButtonChecked(hwndDlg, IDC_CHECK_DISPLAY_BBAR); _pTscSet->SetDisplayBBar(fShowBBar); // // Flag that we've switched this to allow // proper cleanup on dialog termination // if (_fSwitchedColorComboBmp) { HBITMAP hbmOld = (HBITMAP) SendDlgItemMessage(hwndDlg, IDC_COLORPREVIEW, STM_GETIMAGE, IMAGE_BITMAP, (LPARAM)0); // // Cleanup // if (hbmOld) { DeleteObject(hbmOld); } } } break; //WM_DESTROY case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_COMBO_COLOR_DEPTH: { if(HIWORD(wParam) == CBN_SELCHANGE) { OnUpdateColorCombo( hwndDlg); } } break; } } break; //WM_COMMAND } DC_END_FN(); return 0; } // // Load resources for the local resources dialog // BOOL CPropDisplay::LoadDisplayourcesPgStrings() { DC_BEGIN_FN("LoadDisplayourcesPgStrings"); // // Load color strings // for(int i = 0; i< NUM_COLORSTRINGS; i++) { if (!LoadString( _hInstance, g_ColorStringTable[i].resID, g_ColorStringTable[i].szString, COLOR_STRING_MAXLEN )) { TRC_ERR((TB, _T("Failed to load color string %d"), g_ColorStringTable[i].resID)); return FALSE; } } // // Load display resolution strings // if (!LoadString( _hInstance, UI_IDS_SUPPORTED_RES, _szScreenRes, SH_SHORT_STRING_MAX_LENGTH)) { TRC_ERR((TB, _T("Failed to load UI_IDS_SUPPORTED_RES"))); return FALSE; } if (!LoadString(_hInstance, UI_IDS_FULLSCREEN, _szFullScreen, SH_SHORT_STRING_MAX_LENGTH)) { TRC_ERR((TB, _T("Failed to load UI_IDS_FULLSCREEN"))); return FALSE; } DC_END_FN(); return TRUE; } #ifndef OS_WINCE BOOL CPropDisplay::OnUpdateResTrackBar(HWND hwndPropPage) { DC_BEGIN_FN("OnUpdateResTrackBar"); HWND hwndResTrackBar = GetDlgItem( hwndPropPage, IDC_RES_SLIDER); int maxRes = (int)SendMessage( hwndResTrackBar, TBM_GETRANGEMAX, TRUE, 0); int iRes = (int)SendMessage( hwndResTrackBar, TBM_GETPOS, 0, 0); if(iRes == maxRes) { //rightmost setting, display 'fullscreen' SetDlgItemText( hwndPropPage, IDC_LABEL_SCREENRES, _szFullScreen); } else { LPTSTR szResString = NULL; TRC_ASSERT( iRes < NUM_SCREENRES, (TB,_T("Track bar gives out of range screen res:%d"), iRes)); if(iRes < NUM_SCREENRES) { INT res[2]; res[0] = _screenResTable[iRes].width; res[1] = _screenResTable[iRes].height; szResString = CSH::FormatMessageVArgs(_szScreenRes, res[0], res[1] ); if (szResString) { SetDlgItemText( hwndPropPage, IDC_LABEL_SCREENRES, szResString); LocalFree(szResString); szResString = NULL; } else { TRC_ERR((TB,_T("FormatMessage failed 0x%x"), GetLastError())); } } } DC_END_FN(); return TRUE; } #endif BOOL CPropDisplay::OnUpdateColorCombo(HWND hwndPropPage) { // // Update the color picker // HWND hwndColorCombo = GetDlgItem( hwndPropPage, IDC_COMBO_COLOR_DEPTH); int curColorSel = SendMessage( (HWND)hwndColorCombo, CB_GETCURSEL, 0, 0); UINT screenBpp = 0; if(curColorSel >= 0 && curColorSel < NUM_COLORSTRINGS) { int bmpResID = g_ColorStringTable[curColorSel].bitmapResID; HBITMAP hbm = NULL; screenBpp = CSH::SH_GetScreenBpp(); if(screenBpp <= 8) { // // Low color // bmpResID = g_ColorStringTable[curColorSel].bitmapLowColorResID; } #ifdef OS_WINCE hbm = (HBITMAP)LoadImage(_hInstance, MAKEINTRESOURCE(bmpResID), IMAGE_BITMAP, 0, 0, 0); #else hbm = (HBITMAP)LoadImage(_hInstance, MAKEINTRESOURCE(bmpResID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); #endif if (hbm) { HBITMAP hbmOld = (HBITMAP) SendDlgItemMessage(hwndPropPage, IDC_COLORPREVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbm); // // Flag that we've switched this to allow // proper cleanup on dialog termination // _fSwitchedColorComboBmp = TRUE; if (hbmOld) { DeleteObject(hbmOld); } } } return TRUE; } // // Build the table of valid screen size settings // The table (_screenResTable) is the union of: // - entries of g_ScreenResolutions up to and including max resolution // - the system max resolution (if not present in g_ScreenResolutions) // - a fullscreen entry (max resolution in fullscreen) // void CPropDisplay::InitScreenResTable() { DC_BEGIN_FN("InitScreenResTable"); RECT rcMaxScreen; _numScreenResOptions = 0; int xMaxSize = 0; int yMaxSize = 0; if (CSH::GetLargestMonitorRect(&rcMaxScreen)) { xMaxSize = rcMaxScreen.right - rcMaxScreen.left; yMaxSize = rcMaxScreen.bottom - rcMaxScreen.top; } else { xMaxSize = GetSystemMetrics(SM_CXSCREEN); yMaxSize = GetSystemMetrics(SM_CYSCREEN); } xMaxSize = xMaxSize > MAX_DESKTOP_WIDTH ? MAX_DESKTOP_WIDTH : xMaxSize; yMaxSize = yMaxSize > MAX_DESKTOP_HEIGHT ? MAX_DESKTOP_HEIGHT : yMaxSize; BOOL bAddedLargest = FALSE; for(int i=0; i xMaxSize || g_ScreenResolutions[i].height > yMaxSize) { break; } else if (g_ScreenResolutions[i].width == xMaxSize && g_ScreenResolutions[i].height == yMaxSize) { bAddedLargest = TRUE; } _screenResTable[i].width = g_ScreenResolutions[i].width; _screenResTable[i].height = g_ScreenResolutions[i].height; _numScreenResOptions++; } if(!bAddedLargest) { //Screen size is not in the table so add it _screenResTable[_numScreenResOptions].width = xMaxSize; _screenResTable[_numScreenResOptions].height = yMaxSize; _numScreenResOptions++; } // // Now add an entry for fullscreen // _screenResTable[_numScreenResOptions].width = xMaxSize; _screenResTable[_numScreenResOptions].height = yMaxSize; _numScreenResOptions++; DC_END_FN(); } void CPropDisplay::InitColorCombo(HWND hwndPropPage) { DC_BEGIN_FN("InitColorCombo"); HDC hdc = GetDC(NULL); TRC_ASSERT((NULL != hdc), (TB,_T("Failed to get DC"))); int screenBpp = 8; if(hdc) { screenBpp = GetDeviceCaps(hdc, BITSPIXEL); TRC_NRM((TB, _T("HDC %p has %u bpp"), hdc, screenBpp)); ReleaseDC(NULL, hdc); } // // We support only 256 color or higher, so on 16 color, we will // display 256 color // if (screenBpp < 8) { screenBpp = 8; } int selectedBpp = _pTscSet->GetColorDepth(); int selectedBppIdx = 0; // // This call can be used to re-intialize a combo // so delete any items first // #ifndef OS_WINCE INT ret = 1; while(ret && ret != CB_ERR) { ret = SendDlgItemMessage(hwndPropPage, IDC_COMBO_COLOR_DEPTH, CBEM_DELETEITEM, 0,0); } #else SendDlgItemMessage(hwndPropPage, IDC_COMBO_COLOR_DEPTH, CB_RESETCONTENT, 0, 0); #endif for(int i=0; i screenBpp) { break; } else { if(selectedBpp == g_ColorStringTable[i].bpp) { selectedBppIdx = i; } SendDlgItemMessage(hwndPropPage, IDC_COMBO_COLOR_DEPTH, CB_ADDSTRING, 0, (LPARAM)(PDCTCHAR)g_ColorStringTable[i].szString); } } SendDlgItemMessage(hwndPropPage, IDC_COMBO_COLOR_DEPTH,CB_SETCURSEL, (WPARAM)selectedBppIdx,0); DC_END_FN(); }