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

261 lines
6.2 KiB
C++

// ExportDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DIBManager.h"
#include "ExportDlg.h"
#include "oxbmpfle.h"
#include "oxjpgfle.h"
#include "oxjpgcom.h"
#include "oxjpgdom.h"
#include "oxjpgexp.h"
#include "path.h"
#include "dir.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExportDlg dialog
CExportDlg::CExportDlg(CWnd* pParent /*=NULL*/)
: CDialog(CExportDlg::IDD, pParent),
m_cbFileName(COXHistoryCombo::TBPHorizontalRightCenter,TRUE)
{
//{{AFX_DATA_INIT(CExportDlg)
m_bBaseline = FALSE;
m_bGrayscale = FALSE;
m_bOptimize = FALSE;
m_bProgressive = FALSE;
m_bSmooth = FALSE;
m_sFileName = _T("");
m_nQuality = 0;
m_nSmooth = 0;
//}}AFX_DATA_INIT
}
void CExportDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CExportDlg)
DDX_Control(pDX, IDC_SMOOTH, m_ctlEditSmooth);
DDX_Control(pDX, IDC_QUALITY, m_ctlEditQuality);
DDX_Control(pDX, IDC_SPIN_SMOOTH, m_ctlSpinSmooth);
DDX_Control(pDX, IDC_SPIN_QUALITY, m_ctlSpinQuality);
DDX_Control(pDX, IDC_FILENAME, m_cbFileName);
DDX_Check(pDX, IDC_CHECK_BASELINE, m_bBaseline);
DDX_Check(pDX, IDC_CHECK_GRAYSCALE, m_bGrayscale);
DDX_Check(pDX, IDC_CHECK_OPTIMIZE, m_bOptimize);
DDX_Check(pDX, IDC_CHECK_PROGRESSIVE, m_bProgressive);
DDX_Check(pDX, IDC_CHECK_SMOOTH, m_bSmooth);
DDX_Text(pDX, IDC_FILENAME, m_sFileName);
DDX_Text(pDX, IDC_QUALITY, m_nQuality);
DDV_MinMaxUInt(pDX, m_nQuality, 0, 100);
DDX_Text(pDX, IDC_SMOOTH, m_nSmooth);
DDV_MinMaxUInt(pDX, m_nSmooth, 1, 100);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CExportDlg, CDialog)
//{{AFX_MSG_MAP(CExportDlg)
ON_BN_CLICKED(IDC_CHECK_PROGRESSIVE, OnCheckProgressive)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExportDlg message handlers
BOOL CExportDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinQuality.SetBuddy(&m_ctlEditQuality);
m_ctlSpinQuality.SetRange(0,100);
m_ctlSpinQuality.SetPos(m_nQuality);
// Set a default COXSpinCtrl method of delta value computation
// (Delta pixel = Delta value).
m_ctlSpinQuality.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinSmooth.SetBuddy(&m_ctlEditSmooth);
m_ctlSpinSmooth.SetRange(1,100);
m_ctlSpinSmooth.SetPos(m_nSmooth);
// Set a default COXSpinCtrl method of delta value computation
// (Delta pixel = Delta value).
m_ctlSpinQuality.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
m_nQuality = 75;
m_nSmooth = 10;
CheckRadioButton(IDC_RADIO_DCT_INT,IDC_RADIO_DCT_FLOAT,IDC_RADIO_DCT_INT);
// Use auto persistence
m_cbFileName.SetAutoPersistent(_T("History - Export"));
m_cbFileName.SetFileDialogParams(FALSE,_T("*.jpg"),NULL,
OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
_T("JPEG Images (*.jpg)|*.jpg|All Files (*.*)|*.*||"));
// set toolbar on the right with a little gap
COXHistoryCombo::EToolbarPosition eToolbarPosition=m_cbFileName.GetToolbarPosition();
m_cbFileName.PositionToolbar(eToolbarPosition, TRUE);
// unimited number of items in combobox are could be saved
m_cbFileName.SetMaxHistoryCount(-1);
UpdateData(FALSE);
// show buttons depending on set properties
ShowButtons();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CExportDlg::OnCheckProgressive()
{
// TODO: Add your control notification handler code here
ShowButtons();
}
void CExportDlg::OnOK()
{
// TODO: Add extra validation here
// check if typed directory exists
if(UpdateData()==0 || !CheckFileName())
return;
// operation of exporting from DIB to JPEG
// could be time-consuming
BeginWaitCursor();
// create bitmap file on the base of current DIB image
// m_tmpBMPFile we initialize when we run the export dialog
COXBMPFile BMPFile(&m_tmpBMPFile);
COXJPEGFile jpgFile(m_sFileName);
COXJPEGCompressor JCompr;
JCompr.SetQuality(m_nQuality);
if(m_bSmooth)
{
JCompr.SetSmooth(m_nSmooth);
}
JCompr.SetGrayScale(m_bGrayscale);
JCompr.SetBaseLine(m_bBaseline);
JCompr.SetProgressive(m_bProgressive);
JCompr.SetOptimize(m_bOptimize);
EDiscreteCosTransf DCT;
switch(GetCheckedRadioButton(IDC_RADIO_DCT_INT,
IDC_RADIO_DCT_FLOAT))
{
case IDC_RADIO_DCT_INT:
{
DCT=DC_Int;
break;
}
case IDC_RADIO_DCT_FAST:
{
DCT=DC_FastInt;
break;
}
case IDC_RADIO_DCT_FLOAT:
{
DCT=DC_Float;
break;
}
default:
{
DCT=DC_Int;
break;
}
}
JCompr.SetDisCosTranf(DCT);
short nReturn(1);
TCHAR ErrorBuffer[SIZE_ERROR_BUF];
TRY
{
// the only line of code that we need to compress bitmap file to JPEG
nReturn = JCompr.DoCompress(&BMPFile, &jpgFile);
if (nReturn == 2)
AfxMessageBox(JCompr.GetWarningMessages());
}
CATCH(COXJPEGException, e)
{
// if something went wrong then notify about it
e->GetErrorMessage(ErrorBuffer, SIZE_ERROR_BUF);
AfxMessageBox(CString("Exception : ") + ErrorBuffer);
TRACE((LPCTSTR)ErrorBuffer);
}
END_CATCH
EndWaitCursor();
if(nReturn!=0)
return;
CDialog::OnOK();
}
LRESULT CExportDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
// we use this function to let buttons in HistoryCombo toolbar
// to get some notification
UNUSED(wParam);
UNUSED_ALWAYS(lParam);
ASSERT_VALID(this);
ASSERT(wParam == MSGF_DIALOGBOX);
BOOL bContinueIdle = TRUE;
// Pass on to the history combo
m_cbFileName.OnIdle();
return bContinueIdle;
}
void CExportDlg::ShowButtons()
{
// TODO: Add your control notification handler code here
// show buttons depending on some conditions
UpdateData();
ctlOptimize().EnableWindow(!m_bProgressive);
if(m_bProgressive)
{
ctlOptimize().SetCheck(1);
}
}
BOOL CExportDlg::CheckFileName()
{
// check if typed directory exist
COXPathSpec path;
path.SetPath(m_sFileName);
COXDirSpec dir(path.GetDirectory());
if(dir.IsEmpty() || !dir.Exists())
{
AfxMessageBox(_T("Designated directory doesn't exist!"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
else
{
return TRUE;
}
}