Windows2003-3790/termsrv/newclient/clshell/propdisplay.cpp
2020-09-30 16:53:55 +02:00

614 lines
18 KiB
C++

//
// 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 <atrcapi.h>
#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<NUM_SCREENRES; i++)
{
if(g_ScreenResolutions[i].width > 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<NUM_COLORSTRINGS; i++)
{
if(g_ColorStringTable[i].bpp > 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();
}