home *** CD-ROM | disk | FTP | other *** search
- // BannDlg.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "Banner.h"
- #include "BannDlg.h"
- #include "Metrics.h"
-
- #include <math.h> // for log10 function
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CBannerDlg dialog
-
-
- CBannerDlg::CBannerDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CBannerDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CBannerDlg)
- m_bBold = TRUE;
- m_bItalic = FALSE;
- m_bBorder = TRUE;
- m_bCenterH = TRUE;
- m_bCenterV = TRUE;
- m_nFontHeight = 3500; // 3.5"
- m_strBannerText.LoadString(IDS_BANNER);
- m_strFontName.LoadString(IDS_FONT);
- m_lfCharSet = ANSI_CHARSET;
- //}}AFX_DATA_INIT
- }
-
- CBannerDlg::CBannerDlg(const CBannerDlg& dlg)
- {
- operator=(dlg);
- }
-
- const CBannerDlg& CBannerDlg::operator=(const CBannerDlg& dlg)
- {
- m_bBold = dlg.m_bBold;
- m_bBorder = dlg.m_bBorder;
- m_bCenterH = dlg.m_bCenterH;
- m_bCenterV = dlg.m_bCenterV;
- m_strBannerText = dlg.m_strBannerText;
- m_nFontHeight = dlg.m_nFontHeight;
- m_strFontName = dlg.m_strFontName;
- m_lfCharSet = dlg.m_lfCharSet;
- m_bItalic = dlg.m_bItalic;
- m_pDC = dlg.m_pDC;
-
- return *this;
- }
-
-
- void CBannerDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CBannerDlg)
- DDX_Check(pDX, IDC_BOLD, m_bBold);
- DDX_Check(pDX, IDC_CENTER_H, m_bCenterH);
- DDX_Check(pDX, IDC_CENTER_V, m_bCenterV);
- DDX_Text(pDX, IDC_BANNER_TEXT, m_strBannerText);
- DDX_CBString(pDX, IDC_FONTNAME, m_strFontName);
- DDX_Check(pDX, IDC_ITALIC, m_bItalic);
- DDX_Check(pDX, IDC_BORDER, m_bBorder);
- //}}AFX_DATA_MAP
-
- // Handle lfCharSet
- if(pDX->m_bSaveAndValidate)
- {
- CComboBox listBox;
- listBox.Attach(GetDlgItem(IDC_FONTNAME)->m_hWnd);
- int nIndex = listBox.GetCurSel();
- m_lfCharSet = (BYTE)listBox.GetItemData(nIndex);
- listBox.Detach();
- }
-
- // Font height is handled differently
- double lfFontHeight;
-
- if(pDX->m_bSaveAndValidate)
- {
- CString szCheck;
-
- DDX_Text(pDX, IDC_FONTHEIGHT, szCheck);
- if(szCheck.FindOneOf(_T("123456789")) == -1)
- lfFontHeight = 1.0;
- else
- DDX_Text(pDX, IDC_FONTHEIGHT, lfFontHeight);
- if(lfFontHeight < 0)
- lfFontHeight = 1.0;
- if(lfFontHeight > 8.0)
- lfFontHeight = 8.0;
- m_nFontHeight = (int)(lfFontHeight*1000.0);
- }
- else
- {
- TCHAR szHeight[20];
- lfFontHeight = (double)m_nFontHeight/1000.0;
- swprintf(szHeight,CString((LPCTSTR)IDS_HEIGHT),(int)(log10(lfFontHeight)+1)+1,lfFontHeight);
- DDX_Text(pDX, IDC_FONTHEIGHT, CString(szHeight));
- }
- }
-
-
- BEGIN_MESSAGE_MAP(CBannerDlg, CDialog)
- //{{AFX_MSG_MAP(CBannerDlg)
- ON_EN_CHANGE(IDC_FONTHEIGHT, UpdateSizeControl)
- ON_BN_CLICKED(IDC_CENTER_V, UpdateSizeControl)
- ON_BN_CLICKED(IDC_CENTER_H, UpdateSizeControl)
- ON_BN_CLICKED(IDC_BORDER, UpdateSizeControl)
- ON_BN_CLICKED(IDC_BOLD, UpdateSizeControl)
- ON_EN_CHANGE(IDC_BANNER_TEXT, UpdateSizeControl)
- ON_BN_CLICKED(IDC_ITALIC, UpdateSizeControl)
- ON_CBN_SELCHANGE(IDC_FONTNAME, UpdateSizeControl)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CBannerDlg message handlers
-
- void CBannerDlg::UpdateSizeControl()
- {
- // Save off original values (when DoModal() was called) so we can do a
- // data exchange to calculate size
- CBannerDlg tempDlg = *this;
- UpdateData(TRUE);
-
- CSize size = GetTextSize(m_pDC);
-
- // Revert to original values (when DoModal() was called)
- *this = tempDlg;
-
- CBannerMetrics mx(m_pDC);
- double lfHorz = (double)size.cx/mx.Inch().cx;
- double lfVert = (double)size.cy/mx.Inch().cy;
-
- TCHAR szSize[50];
- swprintf(szSize,CString((LPCTSTR)IDS_THORZ),(int)(log10(lfHorz)+1)+1,lfHorz);
- swprintf(szSize+wcslen(szSize),CString((LPCTSTR)IDS_TVERT),(int)(log10(lfVert)+1)+1,lfVert);
- GetDlgItem(IDC_BANNER_SIZE)->SetWindowText(szSize);
- }
-
-
- CSize CBannerDlg::GetTextSize(CDC *pDC, int nCurrZoom /* = -1 */)
- {
- CFont font, *pPrevFont;
- if(!CreateFont(pDC, &font, nCurrZoom))
- return CSize(0,0);
- pPrevFont = pDC->SelectObject(&font);
-
- // GetTextExtent only works on single-line strings, so we need to loop through lines
- TCHAR *str = new TCHAR[m_strBannerText.GetLength()+1];
- TCHAR *curr = str, *end;
- CSize size(0,0), tempSize;
- _tcscpy(str, m_strBannerText);
- do
- {
- if((end = wcschr(curr,'\n')) != NULL)
- *end = _T('\0');
- tempSize = pDC->GetTextExtent(curr);
- if(tempSize.cx >= size.cx)
- size.cx = tempSize.cx;
- size.cy += tempSize.cy;
- curr = end+1;
- } while(end != NULL);
-
- delete [] str;
-
- if(m_bBorder)
- {
- CBannerMetrics mx(pDC, nCurrZoom);
- size.cx += mx.BorderGap().cx*2 + mx.BorderThickness().cx;
- size.cy += mx.BorderGap().cy*2 + mx.BorderThickness().cy;
- }
-
- pDC->SelectObject(pPrevFont);
- font.DeleteObject();
-
- return size;
- }
-
- BOOL CBannerDlg::CreateFont(CDC *pDC, CFont *pFont, int nCurrZoom /* = -1 */)
- {
- ASSERT(pDC != NULL);
-
- CBannerMetrics mx(pDC, nCurrZoom);
- int nHeight = -m_nFontHeight * mx.Inch().cy / 1000; // m_nFontHeight in 1/1000"
- return pFont->CreateFont(nHeight, 0, 0, 0,
- m_bBold ? FW_BOLD : FW_NORMAL, m_bItalic, 0, 0,
- m_lfCharSet,
- 0, 0, 0, 0,
- m_strFontName);
- }
-
- int CBannerDlg::DoModal(CDC *pDC)
- {
- m_pDC = pDC;
- ASSERT(m_pDC != NULL);
-
- return CDialog::DoModal();
- }
-
- BOOL CBannerDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- UpdateSizeControl();
- FillFontDropdown();
- return TRUE;
- }
-
- int CALLBACK EnumFontFamProc(const LOGFONT FAR *lplf, const TEXTMETRIC FAR *lpntm,
- DWORD FontType, LPARAM lParam)
- {
- CComboBox *pListBox = (CComboBox*)lParam;
- if(FontType == TRUETYPE_FONTTYPE)
- {
- int nIndex = pListBox->AddString(lplf->lfFaceName);
- pListBox->SetItemData(nIndex, (DWORD)lplf->lfCharSet);
- }
- return 1;
- }
-
- void CBannerDlg::FillFontDropdown()
- {
- ASSERT(m_pDC != NULL);
-
- CComboBox listBox;
- listBox.Attach(GetDlgItem(IDC_FONTNAME)->m_hWnd);
- EnumFontFamilies(m_pDC->m_hDC, NULL, EnumFontFamProc, (LPARAM)&listBox);
- listBox.SelectString(0, m_strFontName);
- listBox.Detach();
- }
-