// // maindlg.cpp: main dialog box // gathers connection info and hosts tabs // // Copyright Microsoft Corportation 2000 // (nadima) // #include "stdafx.h" #define TRC_GROUP TRC_GROUP_UI #define TRC_FILE "maindlg.cpp" #include #include "maindlg.h" #include "discodlg.h" #include "validatedlg.h" #include "aboutdlg.h" #include "sh.h" #include "commctrl.h" #include "browsedlg.h" #include "propgeneral.h" #include "proplocalres.h" #include "propdisplay.h" #include "proprun.h" #include "propperf.h" // // Background color to fill padding area after branding img // #define IMAGE_BG_COL RGB(0x29,0x47,0xDA) // Low color #define IMAGE_BG_COL_16 RGB(0,0,0xFF) // // Controls which need to be moved when dialog // is resized // UINT moveableControls[] = {IDOK, IDCANCEL, ID_BUTTON_LOGON_HELP, ID_BUTTON_OPTIONS}; UINT numMoveableControls = sizeof(moveableControls)/sizeof(UINT); // // Controls that are only visible/enabled on less // UINT lessUI[] = { UI_IDC_COMPUTER_NAME_STATIC, IDC_COMBO_SERVERS }; UINT numLessUI = sizeof(lessUI)/sizeof(UINT); // // Controls that are only visibile/enabled on more // UINT moreUI[] = {IDC_TABS}; UINT numMoreUI = sizeof(moreUI)/sizeof(UINT); // // Controls that need to be disabled/enabled // during connection // UINT connectingDisableControls[] = {IDOK, ID_BUTTON_LOGON_HELP, ID_BUTTON_OPTIONS, IDC_TABS, IDC_COMBO_SERVERS, IDC_COMBO_MAIN_OPTIMIZE, UI_IDC_COMPUTER_NAME_STATIC, UI_IDC_MAIN_OPTIMIZE_STATIC}; const UINT numConnectingDisableControls = sizeof(connectingDisableControls) / sizeof(UINT); BOOL g_fPropPageStringMapInitialized = FALSE; PERFOPTIMIZESTRINGMAP g_PerfOptimizeStringTable[] = { {UI_IDS_OPTIMIZE_28K, TEXT("")}, {UI_IDS_OPTIMIZE_56K, TEXT("")}, {UI_IDS_OPTIMIZE_BROADBAND, TEXT("")}, {UI_IDS_OPTIMIZE_LAN, TEXT("")}, {UI_IDS_OPTIMIZE_MAIN_CUSTOM, TEXT("")}, {UI_IDS_OPTIMIZE_CUSTOM, TEXT("")} }; #define NUM_PERFSTRINGS sizeof(g_PerfOptimizeStringTable) / \ sizeof(PERFOPTIMIZESTRINGMAP) CMainDlg* CMainDlg::_pMainDlgInstance = NULL; // // UNIWRAP WARNING ~*~*~*~*~*~*~*~*~*~*~*~*~*~~*~*~*~*~*~*~*~*~**~*~*~ // TabControl messages need to be wrapped in the SendMessageThunk // in uniwrap so the tab control works on 9x with an ANSI comctl32.dll. // // If you add anything to the tab control code, make sure it is // handled by the wrapper. // // CMainDlg::CMainDlg( HWND hwndOwner, HINSTANCE hInst, CSH* pSh, CContainerWnd* pContainerWnd, CTscSettings* pTscSettings, BOOL fStartExpanded, INT nStartTab) : CDlgBase( hwndOwner, hInst, UI_IDD_TS_LOGON), _pSh(pSh), _pContainerWnd(pContainerWnd), _pTscSettings(pTscSettings), _fStartExpanded(fStartExpanded), _nStartTab(nStartTab) { DC_BEGIN_FN("CMainDlg"); TRC_ASSERT((NULL == CMainDlg::_pMainDlgInstance), (TB,_T("Clobbering existing dlg instance pointer\n"))); TRC_ASSERT((_pSh), (TB,_T("CMainDlg was passed null _pSh\n"))); TRC_ASSERT(pContainerWnd, (TB, _T("Null container wnd pointer\n"))); TRC_ASSERT(_pTscSettings, (TB, _T("NULL _pTscSettings pointer\n"))); CMainDlg::_pMainDlgInstance = this; _fShowExpanded = FALSE; _pGeneralPg = NULL; _pLocalResPg = NULL; _pPropDisplayPg = NULL; _pRunPg = NULL; _pPerfPg = NULL; _nBrandImageHeight = 0; _nBrandImageWidth = 0; _lastValidBpp = 0; _hBrandPal = NULL; _hBrandImg = NULL; _hwndRestoreFocus = NULL; #ifndef OS_WINCE _pProgBand = NULL; #endif _connectionState = stateNotConnected; #ifdef OS_WINCE _fVgaDisplay = (GetSystemMetrics(SM_CYSCREEN) < 480); //use a small dialog template if we are running in a smaller screen if (_fVgaDisplay) { _dlgResId = UI_IDD_TS_LOGON_VGA; } #endif InitializePerfStrings(); DC_END_FN(); } CMainDlg::~CMainDlg() { CMainDlg::_pMainDlgInstance = NULL; delete _pGeneralPg; delete _pLocalResPg; delete _pPropDisplayPg; delete _pRunPg; delete _pPerfPg; #ifndef OS_WINCE if (_pProgBand) { delete _pProgBand; } #endif } HWND CMainDlg::StartModeless() { DC_BEGIN_FN("StartModeless"); #ifdef OS_WINCE INITCOMMONCONTROLSEX cex; cex.dwSize = sizeof(INITCOMMONCONTROLSEX); cex.dwICC = ICC_TAB_CLASSES; if(!InitCommonControlsEx( &cex )) { TRC_ABORT((TB,_T("InitCommonControlsEx failed 0x%x"), GetLastError())); } #endif _hwndDlg = CreateDialog(_hInstance, MAKEINTRESOURCE(_dlgResId), _hwndOwner, StaticDialogBoxProc); TRC_ASSERT(_hwndDlg, (TB,_T("CreateDialog failed"))); DC_END_FN(); return _hwndDlg; } INT_PTR CALLBACK CMainDlg::StaticDialogBoxProc (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(_pMainDlgInstance, (TB, _T("Logon dialog has NULL static instance ptr\n"))); if(_pMainDlgInstance) { retVal = _pMainDlgInstance->DialogBoxProc( hwndDlg, uMsg, wParam, lParam); } DC_END_FN(); return retVal; } // // Name: DialogBoxProc // // Purpose: Handles Main dialog // // Returns: TRUE if message dealt with // FALSE otherwise // // Params: See window documentation // // INT_PTR CALLBACK CMainDlg::DialogBoxProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR rc = FALSE; #ifndef OS_WINCE DCUINT intRC ; #endif DC_BEGIN_FN("DialogBoxProc"); switch (uMsg) { case WM_INITDIALOG: { _hwndDlg = hwndDlg; SetDialogAppIcon(hwndDlg); if(!_pSh || !_pContainerWnd) { return FALSE; } CenterWindow(NULL, 2, 4); SetForegroundWindow(hwndDlg); //turn off maximize box LONG style = GetWindowLong(hwndDlg, GWL_STYLE); style &= ~(WS_MAXIMIZEBOX); SetWindowLong( hwndDlg, GWL_STYLE, style); // // Bind this dialog to the container window // there is logic where these two windows need to interact // e.g during a connect: // if error occurs the error dialog is brought up modal wrt // to the connect dialog // also when connect completes it is the container window // that dismisses this dialog // _pContainerWnd->SetConnectDialogHandle( hwndDlg); _lastValidBpp = CSH::SH_GetScreenBpp(); #ifndef OS_WINCE if(!InitializeBmps()) { TRC_ERR((TB,_T("InitializeBmps failed"))); } _pProgBand = new CProgressBand(hwndDlg, _hInstance, _nBrandImageHeight, UI_IDB_PROGRESS_BAND8, UI_IDB_PROGRESS_BAND4, _hBrandPal); if (_pProgBand) { if (!_pProgBand->Initialize()) { TRC_ERR((TB,_T("Progress band failed to init"))); delete _pProgBand; _pProgBand = NULL; } } SetupDialogSysMenu(); #endif //OS_WINCE // // Setup the server combo box // HWND hwndSrvCombo = GetDlgItem(hwndDlg, IDC_COMBO_SERVERS); CSH::InitServerAutoCmplCombo( _pTscSettings, hwndSrvCombo); SetWindowText( hwndSrvCombo, _pTscSettings->GetFlatConnectString() ); SetFocus(GetDlgItem(hwndDlg, IDC_COMBO_SERVERS)); SetForegroundWindow(hwndDlg); // // Load the button text for the Options button // if (!LoadString( _hInstance, UI_IDS_OPTIONS_MORE, _szOptionsMore, OPTIONS_STRING_MAX_LEN )) { // Some problem with the resources. TRC_SYSTEM_ERROR("LoadString"); TRC_ERR((TB, _T("Failed to load string ID:%u"), UI_IDS_OPTIONS_MORE)); // // splat something in to keep running // DC_TSTRCPY(_szOptionsMore, TEXT("")); } if (!LoadString( _hInstance, UI_IDS_CLOSE_TEXT, _szCloseText, SIZECHAR(_szCloseText))) { // Some problem with the resources. TRC_ERR((TB, _T("Failed to load string ID:%u : err:%d"), UI_IDS_CLOSE_TEXT, GetLastError())); DC_TSTRCPY(_szCloseText, TEXT("")); } if (!LoadString( _hInstance, UI_IDS_CANCEL_TEXT, _szCancelText, SIZECHAR(_szCancelText))) { // Some problem with the resources. TRC_ERR((TB, _T("Failed to load string ID:%u : err:%d"), UI_IDS_CANCEL_TEXT, GetLastError())); DC_TSTRCPY(_szCancelText, TEXT("")); } if (!LoadString( _hInstance, UI_IDS_OPTIONS_LESS, _szOptionsLess, OPTIONS_STRING_MAX_LEN )) { // Some problem with the resources. TRC_SYSTEM_ERROR("LoadString"); TRC_ERR((TB, _T("Failed to load string ID:%u"), UI_IDS_OPTIONS_LESS)); // // splat something in to keep running // DC_TSTRCPY(_szOptionsLess, TEXT("")); } SetWindowText(GetDlgItem(_hwndDlg,ID_BUTTON_OPTIONS), _fShowExpanded ? _szOptionsLess : _szOptionsMore); // // Make sure the 'more' UI is disabled // EnableControls(moreUI, numMoreUI, FALSE); InitTabs(); if(_fStartExpanded) { //go expanded ToggleExpandedState(); int foo = TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TABS), _nStartTab); //SetCurSel does not send a TCN_SELCHANGE OnTabSelChange(); } #ifdef OS_WINCE if ((GetFileAttributes(PEGHELP_EXE) == -1)|| (GetFileAttributes(TSC_HELP_FILE) == -1)) { LONG lRetVal = 0; lRetVal = GetWindowLong(_hwndDlg, GWL_STYLE); SetWindowLong(_hwndDlg, GWL_EXSTYLE, WS_EX_WINDOWEDGE); if (lRetVal != 0) { SetWindowLong(_hwndDlg, GWL_STYLE, lRetVal); } rc = SetWindowPos(_hwndDlg,NULL,0,0,0,0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); } #endif rc = TRUE; } break; #ifdef OS_WINCE case WM_CLOSE: { if(stateConnecting == _connectionState) { //Cancel the connection TRC_NRM((TB, _T("User cancel connect from maindlg"))); _pContainerWnd->Disconnect(); } else { DlgToSettings(); EndDialog(hwndDlg, IDCANCEL); PostMessage(_pContainerWnd->GetWndHandle(), WM_CLOSE, 0, 0); } } break; #endif case UI_SHOW_DISC_ERR_DLG: { // // If this assert fired something went wrong in the states // because we should have left the connecting state as the // first step of receiving an OnDisconnected notification // with WM_TSC_DISCONNECTED. // TRC_ASSERT(_connectionState != stateConnecting, (TB,_T("In connecting state when received Err Dlg popup"))); SetConnectionState( stateNotConnected ); CDisconnectedDlg disconDlg(hwndDlg, _hInstance, _pContainerWnd); disconDlg.SetDisconnectReason( wParam); disconDlg.SetExtendedDiscReason( (ExtendedDisconnectReasonCode) lParam ); disconDlg.DoModal(); } break; case WM_TSC_DISCONNECTED: //intentional fallthru case WM_TSC_CONNECTED: { // // Either we connected or got disconnected // while connecting. In either case the connection // has ended so leave the connecting state. // if (stateNotConnected != _connectionState) { // // Only end connecting if we're not already disconnected // OnEndConnection((WM_TSC_CONNECTED == uMsg)); } } break; // // On return to connection UI // (e.g after a disconnection) // case WM_TSC_RETURNTOCONUI: { // // Reset the server combo to force it to repaint // this is a minor hack to fix the ComboBoxEx // which doesn't want to repaint itself on return // to the dialog. // HWND hwndSrvCombo = GetDlgItem(hwndDlg, IDC_COMBO_SERVERS); SetWindowText( hwndSrvCombo, _pTscSettings->GetFlatConnectString()); // // Notify the active property page // if(_fShowExpanded && _tabDlgInfo.hwndCurPropPage) { SendMessage(_tabDlgInfo.hwndCurPropPage, WM_TSC_RETURNTOCONUI, 0, 0); } // // Give the default button style back to the connect // button and remove it from the cancel button. // While connecting we disable the connect (IDOK) button // so it is possible that the style goes to the Close/Cancel // button which confuses the user since the IDOK handler // is always for the connect button // SendDlgItemMessage(hwndDlg, IDCANCEL, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE,0)); SendDlgItemMessage(hwndDlg, IDOK, BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE,0)); } break; #ifndef OS_WINCE case WM_ERASEBKGND: { HDC hDC = (HDC)wParam; HPALETTE oldPalette = NULL; if (_hBrandPal) { oldPalette = SelectPalette(hDC, _hBrandPal, FALSE); RealizePalette(hDC); } rc = PaintBrandImage(hwndDlg, (HDC)wParam, COLOR_BTNFACE ); if (_pProgBand) { _pProgBand->OnEraseParentBackground((HDC)wParam); } if ( oldPalette ) { SelectPalette(hDC, oldPalette, TRUE); } } break; case WM_TIMER: { if (_pProgBand) { _pProgBand->OnTimer((INT)wParam); } } break; #endif // OS_WINCE case WM_COMMAND: { switch(DC_GET_WM_COMMAND_ID(wParam)) { case IDOK: { // // Update dialog with properties from active prop page // if(_fShowExpanded && _tabDlgInfo.hwndCurPropPage) { SendMessage(_tabDlgInfo.hwndCurPropPage, WM_SAVEPROPSHEET, 0, 0); } if(!_fShowExpanded) { //We're on the minimal tab //copy dlg settings tscSettings DlgToSettings(); } TCHAR szServer[TSC_MAX_ADDRESS_LENGTH]; _tcsncpy(szServer, _pTscSettings->GetFlatConnectString(), SIZECHAR(szServer)); _pSh->SH_CanonicalizeServerName(szServer); BOOL bValidate = CRdpConnectionString::ValidateServerPart(szServer); if(!bValidate) { // // context sensitive help in validatedlg // needs in handle to main window // CValidateDlg validateDlg(hwndDlg, _hInstance, _pContainerWnd->GetWndHandle(), _pSh); validateDlg.DoModal(); // // Clear and set the focus on the server edit well // HWND hwndSrvItem = NULL; if(_fShowExpanded) { hwndSrvItem = GetDlgItem(_tabDlgInfo.hwndCurPropPage, IDC_GENERAL_COMBO_SERVERS); } else { hwndSrvItem = GetDlgItem(hwndDlg, IDC_COMBO_SERVERS); } if(hwndSrvItem) { SetWindowText(hwndSrvItem, _T("")); TRC_DBG((TB, _T("Set focus to edit box"))); SetFocus(hwndSrvItem); } break; } else { // // It's all good // _pTscSettings->SetConnectString(szServer); // // We have to kick off the connection // while the dialog is still active // in case it fails, we want the error message // to be parented off the connection dialog. // // Code in the parent window will dismiss this // dialog when the connection (which is asynchronous) // completes. // OnStartConnection(); if(!_pContainerWnd->StartConnection()) { TRC_ERR((TB,_T("StartConnection failed"))); //Async connection start failed so end OnEndConnection(FALSE); break; } } } break; case IDCANCEL: { if(stateConnecting == _connectionState) { //Cancel the connection TRC_NRM((TB, _T("User cancel connect from maindlg"))); _pContainerWnd->Disconnect(); } else { DlgToSettings(); EndDialog(hwndDlg, IDCANCEL); PostMessage(_pContainerWnd->GetWndHandle(), WM_CLOSE, 0, 0); } } break; case ID_BUTTON_LOGON_HELP: { TRC_NRM((TB, _T("Display the appropriate help page"))); if(_pContainerWnd->GetWndHandle()) { #ifndef OS_WINCE _pSh->SH_DisplayClientHelp( _pContainerWnd->GetWndHandle(), HH_DISPLAY_TOPIC); #endif // OS_WINCE } } break; case ID_BUTTON_OPTIONS: { // // Need to do the switch to/from the expanded dialog // ToggleExpandedState(); } break; case IDC_NEXTTAB: case IDC_PREVTAB: { // // Only allow toggle of UI tabs while not connected // since in the connecting state the UI elements other // than the cancel button are meant to be disabled // if(_fShowExpanded && (_connectionState == stateNotConnected)) { int iSel = TabCtrl_GetCurSel( GetDlgItem( _hwndDlg, IDC_TABS)); iSel += (DC_GET_WM_COMMAND_ID(wParam) == IDC_NEXTTAB) ? 1 : -1; if(iSel >= NUM_TABS) { iSel = 0; } else if(iSel < 0) { iSel = NUM_TABS - 1; } TabCtrl_SetCurSel( GetDlgItem( _hwndDlg, IDC_TABS), iSel); //SetCurSel does not send a TCN_SELCHANGE OnTabSelChange(); } } break; case IDC_COMBO_SERVERS: { // // Bring up the brwse for servers dlg // if the user chose the last item in the combo // if(HIWORD(wParam) == CBN_SELCHANGE) { CSH::HandleServerComboChange( (HWND)lParam, hwndDlg, _hInstance, (LPTSTR)_pTscSettings->GetFlatConnectString() ); } } break; } } break; //WM_COMMAND // // tab notification // case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR) lParam; if(pnmh) { switch( pnmh->code) { case TCN_SELCHANGE: { OnTabSelChange(); } break; } } } break; case WM_SYSCOMMAND: { if(UI_IDM_ABOUT == DC_GET_WM_COMMAND_ID(wParam)) { // Show the about box dialog CAboutDlg aboutDialog( hwndDlg, _hInstance, _pSh->GetCipherStrength(), _pSh->GetControlVersionString()); aboutDialog.DoModal(); } } break; case WM_UPDATEFROMSETTINGS: { SettingsToDlg(); // // Update the server MRU list // HWND hwndSrvCombo = GetDlgItem(hwndDlg, IDC_COMBO_SERVERS); CSH::InitServerAutoCmplCombo( _pTscSettings, hwndSrvCombo); SetWindowText( hwndSrvCombo, _pTscSettings->GetFlatConnectString() ); if(_fShowExpanded && _tabDlgInfo.hwndCurPropPage) { SendMessage(_tabDlgInfo.hwndCurPropPage, WM_INITDIALOG, 0, 0); } } break; case WM_SETTINGCHANGE: //fall thru case WM_SYSCOLORCHANGE: //fall thru #ifndef OS_WINCE case WM_DISPLAYCHANGE: //fall thru #endif { UINT screenBpp = CSH::SH_GetScreenBpp(); if(_lastValidBpp != screenBpp) { //Screen color depth changed TRC_NRM((TB,_T("Detected color depth change from:%d to %d"), _lastValidBpp, screenBpp)); #ifndef OS_WINCE // // Reload the bitmaps // TRC_NRM((TB,_T("Reloading images"))); if (_pProgBand) { if (!_pProgBand->ReLoadBmps()) { TRC_ERR((TB,_T("ReLoadBitmaps failed"))); } } if(InitializeBmps()) { //trigger a repaint InvalidateRect( _hwndDlg, NULL, TRUE); } else { TRC_ERR((TB,_T("InitializeBmps failed"))); } #endif } PropagateMsgToChildren(hwndDlg, uMsg, wParam, lParam); } break; #ifndef OS_WINCE case WM_QUERYNEWPALETTE: { rc = BrandingQueryNewPalette(hwndDlg); InvalidateRect(hwndDlg, NULL, TRUE); UpdateWindow(hwndDlg); } break; case WM_PALETTECHANGED: { rc = BrandingPaletteChanged(hwndDlg, (HWND)wParam); InvalidateRect(hwndDlg, NULL, TRUE); UpdateWindow(hwndDlg); } break; #endif case WM_HELP: { _pSh->SH_DisplayClientHelp( hwndDlg, HH_DISPLAY_TOPIC); } break; case WM_DESTROY: { if (_hBrandPal) { DeleteObject(_hBrandPal); _hBrandPal = NULL; } if (_hBrandImg) { DeleteObject(_hBrandImg); _hBrandImg = NULL; } } break; default: { rc = CDlgBase::DialogBoxProc(hwndDlg, uMsg, wParam, lParam); } break; } DC_END_FN(); return(rc); } /* UILogonDialogBox */ // // save from UI->tscSettings // void CMainDlg::DlgToSettings() { TCHAR szServer[SH_MAX_ADDRESS_LENGTH]; int optLevel = 0; DC_BEGIN_FN("DlgToSettings"); TRC_ASSERT(_pTscSettings, (TB,_T("_pTscSettings is null"))); TRC_ASSERT(_hwndDlg, (TB,_T("_hwndDlg is null"))); // // Get the server // GetDlgItemText( _hwndDlg, IDC_COMBO_SERVERS, szServer, SIZECHAR(szServer)); _pTscSettings->SetConnectString(szServer); DC_END_FN(); } // // save from UI->tscSettings // void CMainDlg::SettingsToDlg() { DC_BEGIN_FN("SettingsToDlg"); TRC_ASSERT(_pTscSettings, (TB,_T("_pTscSettings is null"))); TRC_ASSERT(_hwndDlg, (TB,_T("_hwndDlg is null"))); SetDlgItemText(_hwndDlg, IDC_COMBO_SERVERS, (LPCTSTR) _pTscSettings->GetFlatConnectString()); DC_END_FN(); } // // Toggles the expanded state of the dialog // void CMainDlg::ToggleExpandedState() { DC_BEGIN_FN("ToggleExpandedState"); WINDOWPLACEMENT wndPlc; wndPlc.length = sizeof(WINDOWPLACEMENT); _fShowExpanded = !_fShowExpanded; #ifndef OS_WINCE // // Expand/contract the dlg height // GetWindowPlacement( _hwndDlg, &wndPlc); int cx = wndPlc.rcNormalPosition.right - wndPlc.rcNormalPosition.left; int cy = wndPlc.rcNormalPosition.bottom - wndPlc.rcNormalPosition.top; #else RECT wndRect; GetWindowRect(_hwndDlg, &wndRect); int cx = wndRect.right - wndRect.left; int cy = wndRect.bottom - wndRect.top; #endif #ifndef OS_WINCE int dlgExpDlu = LOGON_DLG_EXPAND_AMOUNT; #else int dlgExpDlu = (_fVgaDisplay) ? LOGON_DLG_EXPAND_AMOUNT_VGA : LOGON_DLG_EXPAND_AMOUNT; #endif RECT rc; rc.left = 0; rc.right = 100; //don't care about horiz, dummy vals rc.top = 0; rc.bottom = dlgExpDlu; if(!MapDialogRect(_hwndDlg, &rc)) { TRC_ASSERT(NULL,(TB,_T("MapDialogRect failed"))); } int dlgExpandAmountPels = rc.bottom - rc.top; // // Compute the dialog vertical expand amount in pixels // given a dlu based expand size // cy += _fShowExpanded ? dlgExpandAmountPels : -dlgExpandAmountPels; SetWindowPos( _hwndDlg, NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER); // // Reposition the controls that need to be moved // RepositionControls( 0, _fShowExpanded ? dlgExpandAmountPels : -dlgExpandAmountPels, moveableControls, numMoveableControls); if(_fShowExpanded) { //we're going expanded save to settings so more //tab can initiliaze from most recent values. //must happen before tab sel change (prop pg init) DlgToSettings(); } // // Kill/activate prop page on tab dlg // OnTabSelChange(); if(!_fShowExpanded) { //going to less mode, init dialog with settings SettingsToDlg(); } // // Options button text // SetWindowText(GetDlgItem(_hwndDlg,ID_BUTTON_OPTIONS), _fShowExpanded ? _szOptionsLess : _szOptionsMore); // // Disable+Hide uneeded UI for this mode // EnableControls(lessUI, numLessUI, !_fShowExpanded); EnableControls(moreUI, numMoreUI, _fShowExpanded); SetFocus(GetDlgItem(_hwndDlg,ID_BUTTON_OPTIONS)); DC_END_FN(); } // // Initialize the tabs on the main dialog // BOOL CMainDlg::InitTabs() { TCITEM tie; #ifndef OS_WINCE INITCOMMONCONTROLSEX cex; RECT rcTabDims; #endif POINT tabDims; int ret = -1; DC_BEGIN_FN("InitTabs"); if(!_hwndDlg) { return FALSE; } HWND hwndTab = GetDlgItem( _hwndDlg, IDC_TABS); if(!hwndTab) { return FALSE; } #ifndef OS_WINCE cex.dwSize = sizeof(INITCOMMONCONTROLSEX); cex.dwICC = ICC_TAB_CLASSES; if(!InitCommonControlsEx( &cex )) { TRC_ABORT((TB,_T("InitCommonControlsEx failed 0x%x"), GetLastError())); } #endif _pGeneralPg = new CPropGeneral(_hInstance, _pTscSettings, _pSh); if(!_pGeneralPg) { return FALSE; } _pLocalResPg = new CPropLocalRes(_hInstance, _pTscSettings, _pSh); if(!_pLocalResPg) { return FALSE; } _pPropDisplayPg = new CPropDisplay(_hInstance, _pTscSettings, _pSh); if(!_pPropDisplayPg) { return FALSE; } _pRunPg = new CPropRun(_hInstance, _pTscSettings, _pSh); if(!_pRunPg) { return FALSE; } _pPerfPg = new CPropPerf(_hInstance, _pTscSettings, _pSh); if(!_pPerfPg) { return FALSE; } tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.iImage = -1; TCHAR szTabName[MAX_PATH]; //general tab if (!LoadString( _hInstance, UI_IDS_GENERAL_TAB_NAME, szTabName, SIZECHAR(szTabName) )) { return FALSE; } tie.pszText = szTabName; ret = TabCtrl_InsertItem( hwndTab, 0, &tie); TRC_ASSERT(ret != -1, (TB,_T("TabCtrl_InsertItem failed %d"), GetLastError())); //display tab if (!LoadString( _hInstance, UI_IDS_DISPLAY_TAB_NAME, szTabName, SIZECHAR(szTabName))) { return FALSE; } tie.pszText = szTabName; ret = TabCtrl_InsertItem( hwndTab, 1, &tie); TRC_ASSERT(ret != -1, (TB,_T("TabCtrl_InsertItem failed %d"), GetLastError())); //local resources tab if (!LoadString( _hInstance, UI_IDS_LOCAL_RESOURCES_TAB_NAME, szTabName, SIZECHAR(szTabName))) { return FALSE; } tie.pszText = szTabName; ret = TabCtrl_InsertItem( hwndTab, 2, &tie); TRC_ASSERT(ret != -1, (TB,_T("TabCtrl_InsertItem failed %d"), GetLastError())); //run tab if (!LoadString( _hInstance, UI_IDS_RUN_TAB_NAME, szTabName, SIZECHAR(szTabName))) { return FALSE; } tie.pszText = szTabName; ret = TabCtrl_InsertItem( hwndTab, 3, &tie); TRC_ASSERT(ret != -1, (TB,_T("TabCtrl_InsertItem failed %d"), GetLastError())); //advanced tab if (!LoadString( _hInstance, UI_IDS_PERF_TAB_NAME, szTabName, SIZECHAR(szTabName))) { return FALSE; } tie.pszText = szTabName; ret = TabCtrl_InsertItem( hwndTab, 4, &tie); TRC_ASSERT(ret != -1, (TB,_T("TabCtrl_InsertItem failed %d"), GetLastError())); // // Determine bounding rect for child dialogs // #ifndef OS_WINCE RECT winRect; #endif GetWindowRect( hwndTab ,&_rcTab); TabCtrl_AdjustRect( hwndTab, FALSE, &_rcTab); MapWindowPoints( NULL, _hwndDlg, (LPPOINT)&_rcTab, 2); tabDims.x = _rcTab.right - _rcTab.left; tabDims.y = _rcTab.bottom - _rcTab.top; _tabDlgInfo.pdlgTmpl[0] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_GENERAL)); _tabDlgInfo.pDlgProc[0] = CPropGeneral::StaticPropPgGeneralDialogProc; _tabDlgInfo.pdlgTmpl[1] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_DISPLAY)); _tabDlgInfo.pDlgProc[1] = CPropDisplay::StaticPropPgDisplayDialogProc; _tabDlgInfo.pdlgTmpl[2] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_LOCALRESOURCES)); _tabDlgInfo.pDlgProc[2] = CPropLocalRes::StaticPropPgLocalResDialogProc; _tabDlgInfo.pdlgTmpl[3] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_RUN)); _tabDlgInfo.pDlgProc[3] = CPropRun::StaticPropPgRunDialogProc; _tabDlgInfo.pdlgTmpl[4] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_PERF)); _tabDlgInfo.pDlgProc[4] = CPropPerf::StaticPropPgPerfDialogProc; #ifdef OS_WINCE if (_fVgaDisplay) { _tabDlgInfo.pdlgTmpl[0] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_GENERAL_VGA)); _tabDlgInfo.pdlgTmpl[1] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_DISPLAY_VGA)); _tabDlgInfo.pdlgTmpl[2] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_LOCALRESOURCES_VGA)); _tabDlgInfo.pdlgTmpl[3] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_RUN_VGA)); _tabDlgInfo.pdlgTmpl[4] = DoLockDlgRes(MAKEINTRESOURCE(UI_IDD_PROPPAGE_PERF_VGA)); } #endif _tabDlgInfo.hwndCurPropPage = NULL; _pGeneralPg->SetTabDisplayArea(_rcTab); _pPropDisplayPg->SetTabDisplayArea(_rcTab); _pLocalResPg->SetTabDisplayArea(_rcTab); _pRunPg->SetTabDisplayArea(_rcTab); _pPerfPg->SetTabDisplayArea(_rcTab); // // Trigger first tab selection // OnTabSelChange(); DC_END_FN(); return TRUE; } // // Tab selection has changed // BOOL CMainDlg::OnTabSelChange() { DC_BEGIN_FN("OnTabSelChange"); int iSel = TabCtrl_GetCurSel( GetDlgItem( _hwndDlg, IDC_TABS)); // // Destroy current child dialog if any // TRC_ASSERT( iSel >=0 && iSel < NUM_TABS, (TB,_T("Tab selection out of range %d"), iSel)); if(iSel < 0 || iSel > NUM_TABS) { return FALSE; } if(_tabDlgInfo.hwndCurPropPage) { DestroyWindow(_tabDlgInfo.hwndCurPropPage); } // // Only bring in a new tab if we are in expanded mode // if(_fShowExpanded) { _tabDlgInfo.hwndCurPropPage = CreateDialogIndirect( _hInstance, _tabDlgInfo.pdlgTmpl[iSel], _hwndDlg, _tabDlgInfo.pDlgProc[iSel]); ShowWindow(_tabDlgInfo.hwndCurPropPage, SW_SHOW); #ifdef OS_WINCE SetFocus (GetDlgItem (_hwndDlg, IDOK)); #endif } DC_END_FN(); return TRUE; } #ifndef OS_WINCE // // Add an 'About' entry to the dialog's system menu // void CMainDlg::SetupDialogSysMenu() { DC_BEGIN_FN("SetupDialogSysMenu"); HANDLE hSystemMenu = GetSystemMenu(_hwndDlg, FALSE); DCTCHAR menuStr[SH_SHORT_STRING_MAX_LENGTH]; if(hSystemMenu) { // // Disable sizing and maximizing // EnableMenuItem((HMENU)hSystemMenu, SC_MAXIMIZE, MF_GRAYED | MF_BYCOMMAND); EnableMenuItem((HMENU)hSystemMenu, SC_SIZE, MF_GRAYED | MF_BYCOMMAND); //load the string for the about help sub menu if (LoadString(_hInstance, UI_MENU_ABOUT, menuStr, SH_SHORT_STRING_MAX_LENGTH) != 0) { AppendMenu((HMENU)hSystemMenu, MF_UNCHECKED|MF_STRING, UI_IDM_ABOUT, menuStr); } else { //failed to load the sub menu string TRC_ERR((TB, _T("Failed to load About Help Sub Menu string ID:%u"), UI_MENU_ABOUT)); } } DC_END_FN(); } #endif // OS_WINCE // // Load the image returning the given HBITMAP, having done this we can // then get the size from it. // // In: // hInstance,resid - object to be loaded. // pSize - filled with size information about the object // // Out: // HBITMAP - NULL if nothing loaded // HBITMAP CMainDlg::LoadBitmapGetSize(HINSTANCE hInstance,UINT resid,SIZE* pSize) { HBITMAP hResult = NULL; DIBSECTION ds = {0}; // // Load the image from the resource then lets get the DIBSECTION header // from the bitmap object we can then read the size from it and // return that to the caller. // #ifndef OS_WINCE hResult = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(resid), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); #else hResult = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(resid), IMAGE_BITMAP, 0, 0, 0); #endif if ( hResult ) { GetObject(hResult, sizeof(ds), &ds); pSize->cx = ds.dsBmih.biWidth; pSize->cy = ds.dsBmih.biHeight; // // pSize->cy -ve then make +ve, -ve indicates bits are vertically // flipped (bottom left, top left). // if ( pSize->cy < 0 ) pSize->cy -= 0; } return hResult; } #ifndef OS_WINCE BOOL CMainDlg::PaintBrandImage(HWND hwnd, HDC hDC, INT bgColor) { DC_BEGIN_FN("PaintBrandImage"); HBRUSH hBrushBlue; HDC hdcBitmap; HBITMAP oldBitmap; RECT rc = { 0 }; INT cxRect, cxBand; HBITMAP* phbmBrand; hdcBitmap = CreateCompatibleDC(hDC); if (!hdcBitmap) { return FALSE; } GetClientRect(hwnd, &rc); HBRUSH hbrBg; //Repaint the rest of the background //First the portion under the band rc.top = _nBrandImageHeight; if (_pProgBand) { rc.top += _pProgBand->GetBandHeight(); } FillRect(hDC, &rc, (HBRUSH)IntToPtr(1+bgColor)); // // Now paint the brand image // if (_hBrandImg) { SelectObject(hdcBitmap, _hBrandImg); BitBlt(hDC, 0, 0, _nBrandImageWidth, _nBrandImageHeight, hdcBitmap, 0,0,SRCCOPY); } DeleteDC(hdcBitmap); DC_END_FN(); return TRUE; } #endif BOOL CMainDlg::OnStartConnection() { DC_BEGIN_FN("OnStartConnection"); TRC_ASSERT(stateNotConnected == _connectionState, (TB,_T("Start connecting while already connecting. State %d"), _connectionState)); SetConnectionState( stateConnecting ); #ifndef OS_WINCE //Kick off the progress band animation timer if (_pProgBand) { _pProgBand->StartSpinning(); } #endif // // Change the cancel dialog button text to "Cancel" // to abort the connection // SetDlgItemText( _hwndDlg, IDCANCEL, _szCancelText); _hwndRestoreFocus = SetFocus(GetDlgItem( _hwndDlg, IDCANCEL)); CSH::EnableControls( _hwndDlg, connectingDisableControls, numConnectingDisableControls, FALSE ); // // Inform the current property page // to disable all it's controls // if(_fShowExpanded && _tabDlgInfo.hwndCurPropPage) { SendMessage(_tabDlgInfo.hwndCurPropPage, WM_TSC_ENABLECONTROLS, FALSE, //disable controls 0); } DC_END_FN(); return TRUE; } // // Event that fires when the process of connecting ends // fConnected - flag that is TRUE if we are now connected // FALSE if we are now disconnected (e.g if // if the connection failed. // BOOL CMainDlg::OnEndConnection(BOOL fConnected) { DC_BEGIN_FN("OnEndConnection"); // // If we're already disconnected then do nothing // e.g EndConnecting can be called once to indicate // successful connection and then again on disconnection // if( stateNotConnected != _connectionState) { if (fConnected) { SetConnectionState( stateConnected ); } else { SetConnectionState( stateNotConnected ); } #ifndef OS_WINCE // // End the animation // if (_pProgBand) { _pProgBand->StopSpinning(); } #endif // // Change the cancel dialog button text to "Close" // because we have connected at least once // SetDlgItemText( _hwndDlg, IDCANCEL, _szCloseText); #ifndef OS_WINCE // Reset band offset if (_pProgBand) { _pProgBand->ResetBandOffset(); } #endif CSH::EnableControls( _hwndDlg, connectingDisableControls, numConnectingDisableControls, TRUE ); // // Inform the current property page // to renable all controls it needs enabled // if(_fShowExpanded && _tabDlgInfo.hwndCurPropPage) { SendMessage(_tabDlgInfo.hwndCurPropPage, WM_TSC_ENABLECONTROLS, TRUE, //enable controls 0); } // // Make sure to correctly disable or enable // less UI items to prevent mnemomincs (e.g ALT-C) // leaking thru to the non-expanded dialog // CSH::EnableControls(_hwndDlg, lessUI, numLessUI, !_fShowExpanded); // // Trigger a repaint to reposition the bar // InvalidateRect( _hwndDlg, NULL, TRUE); // // If we just went disconnected (fConnected is false) // then restore the focus to the control that // had it before the connection // if (!fConnected && _hwndRestoreFocus) { SetFocus(_hwndRestoreFocus); } } DC_END_FN(); return TRUE; } VOID CMainDlg::SetConnectionState(mainDlgConnectionState newState) { DC_BEGIN_FN("SetConnectionState"); TRC_NRM((TB,_T("Prev state = %d. New State = %d"), _connectionState, newState )); _connectionState = newState; DC_END_FN(); } #ifndef OS_WINCE BOOL CMainDlg::PaintBrandingText(HBITMAP hbmBrandImage) { HDC hdcBitmap; HBITMAP hbmOld; RECT rc; COLORREF oldCol; INT oldMode; RECT textRc; INT textHeight = 0; TCHAR szBrandLine1[MAX_PATH]; TCHAR szBrandLine2[MAX_PATH]; TCHAR szLineDelta[20]; HFONT hOldFont = NULL; HFONT hFontBrandLine1 = NULL; HFONT hFontBrandLine2 = NULL; BOOL bRet = FALSE; INT rightEdge = 0; INT nTextLineDelta = 0; UINT dtTextAlign = DT_LEFT; // // These values determined based on the branding // bitmap, they are constant and don't change with // font sizes. But if the branding bitmap is updated // the values may need to be tweaked // static const int TextLine1Top = 8; static const int TextLine1Left = 80; static const int TextLineDistFromRightEdge = 20; static const int TextLineDelta = 5; DC_BEGIN_FN("PaintBrandingText"); if(!LoadString( _hInstance, UI_IDS_BRANDING_LINE1, szBrandLine1, SIZECHAR(szBrandLine1) )) { TRC_ERR((TB,_T("LoadString for UI_IDS_BRANDING_LINE1 failed 0x%x"), GetLastError())); return FALSE; } if(!LoadString( _hInstance, UI_IDS_BRANDING_LINE2, szBrandLine2, SIZECHAR(szBrandLine2))) { TRC_ERR((TB,_T("LoadString for UI_IDS_BRANDING_LINE2 failed 0x%x"), GetLastError())); return FALSE; } // // Figure out if this is Bidi, if so flip text alignment // if (GetWindowLongPtr(_hwndDlg, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) { TRC_NRM((TB,_T("RTL layout detected, flip text alignment"))); dtTextAlign = DT_RIGHT; } else { dtTextAlign = DT_LEFT; } hFontBrandLine1 = LoadFontFromResourceInfo( UI_IDS_BRANDING_LN1FONT, UI_IDS_BRANDING_LN1SIZE, FALSE ); if(!hFontBrandLine1) { TRC_ERR((TB,_T("LoadFontFromResourceInfo for brandln1 failed"))); DC_QUIT; } hFontBrandLine2 = LoadFontFromResourceInfo( UI_IDS_BRANDING_LN2FONT, UI_IDS_BRANDING_LN2SIZE, TRUE ); if(!hFontBrandLine2) { TRC_ERR((TB,_T("LoadFontFromResourceInfo for brandln1 failed"))); DC_QUIT; } if (LoadString( _hInstance, UI_IDS_LINESPACING_DELTA, szLineDelta, SIZECHAR(szLineDelta))) { nTextLineDelta = _ttol(szLineDelta); } else { TRC_ERR((TB,_T("Failed to load text line delta using default"))); nTextLineDelta = TextLineDelta; } hdcBitmap = CreateCompatibleDC(NULL); if(hdcBitmap) { hbmOld = (HBITMAP)SelectObject(hdcBitmap, hbmBrandImage); hOldFont = (HFONT)SelectObject( hdcBitmap, hFontBrandLine1); // Set text transparency and color //White text SetTextColor(hdcBitmap, RGB(255,255,255)); SetBkMode(hdcBitmap, TRANSPARENT); SetMapMode(hdcBitmap, MM_TEXT); GetClientRect( _hwndDlg, &rc ); rightEdge = min(_nBrandImageWidth, rc.right); textRc.right = rightEdge - TextLineDistFromRightEdge; textRc.top = TextLine1Top; textRc.bottom = 40; textRc.left = TextLine1Left; // // Draw first branding line // textHeight = DrawText(hdcBitmap, szBrandLine1, _tcslen(szBrandLine1), &textRc, //rect dtTextAlign); if(!textHeight) { TRC_ERR((TB,_T("DrawText for brand line1 failed 0x%x"), GetLastError())); } textRc.top += textHeight - nTextLineDelta; textRc.bottom += textHeight - nTextLineDelta; SelectObject( hdcBitmap, hFontBrandLine2); // // Draw second branding line // textHeight = DrawText(hdcBitmap, szBrandLine2, _tcslen(szBrandLine2), &textRc, //rect dtTextAlign); if(!textHeight) { TRC_ERR((TB,_T("DrawText for brand line1 failed 0x%x"), GetLastError())); } SelectObject( hdcBitmap, hOldFont ); SelectObject(hdcBitmap, hbmOld); DeleteDC(hdcBitmap); bRet = TRUE; } else { DC_QUIT; } DC_EXIT_POINT: DC_END_FN(); if(hFontBrandLine1) { DeleteObject( hFontBrandLine1 ); } if(hFontBrandLine2) { DeleteObject( hFontBrandLine2 ); } return bRet; } #endif void CMainDlg::SetFontFaceFromResource(PLOGFONT plf, UINT idFaceName) { DC_BEGIN_FN("SetFontFaceFromResource"); // Read the face name and point size from the resource file if (LoadString(_hInstance, idFaceName, plf->lfFaceName, LF_FACESIZE) == 0) { _tcscpy(plf->lfFaceName, TEXT("Tahoma")); TRC_ERR((TB,_T("Could not read welcome font face from resource"))); } DC_END_FN(); } // // Note this is pixel size and not font size // void CMainDlg::SetFontSizeFromResource(PLOGFONT plf, UINT idSizeName) { DC_BEGIN_FN("SetFontFaceFromResource"); TCHAR szPixelSize[10]; LONG nSize; if (LoadString(_hInstance, idSizeName, szPixelSize, SIZECHAR(szPixelSize)) != 0) { nSize = _ttol(szPixelSize); } else { // Make it really obvious something is wrong nSize = 40; } plf->lfHeight = -nSize; DC_END_FN(); } #ifndef OS_WINCE HFONT CMainDlg::LoadFontFromResourceInfo(UINT idFace, UINT idSize, BOOL fBold) { LOGFONT lf = {0}; CHARSETINFO csInfo; HFONT hFont; DC_BEGIN_FN("LoadFontFromResourceInfo"); lf.lfWidth = 0; lf.lfWeight = fBold ? FW_HEAVY : FW_NORMAL; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH; // Set charset if (TranslateCharsetInfo((LPDWORD)UIntToPtr(GetACP()), &csInfo, TCI_SRCCODEPAGE) == 0) { TRC_ASSERT(0,(TB,_T("TranslateCharsetInfo failed"))); csInfo.ciCharset = 0; } lf.lfCharSet = (UCHAR)csInfo.ciCharset; SetFontFaceFromResource(&lf, idFace); SetFontSizeFromResource(&lf, idSize); hFont = CreateFontIndirect(&lf); TRC_ASSERT(hFont, (TB,_T("CreateFontIndirect failed"))); DC_END_FN(); return hFont; } #endif // // Propagates a message to all child windows // used so common controls get notifications // e.g of color changes // VOID CMainDlg::PropagateMsgToChildren(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hwndChild; DC_BEGIN_FN("PropagateMsgToChildren"); for( hwndChild = GetWindow(hwndDlg, GW_CHILD); hwndChild != NULL; hwndChild = GetWindow(hwndChild, GW_HWNDNEXT) ) { #ifdef DC_DEBUG /* GetClassName doesn't have a uniwrap wrapper yet... TCHAR szTmp[256]; GetClassName(hwndChild, szTmp, 256); TRC_DBG((TB, _T("PropagateMessage: ( 0x%08lX cls:%s, 0x%08X, 0x%08lX, 0x%08lX )\n"), hwndChild, uMsg, wParam, lParam )); */ #endif SendMessage(hwndChild, uMsg, wParam, lParam); } DC_END_FN(); } #ifndef OS_WINCE // // Initializes the images (branding and band bitmap) // taking into account the current color depth. // // This function can be recalled if there is a color // depth change // // BOOL CMainDlg::InitializeBmps() { HBITMAP hbmBrandImage = NULL; UINT screenBpp; UINT imgResID; HBITMAP hbmFromRsrc = NULL; INT nBmpWidth = 0; INT nBmpHeight = 0; BOOL fDeepImgs = FALSE; RECT rc; INT nDlgWidth; DC_BEGIN_FN("InitializeBmps"); // // _hwndDlg should be set early in WM_INITDIALOG // TRC_ASSERT(_hwndDlg, (TB,_T("_hwndDlg is null"))); screenBpp = CSH::SH_GetScreenBpp(); if (screenBpp <= 8) { _fUse16ColorBitmaps = TRUE; imgResID = UI_IDB_BRANDIMAGE_16; } else { _fUse16ColorBitmaps = FALSE; imgResID = UI_IDB_BRANDIMAGE; } GetClientRect( _hwndDlg, &rc ); nDlgWidth = rc.right - rc.left; if (!nDlgWidth) { // // We've seen cases in FUS where the client area is returned // as 0. Be robust to that and just bail out of initilizing // the bmp with a fail code // TRC_ERR((TB,_T("Got 0 client width"))); return FALSE; } if (screenBpp >= 8) { fDeepImgs = TRUE; } TRC_NRM((TB,_T("Use16 color bmp :%d. Img res id:%d"), _fUse16ColorBitmaps,imgResID)); hbmFromRsrc = (HBITMAP)LoadImage(_hInstance, MAKEINTRESOURCE(imgResID),IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); if (hbmFromRsrc) { // // Figure out the dimensions of the resrc bmp // DIBSECTION ds = {0}; if (GetObject(hbmFromRsrc, sizeof(ds), &ds)) { nBmpHeight = ds.dsBm.bmHeight; if(nBmpHeight < 0) { nBmpHeight -= 0; } nBmpWidth = ds.dsBm.bmWidth; } // // Create a new brand bitmap that spans // the width of the dialog. This is necessary // so that we can just set it up once e.g // drawing branding text etc. The bitmap has to match // the dialog width because on localized builds the dialog // can be much wider than the resource version of the bitmap // and the text can span a wider area. // HDC hDC = GetWindowDC(_hwndDlg); if (hDC) { hbmBrandImage = CreateCompatibleBitmap(hDC, nDlgWidth, nBmpHeight); HDC hMemDCSrc = CreateCompatibleDC(hDC); HDC hMemDCDest = CreateCompatibleDC(hDC); if (hMemDCSrc && hMemDCDest) { RECT rcFill; RGBQUAD rgb[256]; HBITMAP hbmDestOld = NULL; LPLOGPALETTE pLogPalette = NULL; HPALETTE hScreenPalOld = NULL; HPALETTE hMemPalOld = NULL; UINT nCol = 0; // // Get brand img palette // _hBrandPal = CUT::UT_GetPaletteForBitmap(hDC, hbmFromRsrc); if (_hBrandPal) { hScreenPalOld = SelectPalette(hDC, _hBrandPal, FALSE); hMemPalOld = SelectPalette(hMemDCDest, _hBrandPal, FALSE); RealizePalette(hDC); } HBITMAP hbmSrcOld = (HBITMAP)SelectObject( hMemDCSrc, hbmFromRsrc); hbmDestOld = (HBITMAP)SelectObject( hMemDCDest, hbmBrandImage); rcFill.left = 0; rcFill.top = 0; rcFill.bottom = nBmpHeight; rcFill.right = nDlgWidth; HBRUSH hSolidBr = CreateSolidBrush( _fUse16ColorBitmaps ? IMAGE_BG_COL_16 : IMAGE_BG_COL); if (hSolidBr) { FillRect(hMemDCDest, &rcFill, hSolidBr); DeleteObject( hSolidBr ); } BitBlt(hMemDCDest, 0, 0, nDlgWidth, nBmpHeight, hMemDCSrc, 0, 0, SRCCOPY); if (hbmDestOld) { SelectObject(hMemDCDest, hbmDestOld); } if (hbmSrcOld) { SelectObject(hMemDCSrc, hbmSrcOld); } if (hScreenPalOld) { SelectPalette(hDC, hScreenPalOld, TRUE); } if (hMemPalOld) { SelectPalette(hDC, hMemPalOld, TRUE); } DeleteDC(hMemDCSrc); DeleteDC(hMemDCDest); } ReleaseDC(_hwndDlg, hDC); } else { TRC_ERR((TB,_T("GetDC failed 0x%x"), GetLastError())); } DeleteObject( hbmFromRsrc ); _nBrandImageWidth = nDlgWidth; _nBrandImageHeight = nBmpHeight; } if(!hbmBrandImage) { TRC_ERR((TB,_T("Error setting up brand bmp"))); return FALSE; } if(hbmBrandImage) { PaintBrandingText( hbmBrandImage ); } // // Delete any old brand img and keep track of this one // if (_hBrandImg) { DeleteObject(_hBrandImg); } _hBrandImg = hbmBrandImage; TRC_ASSERT(_nBrandImageHeight, (TB,_T("_nBrandImageHeight is 0!"))); _lastValidBpp = screenBpp; DC_END_FN(); return TRUE; } // // BrandingQueryNewPalette / BrandingPaletteChanged // code 'borrowed' from winlogon // Handle palette change messages from the system so that we can work correctly // on <= 8 bit per pixel devices. // // In: // - // Out: // - // BOOL CMainDlg::BrandingQueryNewPalette(HWND hDlg) { HDC hDC; HPALETTE oldPalette; DC_BEGIN_FN("BrandingQueryNewPalette"); if ( !_hBrandPal ) return FALSE; hDC = GetDC(hDlg); if ( !hDC ) return FALSE; oldPalette = SelectPalette(hDC, _hBrandPal, FALSE); RealizePalette(hDC); UpdateColors(hDC); // // Update the window // UpdateWindow(hDlg); if ( oldPalette ) SelectPalette(hDC, oldPalette, FALSE); ReleaseDC(hDlg, hDC); DC_END_FN(); return TRUE; } BOOL CMainDlg::BrandingPaletteChanged(HWND hDlg, HWND hWndPalChg) { HDC hDC; HPALETTE oldPalette; DC_BEGIN_FN("BrandingPaletteChanged"); if ( !_hBrandPal ) { return FALSE; } if ( hDlg != hWndPalChg ) { hDC = GetDC(hDlg); if ( !hDC ) return FALSE; oldPalette = SelectPalette(hDC, _hBrandPal, FALSE); RealizePalette(hDC); UpdateColors(hDC); if ( oldPalette ) SelectPalette(hDC, oldPalette, FALSE); ReleaseDC(hDlg, hDC); } DC_END_FN(); return FALSE; } #endif // // Load the perf strings into a global table // that will also be used by the perf property page // BOOL CMainDlg::InitializePerfStrings() { DC_BEGIN_FN("InitializePerfStrings"); if (!g_fPropPageStringMapInitialized) { // // Load color strings // for(int i = 0; i< NUM_PERFSTRINGS; i++) { if (!LoadString( _hInstance, g_PerfOptimizeStringTable[i].resID, g_PerfOptimizeStringTable[i].szString, PERF_OPTIMIZE_STRING_LEN )) { TRC_ERR((TB, _T("Failed to load color string %d"), g_PerfOptimizeStringTable[i].resID)); return FALSE; } } g_fPropPageStringMapInitialized = TRUE; TRC_NRM((TB,_T("Successfully loaded perf strings"))); return TRUE; } else { TRC_NRM((TB,_T("Strings were already loaded"))); return TRUE; } DC_END_FN(); }