/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ // ResolutionDialog.cpp : implementation file // #include "stdafx.h" #include "w3dview.h" #include "ResolutionDialog.h" #include "WW3D.H" #include "Globals.h" #include "GraphicView.h" #include "Utils.h" #include "rddesc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // // ResolutionDialogClass // ///////////////////////////////////////////////////////////////////////////// ResolutionDialogClass::ResolutionDialogClass(CWnd* pParent /*=NULL*/) : CDialog(ResolutionDialogClass::IDD, pParent) { //{{AFX_DATA_INIT(ResolutionDialogClass) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT return ; } ///////////////////////////////////////////////////////////////////////////// // // DoDataExchange // ///////////////////////////////////////////////////////////////////////////// void ResolutionDialogClass::DoDataExchange (CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(ResolutionDialogClass) DDX_Control(pDX, IDC_RESOLUTION_LIST_CTRL, m_ListCtrl); //}}AFX_DATA_MAP return ; } BEGIN_MESSAGE_MAP(ResolutionDialogClass, CDialog) //{{AFX_MSG_MAP(ResolutionDialogClass) ON_NOTIFY(NM_DBLCLK, IDC_RESOLUTION_LIST_CTRL, OnDblclkResolutionListCtrl) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // // OnInitDialog // ///////////////////////////////////////////////////////////////////////////// BOOL ResolutionDialogClass::OnInitDialog (void) { CDialog::OnInitDialog (); // // Configure the list control // m_ListCtrl.SetExtendedStyle (LVS_EX_FULLROWSELECT); m_ListCtrl.InsertColumn (0, "Resolution"); m_ListCtrl.InsertColumn (1, "Bit Depth"); // // Size the columns // CRect rect; m_ListCtrl.GetClientRect (&rect); m_ListCtrl.SetColumnWidth (0, (rect.Width () >> 1) - 4); m_ListCtrl.SetColumnWidth (1, (rect.Width () >> 1) - 4); // // Get information about the current render device // const RenderDeviceDescClass &device_info = WW3D::Get_Render_Device_Desc (); const DynamicVectorClass &res_list = device_info.Enumerate_Resolutions (); // // Get the current resolution // int curr_width = 0; int curr_height = 0; int curr_bpp = 0; bool curr_windowed = false; WW3D::Get_Device_Resolution (curr_width, curr_height, curr_bpp, curr_windowed); SendDlgItemMessage (IDC_FULLSCREEN_CHECK, BM_SETCHECK, (WPARAM)(curr_windowed == false)); // // Loop over all the resolutions available to us // bool found = false; int index = res_list.Count (); while (index --) { int width = res_list[index].Width; int height = res_list[index].Height; int bpp = res_list[index].BitDepth; // // Format description strings for this resolution // CString resolution_string; CString bit_depth_string; resolution_string.Format ("%d x %d", width, height); bit_depth_string.Format ("%d bpp (%d colors)", bpp, 1 << bpp); // // Add this resolution to the list ctrl // int list_index = m_ListCtrl.InsertItem (0, resolution_string, 0); if (list_index >= 0) { m_ListCtrl.SetItemText (list_index, 1, bit_depth_string); m_ListCtrl.SetItemData (list_index, index); // // Is this the current resolution? If so, // select this entry as the default... // if ( found == false && curr_width == width && curr_height == height && curr_bpp == bpp) { m_ListCtrl.SetItemState (list_index, LVIS_SELECTED, LVIS_SELECTED); found = true; } } } // // Select the first entry by default (if necessary) // if (found == false) { m_ListCtrl.SetItemState (0, LVIS_SELECTED, LVIS_SELECTED); } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // // OnOK // ///////////////////////////////////////////////////////////////////////////// void ResolutionDialogClass::OnOK (void) { CDialog::OnOK (); // // Get the current selection // int list_index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED); if (list_index >= 0) { // // Index into the resolution list for this device... // int index = m_ListCtrl.GetItemData (list_index); if (index >= 0) { // // Lookup the selected resolution information // const RenderDeviceDescClass &device_info = WW3D::Get_Render_Device_Desc (); const DynamicVectorClass &res_list = device_info.Enumerate_Resolutions (); g_iWidth = res_list[index].Width; g_iHeight = res_list[index].Height; g_iBitsPerPixel = res_list[index].BitDepth; // // Cache this information in the registry // theApp.WriteProfileInt ("Config", "DeviceWidth", g_iWidth); theApp.WriteProfileInt ("Config", "DeviceHeight", g_iHeight); theApp.WriteProfileInt ("Config", "DeviceBitsPerPix", g_iBitsPerPixel); // // Reset the display // bool fullscreen = (SendDlgItemMessage (IDC_FULLSCREEN_CHECK, BM_GETCHECK) == 1); ::Get_Graphic_View ()->Set_Fullscreen (fullscreen); } } return ; } ///////////////////////////////////////////////////////////////////////////// // // OnDblclkResolutionListCtrl // ///////////////////////////////////////////////////////////////////////////// void ResolutionDialogClass::OnDblclkResolutionListCtrl ( NMHDR * pNMHDR, LRESULT * pResult ) { int list_index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED); if (list_index >= 0) { OnOK (); } (*pResult) = 0; return ; }