932 lines
29 KiB
C++
932 lines
29 KiB
C++
|
//=============================================================================
|
||
|
// (c) Copyright Wang Laboratories, Inc. 1995 All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Project: Norway - Page Options Dialog DLL
|
||
|
//
|
||
|
// Component: Size Tab
|
||
|
//
|
||
|
// File Name: sizepge.cpp
|
||
|
//
|
||
|
// Class: CSizePage
|
||
|
//
|
||
|
// Functions:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Maintenance Log:
|
||
|
/*
|
||
|
$Header: S:\norway\wangcmn\sizepge.cpv 1.13 12 Oct 1995 12:04:30 MFH $
|
||
|
$Log: S:\norway\wangcmn\sizepge.cpv $
|
||
|
|
||
|
Rev 1.13 12 Oct 1995 12:04:30 MFH
|
||
|
Added context sensitive help support
|
||
|
|
||
|
Rev 1.12 12 Oct 1995 10:14:32 MFH
|
||
|
Changes for MFC 4.0
|
||
|
|
||
|
Rev 1.11 03 Oct 1995 14:30:42 MFH
|
||
|
Changed conversions to round off better
|
||
|
|
||
|
Rev 1.10 22 Sep 1995 19:26:12 MFH
|
||
|
Added special page size cases for international
|
||
|
|
||
|
Rev 1.9 19 Sep 1995 10:17:08 MFH
|
||
|
Uses registered decimal symbol to display sizes (in addition to
|
||
|
allowing it in when entering a custom size)
|
||
|
|
||
|
Rev 1.8 14 Sep 1995 15:45:14 MFH
|
||
|
New paper sizes. No more CheckOk. Validation done when user
|
||
|
tries to leave tab. uses Miki's edit control class to only
|
||
|
allow numbers.
|
||
|
|
||
|
Rev 1.7 08 Sep 1995 15:18:24 MFH
|
||
|
Defaults to A4 paper size for metric setting in control panel.
|
||
|
|
||
|
Rev 1.6 05 Sep 1995 17:47:30 MFH
|
||
|
Default handling changed so that better defaults are given if calling
|
||
|
app does not specify defaults and/or does not show window
|
||
|
SetHeight and SetWidth moved to here because no longer inline
|
||
|
Saves Height and Width as inches instead of pixels or metric
|
||
|
Create/Destroy window message handlers gone
|
||
|
ShowWindow handler added
|
||
|
Shows millimeters instead of centimeters
|
||
|
New Error handling to be consistent with resolution page:
|
||
|
Gives error as OK is grayed then no error until OK enabled then
|
||
|
grayed again.
|
||
|
ConvertSize changed for millimeters and inches saved.
|
||
|
|
||
|
Rev 1.5 03 Aug 1995 16:35:58 MFH
|
||
|
Use IDOK instead of 1 to reference OK control.
|
||
|
Added comments
|
||
|
|
||
|
Rev 1.4 31 Jul 1995 11:38:46 MFH
|
||
|
"Custom" string in combo box is no longer shared with Resolution tab
|
||
|
|
||
|
Rev 1.3 20 Jul 1995 16:24:48 MFH
|
||
|
Now loads strings into size combobox at InitDialog
|
||
|
|
||
|
Rev 1.2 20 Jul 1995 11:26:18 MFH
|
||
|
Fixed bug of not setting default size so it could be retrieved
|
||
|
even if the tab is not shown. Also grays OK button if 0 height or
|
||
|
width
|
||
|
|
||
|
Rev 1.1 19 Jul 1995 14:55:14 MFH
|
||
|
Fixed custom sizes on size page
|
||
|
|
||
|
Rev 1.0 11 Jul 1995 14:20:10 MFH
|
||
|
Initial entry
|
||
|
|
||
|
Rev 1.2 30 Jun 1995 14:45:50 MFH
|
||
|
Added units combo box. Does conversion from pixels to desired
|
||
|
units. Gets default from registry. More standard sizes
|
||
|
|
||
|
Rev 1.1 23 May 1995 15:22:20 MFH
|
||
|
change from pagedll.h to pageopts.h
|
||
|
|
||
|
Rev 1.0 23 May 1995 13:45:50 MFH
|
||
|
Initial entry
|
||
|
*/
|
||
|
//=============================================================================
|
||
|
// sizepge.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "pageopts.h"
|
||
|
#include "sizepge.h"
|
||
|
#include "ctlhids.h"
|
||
|
|
||
|
#include <math.h>
|
||
|
|
||
|
#define UNIT_METRIC 0x30
|
||
|
#define UNIT_INCH 0x31
|
||
|
#define MM_PER_INCH 25.40005
|
||
|
|
||
|
#define UNIT_COMBO_INCHES 0
|
||
|
#define UNIT_COMBO_METRIC 1
|
||
|
#define UNIT_COMBO_PIXELS 2
|
||
|
|
||
|
#define MIN_SIZE 1
|
||
|
#define MAX_SIZE 18000
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
// For context-sensitive help:
|
||
|
// An array of dword pairs, where the first of each
|
||
|
// pair is the control ID, and the second is the
|
||
|
// context ID for a help topic, which is used
|
||
|
// in the help file.
|
||
|
|
||
|
static const DWORD aMenuHelpIDs[] =
|
||
|
{
|
||
|
IDC_UNITS_TEXT, HIDC_UNITS_TEXT,
|
||
|
IDC_SIZE_UNITS, HIDC_SIZE_UNITS,
|
||
|
IDC_SIZE_TEXT, HIDC_SIZE_TEXT,
|
||
|
IDC_SIZE_COMBO, HIDC_SIZE_COMBO,
|
||
|
IDC_WIDTH_TEXT, HIDC_WIDTH_TEXT,
|
||
|
IDC_SIZE_WIDTH, HIDC_SIZE_WIDTH,
|
||
|
IDC_HEIGHT_TEXT, HIDC_HEIGHT_TEXT,
|
||
|
IDC_SIZE_HEIGHT, HIDC_SIZE_HEIGHT,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSizePage dialog
|
||
|
|
||
|
CSizePage::CSizePage()
|
||
|
: CPropertyPage(CSizePage::IDD)
|
||
|
{
|
||
|
m_nInches = UNIT_COMBO_INCHES;
|
||
|
m_nMetric = UNIT_COMBO_METRIC;
|
||
|
m_nPixels = UNIT_COMBO_PIXELS;
|
||
|
|
||
|
m_pParent = NULL;
|
||
|
|
||
|
//{{AFX_DATA_INIT(CSizePage)
|
||
|
m_nSel = -1;
|
||
|
m_nUnitSel = m_nInches;
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_acDec[0] = 0; // Initialize decimal string
|
||
|
|
||
|
// Get whether to default to metric or inches defaults from registry
|
||
|
LCID Locale = GetUserDefaultLCID();
|
||
|
m_nSize = SIZE_CUSTOM;
|
||
|
|
||
|
// First check locale. If this is one of the following
|
||
|
// then can't use Metric vs. US since they are metric but
|
||
|
// default to letter sized paper.
|
||
|
switch(Locale)
|
||
|
{
|
||
|
case 0x1009: // Canada (English)
|
||
|
case 0xC0C: // Canada (French)
|
||
|
case 0x416: // Brazil
|
||
|
case 0x2C0A: // Argentina
|
||
|
case 0x340A: // Chile
|
||
|
case 0x240A: // Columbia
|
||
|
case 0x140A: // Costa Rica
|
||
|
case 0x1C0A: // Dominican Republic
|
||
|
case 0x300A: // Ecuador
|
||
|
case 0x100A: // Guatemala
|
||
|
case 0x80A: // Mexico
|
||
|
case 0x180A: // Panama
|
||
|
case 0x3C0A: // Paraguay
|
||
|
case 0x280A: // Peru
|
||
|
case 0x380A: // Uruguay
|
||
|
case 0x200A: // Venezuela
|
||
|
m_dHeight = 11.0;
|
||
|
m_dWidth = 8.5;
|
||
|
m_nSize = SIZE_LETTER;
|
||
|
break;
|
||
|
} // end switch on locale
|
||
|
|
||
|
// Use get Metric/US for default units and
|
||
|
// to determine initial paper size if not done above
|
||
|
if (GetLocaleInfo(Locale, LOCALE_IMEASURE, (LPTSTR)m_acMeasureType,
|
||
|
sizeof (TCHAR) * LOCALE_INFO) == 0)
|
||
|
*m_acMeasureType = 0;
|
||
|
|
||
|
if (*m_acMeasureType == UNIT_METRIC)
|
||
|
{
|
||
|
if (m_nSize == SIZE_CUSTOM)
|
||
|
m_nSize = SIZE_A4;
|
||
|
ConvertSize();
|
||
|
}
|
||
|
else if (m_nSize == SIZE_CUSTOM)
|
||
|
{
|
||
|
m_dHeight = 11.0;
|
||
|
m_dWidth = 8.5;
|
||
|
m_nSize = SIZE_LETTER;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSizePage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CSizePage)
|
||
|
DDX_CBIndex(pDX, IDC_SIZE_COMBO, m_nSel);
|
||
|
DDX_CBIndex(pDX, IDC_SIZE_UNITS, m_nUnitSel);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CSizePage, CPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CSizePage)
|
||
|
ON_CBN_SELCHANGE(IDC_SIZE_COMBO, OnChangeSize)
|
||
|
ON_CBN_SELCHANGE(IDC_SIZE_UNITS, OnChangeUnits)
|
||
|
ON_EN_CHANGE(IDC_SIZE_HEIGHT, OnChangeHeight)
|
||
|
ON_EN_CHANGE(IDC_SIZE_WIDTH, OnChangeWidth)
|
||
|
ON_WM_SHOWWINDOW()
|
||
|
ON_EN_SETFOCUS(IDC_SIZE_HEIGHT, OnSetFocusHeight)
|
||
|
ON_EN_SETFOCUS(IDC_SIZE_WIDTH, OnSetFocusWidth)
|
||
|
ON_WM_CONTEXTMENU()
|
||
|
ON_WM_HELPINFO()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSizePage Operations
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// GetHeight
|
||
|
// Updates member data from controls (if window has been created).
|
||
|
// Gets resolution from parent window (which gets it from the
|
||
|
// resolution tab) in order to convert the height to pixels,
|
||
|
// Returns height in pixels.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
long CSizePage::GetHeight()
|
||
|
{
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
|
||
|
long lYRes = 100; // 100 dpi default
|
||
|
|
||
|
if (pParentWnd != NULL) // Get final Y resolution value
|
||
|
lYRes = pParentWnd->GetYRes();
|
||
|
|
||
|
long lHeight;
|
||
|
lHeight = (long)(m_dHeight * lYRes); // Convert inches to pixels
|
||
|
return lHeight;
|
||
|
}
|
||
|
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// SetHeight
|
||
|
// Takes input as pixels and converts to inches to save internally.
|
||
|
// Makes sure set size is within boundaries.
|
||
|
// When it needs to be displayed according to the current unit selection,
|
||
|
// or when GetHeight is called, the inch value is converted to desired
|
||
|
// units or pixels respectively.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::SetHeight(long lHeight)
|
||
|
{
|
||
|
if (lHeight < MIN_SIZE)
|
||
|
lHeight = MIN_SIZE;
|
||
|
else if (lHeight > MAX_SIZE)
|
||
|
lHeight = MAX_SIZE;
|
||
|
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
|
||
|
long lYRes = 100; // 100 dpi default
|
||
|
|
||
|
if (pParentWnd != NULL) // Get final Y resolution value
|
||
|
lYRes = pParentWnd->GetYRes();
|
||
|
|
||
|
// Pixels -> Inches = Pels / Res (dpi)
|
||
|
m_dHeight = ((double)lHeight) / lYRes;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// GetWidth
|
||
|
// Updates member data from controls (if window has been created).
|
||
|
// Gets resolution from parent window (which gets it from the
|
||
|
// resolution tab) in order to convert the width to pixels
|
||
|
// if not in pixels already.
|
||
|
// Returns width in pixels.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
long CSizePage::GetWidth()
|
||
|
{
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
long lXRes = 100; // 100 dpi default
|
||
|
|
||
|
if (pParentWnd != NULL) // Get final Y resolution value
|
||
|
lXRes = pParentWnd->GetXRes();
|
||
|
|
||
|
long lWidth = (long)(m_dWidth * lXRes); // Convert inches to pixels
|
||
|
return lWidth;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// SetWidth
|
||
|
// Takes input as pixels and converts to inches to save internally.
|
||
|
// Makes sure set size is within boundaries.
|
||
|
// When it needs to be displayed according to the current unit selection,
|
||
|
// or when GetWidth is called, the inch value is converted to desired
|
||
|
// units or pixels respectively.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::SetWidth(long lWidth)
|
||
|
{
|
||
|
if (lWidth < MIN_SIZE)
|
||
|
lWidth = MIN_SIZE;
|
||
|
else if (lWidth > MAX_SIZE)
|
||
|
lWidth = MAX_SIZE;
|
||
|
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
|
||
|
long lXRes = 100; // 100 dpi default
|
||
|
|
||
|
if (pParentWnd != NULL) // Get final Y resolution value
|
||
|
lXRes = pParentWnd->GetXRes();
|
||
|
|
||
|
m_dWidth = ((double)lWidth) / lXRes; // Convert inches to pixels
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// SetSize
|
||
|
// Set size to a standard size (see PageSht.h for definition of
|
||
|
// the enumerated value PageSize).
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::SetSize(PageSize StdSize)
|
||
|
{
|
||
|
m_nSize = StdSize; // Set current size selection
|
||
|
ConvertSize(); // Get standard size and convert units
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSizePage private functions
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// FillEditBoxes
|
||
|
// Fills the Height and Width edit boxes according to the size
|
||
|
// and units selections. Unless the size selection is Custom,
|
||
|
// the edit boxes are set to be read-only.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::FillEditBoxes()
|
||
|
{
|
||
|
CString szHeight, szWidth;
|
||
|
|
||
|
// Get height/width for selected size and in appropriate units
|
||
|
ConvertSize();
|
||
|
|
||
|
CString szUnits; // Get units string to append if not custom size
|
||
|
if (m_nSize != SIZE_CUSTOM)
|
||
|
{
|
||
|
if (m_nUnitSel == m_nInches)
|
||
|
szUnits.LoadString(IDS_ABBREV_INCH);
|
||
|
else if (m_nUnitSel == m_nMetric)
|
||
|
szUnits.LoadString(IDS_ABBREV_MM);
|
||
|
else szUnits.LoadString(IDS_ABBREV_PELS);
|
||
|
}
|
||
|
else szUnits.Empty();
|
||
|
|
||
|
if (m_nUnitSel == m_nPixels) // Pixels are longs not doubles (no decimal)
|
||
|
{
|
||
|
sprintf(szHeight.GetBuffer(NUMSIZE), "%ld", (long)m_dEditHeight);
|
||
|
sprintf(szWidth.GetBuffer(NUMSIZE), "%ld", (long)m_dEditWidth);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int DecimalPlace, Sign, Count;
|
||
|
if (m_nUnitSel == m_nMetric) // Metric precision to one decimal
|
||
|
Count = 1;
|
||
|
else Count = 2; // Decimal to two decimals
|
||
|
szHeight = _fcvt(m_dEditHeight, Count, &DecimalPlace, &Sign);
|
||
|
if (DecimalPlace < 0)
|
||
|
DecimalPlace = 0;
|
||
|
szHeight = szHeight.Left(DecimalPlace) + m_acDec[0] + szHeight.Mid(DecimalPlace);
|
||
|
szWidth = _fcvt(m_dEditWidth, Count, &DecimalPlace, &Sign);
|
||
|
if (DecimalPlace < 0)
|
||
|
DecimalPlace = 0;
|
||
|
szWidth = szWidth.Left(DecimalPlace) + m_acDec[0] + szWidth.Mid(DecimalPlace);
|
||
|
}
|
||
|
|
||
|
// Append units string
|
||
|
szHeight.ReleaseBuffer();
|
||
|
szHeight += szUnits;
|
||
|
szWidth.ReleaseBuffer();
|
||
|
szWidth += szUnits;
|
||
|
|
||
|
m_HeightCtl.SetWindowText(szHeight);
|
||
|
m_WidthCtl.SetWindowText(szWidth);
|
||
|
|
||
|
// Set read-only == FALSE if custom size selected
|
||
|
if (m_nSize == SIZE_CUSTOM)
|
||
|
{
|
||
|
m_WidthCtl.SetReadOnly(FALSE);
|
||
|
m_HeightCtl.SetReadOnly(FALSE);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_WidthCtl.SetReadOnly(TRUE);
|
||
|
m_HeightCtl.SetReadOnly(TRUE);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSizePage message handlers
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnInitDialog
|
||
|
// Fill the combo boxes with strings
|
||
|
// Initialize the controls according to default selections.
|
||
|
// Units default to localization value in registry
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
BOOL CSizePage::OnInitDialog()
|
||
|
{
|
||
|
CString szSize, szPixels;
|
||
|
m_nSel = m_nSize;
|
||
|
|
||
|
// Fill in Sizes in Size combo box
|
||
|
CComboBox *pSizeCombo = (CComboBox*)GetDlgItem(IDC_SIZE_COMBO);
|
||
|
pSizeCombo->ResetContent();
|
||
|
szSize.LoadString(IDS_SIZE_LETTER);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_TABLOID);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_LEDGER);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_LEGAL);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_STATEMENT);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_EXECUTIVE);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_A3);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_A4);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_A5);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_B4_ISO);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_B4_JIS);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_B5_ISO);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_B5_JIS);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_FOLIO);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_QUARTO);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_SIZE_10X14);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
szSize.LoadString(IDS_CUSTOM_SIZE);
|
||
|
pSizeCombo->AddString(szSize);
|
||
|
|
||
|
// Fill in Units combo box
|
||
|
CComboBox *pUnitsCombo = (CComboBox*)GetDlgItem(IDC_SIZE_UNITS);
|
||
|
pUnitsCombo->ResetContent();
|
||
|
szSize.LoadString(IDS_UNITS_INCHES);
|
||
|
m_nInches = pUnitsCombo->AddString(szSize);
|
||
|
|
||
|
szSize.LoadString(IDS_UNITS_METRIC);
|
||
|
m_nMetric = pUnitsCombo->AddString(szSize);
|
||
|
|
||
|
szSize.LoadString(IDS_UNITS_PIXELS);
|
||
|
m_nPixels = pUnitsCombo->AddString(szSize);
|
||
|
|
||
|
// Set default units according to registry
|
||
|
if (*m_acMeasureType == UNIT_METRIC)
|
||
|
m_nUnitSel = m_nMetric;
|
||
|
else if (*m_acMeasureType == UNIT_INCH)
|
||
|
m_nUnitSel = m_nInches;
|
||
|
else m_nUnitSel = m_nPixels;
|
||
|
|
||
|
// Initialize with values set above
|
||
|
CPropertyPage::OnInitDialog();
|
||
|
|
||
|
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR)m_acDec,
|
||
|
sizeof (TCHAR) * LOCALE_INFO);
|
||
|
|
||
|
m_WidthCtl.cAllow1 = m_acDec[0];
|
||
|
m_HeightCtl.cAllow1 = m_acDec[0];
|
||
|
|
||
|
m_WidthCtl.SubclassDlgItem (IDC_SIZE_WIDTH, this);
|
||
|
m_HeightCtl.SubclassDlgItem (IDC_SIZE_HEIGHT, this);
|
||
|
|
||
|
// Initial height and width should already be set in inches
|
||
|
|
||
|
// Fill in edit boxes according to inches or metric
|
||
|
FillEditBoxes();
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnChangeSize
|
||
|
// If the user changes the size selection, then the edit boxes need
|
||
|
// to be updated to reflect the new size. If 'Custom' is selected
|
||
|
// then the edit boxes become modifiable.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnChangeSize()
|
||
|
{
|
||
|
UpdateData(TRUE);
|
||
|
m_nSize = (PageSize)m_nSel;
|
||
|
FillEditBoxes();
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnChangeUnits
|
||
|
// If the user changes the desired units, then the sizes in the
|
||
|
// edit boxes need to be converted to the new units.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnChangeUnits()
|
||
|
{
|
||
|
UpdateData(TRUE);
|
||
|
FillEditBoxes();
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
{
|
||
|
m_WidthCtl.cAllow1 = NULL;
|
||
|
m_HeightCtl.cAllow1 = NULL;
|
||
|
return;
|
||
|
}
|
||
|
m_WidthCtl.cAllow1 = m_acDec[0];
|
||
|
m_HeightCtl.cAllow1 = m_acDec[0];
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// ConvertSize: If the user has selected a standard sized page,
|
||
|
// need to get standard size and convert it to selected units
|
||
|
// to be displayed in the edit boxes for height and width.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
void CSizePage::ConvertSize()
|
||
|
{
|
||
|
int nUnits;
|
||
|
|
||
|
switch(m_nSize) // Switch on selected size
|
||
|
{
|
||
|
case SIZE_LETTER: // Letter 8 1/2 x 11 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 8.5;
|
||
|
m_dEditHeight = 11;
|
||
|
break;
|
||
|
case SIZE_TABLOID: // Tabloid 11 x 17 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 11;
|
||
|
m_dEditHeight = 17;
|
||
|
break;
|
||
|
case SIZE_LEDGER: // Ledger 17 x 11 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 17;
|
||
|
m_dEditHeight = 11;
|
||
|
break;
|
||
|
case SIZE_LEGAL: // Legal 8 1/2 x 14 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 8.5;
|
||
|
m_dEditHeight = 14;
|
||
|
break;
|
||
|
case SIZE_STATEMENT: // Statement 5 1/2 x 8 1/2 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 5.5;
|
||
|
m_dEditHeight = 8.5;
|
||
|
break;
|
||
|
case SIZE_EXECUTIVE: // Executive 7 1/4 x 10 1/2 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 7.25;
|
||
|
m_dEditHeight = 10.5;
|
||
|
break;
|
||
|
case SIZE_A3: // A3 297 x 420 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 297.0;
|
||
|
m_dEditHeight = 420.0;
|
||
|
break;
|
||
|
case SIZE_A4: // A4 210 x 297 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 210.;
|
||
|
m_dEditHeight = 297.;
|
||
|
break;
|
||
|
case SIZE_A5: // A5 148 x 210 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 148.;
|
||
|
m_dEditHeight = 210.;
|
||
|
break;
|
||
|
case SIZE_B4_ISO: // B4 (ISO) 250 x 353 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 250.;
|
||
|
m_dEditHeight = 353.;
|
||
|
break;
|
||
|
case SIZE_B4_JIS: // B4 (JIS) 257 x 364 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 257.;
|
||
|
m_dEditHeight = 364.;
|
||
|
break;
|
||
|
case SIZE_B5_ISO: // B5 (ISO) 176 x 250 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 176.;
|
||
|
m_dEditHeight = 250.;
|
||
|
break;
|
||
|
case SIZE_B5_JIS: // B5 (JIS) 182 x 257 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 182.;
|
||
|
m_dEditHeight = 257.;
|
||
|
break;
|
||
|
case SIZE_FOLIO: // Folio 8 1/2 x 13 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 8.5;
|
||
|
m_dEditHeight = 13;
|
||
|
break;
|
||
|
case SIZE_QUARTO: // Quarto 215 x 275 mm
|
||
|
nUnits = m_nMetric;
|
||
|
m_dEditWidth = 215.;
|
||
|
m_dEditHeight = 275.;
|
||
|
break;
|
||
|
case SIZE_10X14: // 10x14 in
|
||
|
nUnits = m_nInches;
|
||
|
m_dEditWidth = 10;
|
||
|
m_dEditHeight = 14;
|
||
|
break;
|
||
|
case SIZE_CUSTOM: // Custom size (default)
|
||
|
default:
|
||
|
nUnits = m_nInches; // Convert from inches to whatever
|
||
|
m_dEditWidth = m_dWidth;
|
||
|
m_dEditHeight = m_dHeight;
|
||
|
break;
|
||
|
} // end switch on selected size
|
||
|
|
||
|
// If units are inches
|
||
|
if (nUnits == m_nInches)
|
||
|
{
|
||
|
m_dWidth = m_dEditWidth; // Save current values in inches
|
||
|
m_dHeight = m_dEditHeight;
|
||
|
|
||
|
if (m_nUnitSel == m_nInches) // If want inches displayed
|
||
|
return; // All set so return;
|
||
|
}
|
||
|
|
||
|
// Note, nUnits can never be pixels since it is only set to
|
||
|
// inches or metric above.
|
||
|
|
||
|
if (nUnits != m_nInches) // Have metric, need inches
|
||
|
{
|
||
|
// Metric -> Inches = MM / MM_PER_INCH
|
||
|
m_dWidth = m_dEditWidth / MM_PER_INCH;
|
||
|
m_dHeight = m_dEditHeight / MM_PER_INCH;
|
||
|
|
||
|
// If want to display inches, set edit box values and return
|
||
|
if (m_nUnitSel == m_nInches)
|
||
|
{
|
||
|
m_dEditWidth = m_dWidth;
|
||
|
m_dEditHeight = m_dHeight;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_nUnitSel == m_nMetric) // Want metric
|
||
|
{
|
||
|
if (nUnits == m_nMetric) // Have metric. All set
|
||
|
return;
|
||
|
|
||
|
// Convert inches to Metric
|
||
|
m_dEditHeight = m_dHeight * MM_PER_INCH;
|
||
|
m_dEditWidth = m_dWidth * MM_PER_INCH;
|
||
|
return; // All done
|
||
|
}
|
||
|
|
||
|
// Otherwise want pixels, use inches value to get pixels
|
||
|
// Inches to Pels -> Inches * dpi
|
||
|
// Need to convert to inches, then if needed convert to desired units
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
|
||
|
long lXRes = 100; // 100 dpi default
|
||
|
long lYRes = 100;
|
||
|
|
||
|
if (pParentWnd != NULL)
|
||
|
{
|
||
|
lXRes = pParentWnd->GetXRes(); // dpi or pixels/inch
|
||
|
lYRes = pParentWnd->GetYRes();
|
||
|
}
|
||
|
|
||
|
m_dEditHeight = m_dHeight * lYRes;
|
||
|
m_dEditWidth = m_dWidth * lXRes;
|
||
|
|
||
|
if (((long)m_dEditWidth) == 0)
|
||
|
m_dEditWidth = 0;
|
||
|
if (((long)m_dEditHeight) == 0)
|
||
|
m_dEditHeight = 0;
|
||
|
|
||
|
// Round off properly
|
||
|
double dInteger;
|
||
|
double dFraction = modf(m_dEditWidth, &dInteger);
|
||
|
if (dFraction < 0.50)
|
||
|
m_dEditWidth = dInteger;
|
||
|
else m_dEditWidth = ceil(m_dEditWidth);
|
||
|
dFraction = modf(m_dEditHeight, &dInteger);
|
||
|
if (dFraction < 0.50)
|
||
|
m_dEditHeight = dInteger;
|
||
|
else m_dEditHeight = ceil(m_dEditHeight);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnChangeHeight
|
||
|
// Get new height value and check if 'OK' on parent window should
|
||
|
// be enabled or disabled. If the Height or Width on this
|
||
|
// tab or the X resolution or Y resolution on the Resolution tab
|
||
|
// is 0 or a non-numeric value, then the 'OK' button on the parent
|
||
|
// window is disabled.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnChangeHeight()
|
||
|
{
|
||
|
UpdateData();
|
||
|
|
||
|
CString szHeight;
|
||
|
m_HeightCtl.GetWindowText(szHeight);
|
||
|
|
||
|
// Replace decimal char with '.' for internal number
|
||
|
if ((m_acDec[0] != '.') && (m_acDec[0] != '\0'))
|
||
|
{
|
||
|
int nDecIndex;
|
||
|
nDecIndex = szHeight.Find(m_acDec[0]);
|
||
|
if (nDecIndex != -1)
|
||
|
szHeight.SetAt(nDecIndex, '.');
|
||
|
}
|
||
|
|
||
|
char *pEndChar;
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
{
|
||
|
m_dEditHeight = (double)strtol(szHeight, &pEndChar, 10);
|
||
|
// Save as inches
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
long lYRes = 100;
|
||
|
if (pParentWnd != NULL)
|
||
|
lYRes = pParentWnd->GetYRes();
|
||
|
m_dHeight = m_dEditHeight / lYRes;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_dEditHeight = strtod(szHeight, &pEndChar);
|
||
|
if (m_nUnitSel == m_nMetric) // Save as inches
|
||
|
m_dHeight = m_dEditHeight / MM_PER_INCH;
|
||
|
else m_dHeight = m_dEditHeight;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnChangeWidth
|
||
|
// Get new Width value and check if 'OK' on parent window should
|
||
|
// be enabled or disabled. If the Height or Width on this
|
||
|
// tab or the X resolution or Y resolution on the Resolution tab
|
||
|
// is 0 or a non-numeric value, then the 'OK' button on the parent
|
||
|
// window is disabled.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnChangeWidth()
|
||
|
{
|
||
|
UpdateData();
|
||
|
|
||
|
CString szWidth;
|
||
|
m_WidthCtl.GetWindowText(szWidth);
|
||
|
|
||
|
// Replace decimal char with '.' for internal number
|
||
|
if ((m_acDec[0] != '.') && (m_acDec[0] != '\0'))
|
||
|
{
|
||
|
int nDecIndex;
|
||
|
nDecIndex = szWidth.Find(m_acDec[0]);
|
||
|
if (nDecIndex != -1)
|
||
|
szWidth.SetAt(nDecIndex, '.');
|
||
|
}
|
||
|
|
||
|
char *pEndChar;
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
{
|
||
|
m_dEditWidth = (double)strtol(szWidth, &pEndChar, 10);
|
||
|
// Save as inches
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
long lXRes = 100;
|
||
|
if (pParentWnd != NULL)
|
||
|
lXRes = pParentWnd->GetXRes();
|
||
|
m_dWidth = m_dEditWidth / lXRes;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_dEditWidth = strtod(szWidth, &pEndChar);
|
||
|
if (m_nUnitSel == m_nMetric) // Save as inches
|
||
|
m_dWidth = m_dEditWidth / MM_PER_INCH;
|
||
|
else m_dWidth = m_dEditWidth;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnShowWindow
|
||
|
// When window is shown, it could be that the resolution has changed.
|
||
|
// If the current unit selection is pixels, then the pixels need to
|
||
|
// be updated to reflect the new resolution.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnShowWindow(BOOL bShow, UINT nStatus)
|
||
|
{
|
||
|
CPropertyPage::OnShowWindow(bShow, nStatus);
|
||
|
|
||
|
if (bShow == TRUE)
|
||
|
{
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
FillEditBoxes();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnKillActive
|
||
|
// Called by the framework when this tab is losing the active focus.
|
||
|
// It is called before the OK button is clicked as well. TRUE is
|
||
|
// returned if the data on the tab is valid. Otherwise, set focus
|
||
|
// to the offending data and return FALSE.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
BOOL CSizePage::OnKillActive()
|
||
|
{
|
||
|
CPagePropSheet *pParentWnd = (CPagePropSheet *)m_pParent;
|
||
|
if (pParentWnd == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
long lXRes = pParentWnd->GetXRes(); // Get resolutions
|
||
|
long lYRes = pParentWnd->GetYRes();
|
||
|
|
||
|
CString szSizeError;
|
||
|
CString szTitle;
|
||
|
|
||
|
// Check Width
|
||
|
// If pixels is < 1 or > 18,000, invalid
|
||
|
if (((m_dWidth * lXRes) < MIN_SIZE) ||
|
||
|
((m_dWidth * lXRes) > MAX_SIZE))
|
||
|
{
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
szSizeError.LoadString(IDS_ERROR_SIZEPIX);
|
||
|
else szSizeError.LoadString(IDS_ERROR_SIZECONVERT);
|
||
|
pParentWnd->GetWindowText(szTitle);
|
||
|
MessageBox(szSizeError, szTitle);
|
||
|
m_WidthCtl.SetFocus();
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// If pixels is < 1 or > 18,000, invalid
|
||
|
if (((m_dHeight * lYRes) < MIN_SIZE) ||
|
||
|
((m_dHeight * lYRes) > MAX_SIZE))
|
||
|
{
|
||
|
if (m_nUnitSel == m_nPixels)
|
||
|
szSizeError.LoadString(IDS_ERROR_SIZEPIX);
|
||
|
else szSizeError.LoadString(IDS_ERROR_SIZECONVERT);
|
||
|
pParentWnd->GetWindowText(szTitle);
|
||
|
MessageBox(szSizeError, szTitle);
|
||
|
m_HeightCtl.SetFocus();
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnSetFocusHeight
|
||
|
// When the Height edit box gets the focus, select the text
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnSetFocusHeight()
|
||
|
{
|
||
|
m_HeightCtl.SetSel(0, -1);
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// OnSetFocusWidth
|
||
|
// When the Width edit box gets the focus, select the text
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CSizePage::OnSetFocusWidth()
|
||
|
{
|
||
|
m_WidthCtl.SetSel(0, -1);
|
||
|
}
|
||
|
|
||
|
void CSizePage::OnContextMenu(CWnd* pWnd, CPoint point)
|
||
|
{
|
||
|
// All tabs have same ID so can't give tab specific help
|
||
|
if (::GetDlgCtrlID(pWnd->GetSafeHwnd()) == AFX_IDC_TAB_CONTROL)
|
||
|
return;
|
||
|
|
||
|
::WinHelp (pWnd->GetSafeHwnd(),"wangocx.hlp", HELP_CONTEXTMENU,
|
||
|
(DWORD)(LPVOID)aMenuHelpIDs);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
BOOL CSizePage::OnHelpInfo(HELPINFO* pHelpInfo)
|
||
|
{
|
||
|
// All tabs have same ID so can't give tab specific help
|
||
|
if (pHelpInfo->iCtrlId == AFX_IDC_TAB_CONTROL)
|
||
|
return 0L;
|
||
|
|
||
|
if (pHelpInfo->iContextType == HELPINFO_WINDOW) // must be for a control
|
||
|
{
|
||
|
::WinHelp ((HWND)pHelpInfo->hItemHandle, "wangocx.hlp",
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD)(LPVOID)aMenuHelpIDs);
|
||
|
}
|
||
|
return 1L;
|
||
|
}
|