This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/SimpleGraph/RangeDialog.cpp

255 lines
6.4 KiB
C++
Raw Permalink Normal View History

/*
** 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 <http://www.gnu.org/licenses/>.
*/
// RangeDialog.cpp : implementation file
//
#include "stdafx.h"
#include "SimpleGraph.h"
#include "RangeDialog.h"
#include "SimpleGraphView.h"
#include "mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// fnEditToFloatProc
//
/////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK
fnEditToFloatProc
(
HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam
)
{
WNDPROC old_proc = (WNDPROC)::GetProp (hwnd, "OLD_WND_PROC");
LRESULT result = 0L;
if (message == WM_SETTEXT) {
//
// Convert the textual value to a long, convert
// the long to a float, and conver the float to
// a string.
//
LPCTSTR string = (LPCTSTR)lparam;
if (::strchr (string, '.') != 0) {
result = ::CallWindowProc (old_proc, hwnd, message, wparam, lparam);
} else {
long value = ::atol ((LPCTSTR)lparam);
float float_value = value / 100.0F;
CString new_text;
new_text.Format ("%.2f", float_value);
result = ::CallWindowProc (old_proc, hwnd, message, wparam, (LPARAM)(LPCTSTR)new_text);
}
} else if (message == WM_GETTEXT) {
//
// Get the value (as text) from the control,
// convert it to a float, convert the float
// to a long, then convert the long back to
// a string.
//
result = ::CallWindowProc (old_proc, hwnd, message, wparam, lparam);
LPCTSTR string = (LPCTSTR)lparam;
if (::strchr (string, '.') != 0) {
float float_value = ::atof (string);
long int_value = long(float_value * 100);
::itoa (int_value, (LPTSTR)lparam, 10);
} else {
long int_value = ::atol (string) * 100;
::itoa (int_value, (LPTSTR)lparam, 10);
}
result = ::lstrlen ((LPTSTR)lparam);
} else if (message == WM_CHAR) {
//
// Check to see if this is one of the characters we allow
// the user to type
//
if ( (wparam >= '0' && wparam <= '9') ||
wparam == '.' ||
wparam == VK_BACK ||
wparam == '-')
{
result = ::CallWindowProc (old_proc, hwnd, message, wparam, lparam);
}
} else if (old_proc != NULL) {
result = ::CallWindowProc (old_proc, hwnd, message, wparam, lparam);
}
return result;
}
/////////////////////////////////////////////////////////////////////////////
//
// Make_Edit_Float_Ctrl
//
/////////////////////////////////////////////////////////////////////////////
void
Make_Edit_Float_Ctrl (HWND edit_wnd)
{
LONG old_proc = ::SetWindowLong (edit_wnd, GWL_WNDPROC, (LONG)fnEditToFloatProc);
SetProp (edit_wnd, "OLD_WND_PROC", (HANDLE)old_proc);
return ;
}
////////////////////////////////////////////////////////////////////////////
//
// SetDlgItemFloat
//
////////////////////////////////////////////////////////////////////////////
void
SetDlgItemFloat
(
HWND hdlg,
UINT child_id,
float value
)
{
// Convert the float to a string
CString text;
text.Format ("%.2f", value);
// Pass the string onto the dialog control
::SetDlgItemText (hdlg, child_id, text);
return ;
}
////////////////////////////////////////////////////////////////////////////
//
// GetDlgItemFloat
//
////////////////////////////////////////////////////////////////////////////
float
GetDlgItemFloat
(
HWND hdlg,
UINT child_id
)
{
// Get the string from the window
TCHAR string_value[20];
::GetDlgItemText (hdlg, child_id, string_value, sizeof (string_value));
// Convert the string to a float and return the value
return ::atof (string_value);
}
/////////////////////////////////////////////////////////////////////////////
//
// CRangeDialog
//
/////////////////////////////////////////////////////////////////////////////
CRangeDialog::CRangeDialog(CWnd* pParent /*=NULL*/)
: CDialog(CRangeDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CRangeDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
return ;
}
void CRangeDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRangeDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRangeDialog, CDialog)
//{{AFX_MSG_MAP(CRangeDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CRangeDialog
//
/////////////////////////////////////////////////////////////////////////////
BOOL
CRangeDialog::OnInitDialog (void)
{
CDialog::OnInitDialog ();
CSimpleGraphView *view = (CSimpleGraphView *)((CMainFrame *)::AfxGetMainWnd ())->GetActiveView ();
Vector2 range_min;
Vector2 range_max;
view->Get_Ranges (range_min, range_max);
/*::Make_Edit_Float_Ctrl (::GetDlgItem (m_hWnd, IDC_MIN_X));
::Make_Edit_Float_Ctrl (::GetDlgItem (m_hWnd, IDC_MIN_Y));
::Make_Edit_Float_Ctrl (::GetDlgItem (m_hWnd, IDC_MAX_X));
::Make_Edit_Float_Ctrl (::GetDlgItem (m_hWnd, IDC_MAX_Y));*/
SetDlgItemFloat (m_hWnd, IDC_MIN_X, range_min.X);
SetDlgItemFloat (m_hWnd, IDC_MIN_Y, range_min.Y);
SetDlgItemFloat (m_hWnd, IDC_MAX_X, range_max.X);
SetDlgItemFloat (m_hWnd, IDC_MAX_Y, range_max.Y);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnOK
//
/////////////////////////////////////////////////////////////////////////////
void
CRangeDialog::OnOK (void)
{
Vector2 range_min;
Vector2 range_max;
range_min.X = ::GetDlgItemFloat (m_hWnd, IDC_MIN_X);
range_min.Y = ::GetDlgItemFloat (m_hWnd, IDC_MIN_Y);
range_max.X = ::GetDlgItemFloat (m_hWnd, IDC_MAX_X);
range_max.Y = ::GetDlgItemFloat (m_hWnd, IDC_MAX_Y);
CSimpleGraphView *view = (CSimpleGraphView *)((CMainFrame *)::AfxGetMainWnd ())->GetActiveView ();
view->Set_Ranges (range_min, range_max);
view->InvalidateRect (NULL, TRUE);
view->UpdateWindow ();
CDialog::OnOK ();
return ;
}