2025-11-27 16:46:48 +09:00

285 lines
9.6 KiB
C++

// ResampleImageDlg.cpp : implementation file
//
#include "stdafx.h"
#include "dibmanager.h"
#include "ResampleImageDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResampleImageDlg dialog
CResampleImageDlg::CResampleImageDlg(CWnd* pParent /*=NULL*/)
: CDialog(CResampleImageDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CResampleImageDlg)
m_bMaintainRatio = FALSE;
m_bMatchZoomLevel = FALSE;
m_sHeightOrig = _T("");
m_sWidthOrig = _T("");
m_nWidthPercents = 0;
m_nWidthPixels = 0;
m_nHeightPercents = 0;
m_nHeightPixels = 0;
m_bConvertTo = FALSE;
m_nConvertTo = -1;
//}}AFX_DATA_INIT
m_nCurrentZoomLevel=0;
m_bCanConvert=FALSE;
m_bCanResize=FALSE;
m_nOrigHeight=0;
m_nOrigWidth=0;
}
void CResampleImageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CResampleImageDlg)
DDX_Control(pDX, IDC_CHECK_MATCH_ZOOM_LEVEL, m_ctlCheckMatchZoomLevel);
DDX_Control(pDX, IDC_CHECK_CONVERT_TO, m_ctlCheckConvertTo);
DDX_Control(pDX, IDC_WIDTH_PIXELS, m_ctlEditWidthPixels);
DDX_Control(pDX, IDC_WIDTH_PERCENTS, m_ctlEditWidthPercents);
DDX_Control(pDX, IDC_SPIN_WIDTH_PIXELS, m_ctlSpinWidthPixels);
DDX_Control(pDX, IDC_SPIN_WIDTH_PERCENTS, m_ctlSpinWidthPercents);
DDX_Control(pDX, IDC_SPIN_HEIGHT_PIXELS, m_ctlSpinHeightPixels);
DDX_Control(pDX, IDC_SPIN_HEIGHT_PERCENTS, m_ctlSpinHeightPercents);
DDX_Control(pDX, IDC_HEIGHT_PIXELS, m_ctlEditHeightPixels);
DDX_Control(pDX, IDC_HEIGHT_PERCENTS, m_ctlEditHeightPercents);
DDX_Control(pDX, IDC_COMBO_CONVERT_TO, m_ctlComboConvertTo);
DDX_Control(pDX, IDC_CHECK_MAINTAIN_RATIO, m_ctlCheckMaintainRatio);
DDX_Check(pDX, IDC_CHECK_MAINTAIN_RATIO, m_bMaintainRatio);
DDX_Check(pDX, IDC_CHECK_MATCH_ZOOM_LEVEL, m_bMatchZoomLevel);
DDX_Text(pDX, IDC_HEIGHT_ORIG, m_sHeightOrig);
DDX_Text(pDX, IDC_WIDTH_ORIG, m_sWidthOrig);
DDX_Text(pDX, IDC_WIDTH_PERCENTS, m_nWidthPercents);
DDX_Text(pDX, IDC_WIDTH_PIXELS, m_nWidthPixels);
DDX_Text(pDX, IDC_HEIGHT_PERCENTS, m_nHeightPercents);
DDX_Text(pDX, IDC_HEIGHT_PIXELS, m_nHeightPixels);
DDX_Check(pDX, IDC_CHECK_CONVERT_TO, m_bConvertTo);
DDX_CBIndex(pDX, IDC_COMBO_CONVERT_TO, m_nConvertTo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CResampleImageDlg, CDialog)
//{{AFX_MSG_MAP(CResampleImageDlg)
ON_BN_CLICKED(IDC_CHECK_CONVERT_TO, OnCheckConvertTo)
ON_BN_CLICKED(IDC_CHECK_MAINTAIN_RATIO, OnCheckMaintainRatio)
ON_BN_CLICKED(IDC_CHECK_MATCH_ZOOM_LEVEL, OnCheckMatchZoomLevel)
ON_EN_CHANGE(IDC_HEIGHT_PERCENTS, OnChangeHeightPercents)
ON_EN_CHANGE(IDC_HEIGHT_PIXELS, OnChangeHeightPixels)
ON_EN_CHANGE(IDC_WIDTH_PERCENTS, OnChangeWidthPercents)
ON_EN_CHANGE(IDC_WIDTH_PIXELS, OnChangeWidthPixels)
ON_BN_CLICKED(ID_BUTTON_RESET, OnButtonReset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResampleImageDlg message handlers
BOOL CResampleImageDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Define array of possible types of convertion
m_ctlComboConvertTo.AddString(_T("256 color (8-bit)"));
m_nConvertTo=0;
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinWidthPixels.SetBuddy(&m_ctlEditWidthPixels);
m_ctlSpinWidthPixels.SetRange(0,32767);
m_ctlSpinWidthPixels.SetPos(m_nWidthPixels);
// Set a default COXSpinCtrl method of delta value computation (Delta pixel = Delta value).
m_ctlSpinWidthPixels.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinHeightPixels.SetBuddy(&m_ctlEditHeightPixels);
m_ctlSpinHeightPixels.SetRange(0,32767);
m_ctlSpinHeightPixels.SetPos(m_nHeightPixels);
// Set a default COXSpinCtrl method of delta value computation (Delta pixel = Delta value).
m_ctlSpinHeightPixels.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinWidthPercents.SetBuddy(&m_ctlEditWidthPercents);
m_ctlSpinWidthPercents.SetRange(0,32767);
m_ctlSpinWidthPercents.SetPos(m_nWidthPercents);
// Set a default COXSpinCtrl method of delta value computation (Delta pixel = Delta value).
m_ctlSpinWidthPercents.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinHeightPercents.SetBuddy(&m_ctlEditHeightPercents);
m_ctlSpinHeightPercents.SetRange(0,32767);
m_ctlSpinHeightPercents.SetPos(m_nHeightPercents);
// Set a default COXSpinCtrl method of delta value computation (Delta pixel = Delta value).
m_ctlSpinHeightPercents.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
UpdateData(FALSE);
ShowControls();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CResampleImageDlg::ShowControls(BOOL bHeightChanged)
{
UpdateData(TRUE);
if(!m_bCanConvert)
{
// enable convertion controls only if we can do convertion
m_bConvertTo=FALSE;
m_ctlCheckConvertTo.EnableWindow(FALSE);
}
m_nConvertTo=0;
m_ctlComboConvertTo.EnableWindow(m_bConvertTo);
if(m_bMaintainRatio)
{
if(bHeightChanged)
{
// if we are going to maintain aspect ratio then
// recalculate width of image based on height
m_nWidthPercents=m_nHeightPercents;
m_nWidthPixels=((long)m_nOrigWidth*
(long)m_nHeightPixels)/((long)m_nOrigHeight);
}
else
{
// if we are going to maintain aspect ratio then
// recalculate height of image based on width
m_nHeightPercents=m_nWidthPercents;
m_nHeightPixels=((long)m_nOrigHeight*
(long)m_nWidthPixels)/((long)m_nOrigWidth);
}
}
if(m_bMatchZoomLevel)
{
// set height and width corresponding to current zoom level
m_bMaintainRatio=TRUE;
m_nWidthPercents=m_nCurrentZoomLevel;
m_nHeightPercents=m_nCurrentZoomLevel;
m_nWidthPixels=((long)m_nOrigWidth*(long)m_nCurrentZoomLevel)/(100L);
m_nHeightPixels=((long)m_nOrigHeight*(long)m_nCurrentZoomLevel)/(100L);
}
// set controls enable on/off
m_ctlCheckMatchZoomLevel.EnableWindow(m_bCanResize);
m_ctlCheckMaintainRatio.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlEditWidthPixels.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlSpinWidthPixels.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlEditHeightPixels.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlSpinHeightPixels.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlEditWidthPercents.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlSpinWidthPercents.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlEditHeightPercents.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
m_ctlSpinHeightPercents.EnableWindow(!m_bMatchZoomLevel && m_bCanResize);
UpdateData(FALSE);
}
void CResampleImageDlg::OnCheckConvertTo()
{
// TODO: Add your control notification handler code here
ShowControls();
}
void CResampleImageDlg::OnCheckMaintainRatio()
{
// TODO: Add your control notification handler code here
ShowControls();
}
void CResampleImageDlg::OnCheckMatchZoomLevel()
{
// TODO: Add your control notification handler code here
ShowControls();
}
void CResampleImageDlg::OnChangeHeightPercents()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_nHeightPixels=((long)m_nOrigHeight*
(long)m_nHeightPercents)/((long)100);
UpdateData(FALSE);
ShowControls(TRUE);
}
void CResampleImageDlg::OnChangeHeightPixels()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_nHeightPercents=((long)100*(long)m_nHeightPixels)/
((long)m_nOrigHeight);
UpdateData(FALSE);
ShowControls(TRUE);
}
void CResampleImageDlg::OnChangeWidthPercents()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_nWidthPixels=((long)m_nOrigWidth*
(long)m_nWidthPercents)/((long)100);
UpdateData(FALSE);
ShowControls();
}
void CResampleImageDlg::OnChangeWidthPixels()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_nWidthPercents=((long)100*(long)m_nWidthPixels)/
((long)m_nOrigWidth);
UpdateData(FALSE);
ShowControls();
}
void CResampleImageDlg::OnButtonReset()
{
// TODO: Add your control notification handler code here
// set size of image to original
m_nWidthPercents=m_nCurrentZoomLevel;
m_nHeightPercents=m_nCurrentZoomLevel;
m_nWidthPixels=((long)m_nOrigWidth*(long)m_nCurrentZoomLevel)/(100L);
m_nHeightPixels=((long)m_nOrigHeight*(long)m_nCurrentZoomLevel)/(100L);
m_bMatchZoomLevel=FALSE;
UpdateData(FALSE);
ShowControls();
}