home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK8 / MFC / SAMPLES / SHOWFONT / DIALOGS.CP$ / dialogs
Encoding:
Text File  |  1992-03-09  |  13.4 KB  |  533 lines

  1. // dialogs.cpp : Several simple dialogs for the ShowFont main window.
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library. 
  4. // Copyright (C) 1992 Microsoft Corporation 
  5. // All rights reserved. 
  6. //  
  7. // This source code is only intended as a supplement to the 
  8. // Microsoft Foundation Classes Reference and Microsoft 
  9. // QuickHelp documentation provided with the library. 
  10. // See these sources for detailed information regarding the 
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "showfont.h"
  14.  
  15. static int CurrentFont = 0;
  16. static int CurrentSize = 0;
  17. static char FontList[MAXFONT][32];
  18. static BYTE CharSet[MAXFONT];
  19. static BYTE PitchAndFamily[MAXFONT];
  20. static int FontIndex = 0;
  21. static int SizeList[MAXSIZE];
  22. static int SizeIndex = 0;
  23.  
  24. static CStringList fontList;        // list of added fonts
  25.  
  26. /////////////////////////////////////////////////////////////////////////////
  27. // forward declarations
  28.  
  29. static void GetSizes(CWnd* wnd, int iCurrentFont);
  30.  
  31. static CString SeparateFile(char* pszDestPath, const char* pszSrcFileName);
  32.  
  33. /////////////////////////////////////////////////////////////////////////////
  34. // About dialog
  35.  
  36. void CMainWindow::OnAbout()
  37. {
  38.     CModalDialog about("AboutBox", this);
  39.     about.DoModal();
  40. }
  41.  
  42. /////////////////////////////////////////////////////////////////////////////
  43. // Select Font dialog
  44.  
  45. class CSelFtDlg : public CModalDialog
  46. {
  47. public:
  48.     CSelFtDlg() : CModalDialog("SelectFont")
  49.         { }
  50.  
  51.     CListBox&   TypefaceList()
  52.                     { return *((CListBox*) GetDlgItem(ID_TYPEFACE)); } 
  53.     CListBox&   TypesizeList()
  54.                     { return *((CListBox*) GetDlgItem(ID_SIZE)); } 
  55.  
  56.     BOOL OnInitDialog()
  57.     {
  58.         CListBox& facesList = TypefaceList();
  59.         CListBox& sizesList = TypesizeList();
  60.  
  61.         for (int i = 0; i < FontIndex; i++)
  62.         {
  63.             // Display available fonts.
  64.             //
  65.             facesList.AddString(FontList[i]);
  66.             facesList.SetCurSel(0);
  67.         }
  68.         GetSizes(this, 0);
  69.         for (i = 0; i < SizeIndex; i++)
  70.         {
  71.             // Display font sizes.
  72.             //
  73.             char buf[LF_FACESIZE];
  74.             sprintf(buf, "%d", SizeList[i]);
  75.             sizesList.AddString(buf);
  76.             sizesList.SetCurSel(0);
  77.         }
  78.         return TRUE;
  79.     }
  80.  
  81.     afx_msg void OnOK()
  82.     {
  83.         int index;
  84.         if ((index = TypefaceList().GetCurSel()) == LB_ERR)
  85.         {
  86.             MessageBox("No font selected",
  87.                 "Select Font", MB_OK | MB_ICONEXCLAMATION);
  88.             return;
  89.         }
  90.         CurrentFont = index;
  91.  
  92.         if ((index = TypesizeList().GetCurSel()) == LB_ERR)
  93.         {
  94.             MessageBox("No size selected",
  95.                 "Select Font", MB_OK | MB_ICONEXCLAMATION);
  96.             return;
  97.         }
  98.         CurrentSize = index;
  99.         EndDialog(IDOK);
  100.     }
  101.  
  102.     afx_msg void OnTypeFaceChange()
  103.     {
  104.         int index = TypefaceList().GetCurSel();
  105.         if (index == LB_ERR)
  106.             return;
  107.         TypesizeList().ResetContent();
  108.         GetSizes(this, index);
  109.  
  110.         CListBox& sizesList = TypesizeList();
  111.         for (int i = 0; i < SizeIndex; i++)
  112.         {
  113.             char buf[LF_FACESIZE];
  114.             sprintf(buf, "%d", SizeList[i]);
  115.             sizesList.AddString(buf);
  116.             sizesList.SetCurSel(0);
  117.         }
  118.     }
  119.  
  120.     DECLARE_MESSAGE_MAP()
  121. };
  122.  
  123. BEGIN_MESSAGE_MAP(CSelFtDlg, CModalDialog)
  124.     ON_LBN_SELCHANGE(ID_TYPEFACE, OnTypeFaceChange)
  125.  
  126.     // Double-click on the listboxes act like clicking OK.  No extra code!
  127.     ON_LBN_DBLCLK(ID_TYPEFACE, OnOK)
  128.     ON_LBN_DBLCLK(ID_SIZE, OnOK)
  129. END_MESSAGE_MAP()
  130.  
  131. void CMainWindow::OnSelectFont()
  132. {
  133.     CSelFtDlg dlg;
  134.     if (dlg.DoModal() != IDOK)
  135.         return;     // cancelled
  136.  
  137.     // change the font
  138.     myFont->DeleteObject();
  139.     myFont->CreateFont(SizeList[CurrentSize],
  140.         0, 0, 0, FW_NORMAL,
  141.         FALSE, FALSE, FALSE,
  142.         CharSet[CurrentFont],
  143.         OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  144.         PitchAndFamily[CurrentFont],
  145.         FontList[CurrentFont]);
  146.     pTheFont = myFont;
  147.     SetFaceName();
  148. }
  149.  
  150. /////////////////////////////////////////////////////////////////////////////
  151. // TextMetrics modeless dialog
  152.  
  153. class CMetricDlg : public CDialog   // modeless
  154. {
  155. private:
  156.     const TEXTMETRIC& textMetric;
  157.  
  158. public:
  159.     CMetricDlg(TEXTMETRIC& rtextMetric) : textMetric(rtextMetric)
  160.     {
  161.         VERIFY(Create("MetricBox"));
  162.     }
  163.  
  164.     afx_msg void OnClose()
  165.     {
  166.         delete this;    // Note this does the DestroyWindow automatically.
  167.     }
  168.  
  169.     BOOL OnInitDialog();
  170.  
  171.     DECLARE_MESSAGE_MAP()
  172. };
  173.  
  174. BEGIN_MESSAGE_MAP(CMetricDlg, CDialog)
  175.     ON_WM_CLOSE()
  176. END_MESSAGE_MAP()
  177.  
  178. BOOL CMetricDlg::OnInitDialog()
  179. {
  180.     // fill in the dialog with statistics
  181.     SetDlgItemInt(IDMB_HEIGHT, textMetric.tmHeight, FALSE);
  182.     SetDlgItemInt(IDMB_ASCENT, textMetric.tmAscent, FALSE);
  183.     SetDlgItemInt(IDMB_DESCENT, textMetric.tmDescent, FALSE);
  184.     SetDlgItemInt(IDMB_INTERNALLEADING, textMetric.tmInternalLeading, FALSE);
  185.     SetDlgItemInt(IDMB_EXTERNALLEADING, textMetric.tmExternalLeading, FALSE);
  186.     SetDlgItemInt(IDMB_AVECHARWIDTH, textMetric.tmAveCharWidth, FALSE);
  187.     SetDlgItemInt(IDMB_MAXCHARWIDTH, textMetric.tmMaxCharWidth, FALSE);
  188.     SetDlgItemInt(IDMB_WEIGHT, textMetric.tmWeight, FALSE);
  189.     SetDlgItemInt(IDMB_ITALIC, textMetric.tmItalic, FALSE);
  190.     SetDlgItemInt(IDMB_UNDERLINED, textMetric.tmUnderlined, FALSE);
  191.     SetDlgItemInt(IDMB_STRUCKOUT, textMetric.tmStruckOut, FALSE);
  192.     SetDlgItemInt(IDMB_FIRSTCHAR, textMetric.tmFirstChar, FALSE);
  193.     SetDlgItemInt(IDMB_LASTCHAR, textMetric.tmLastChar, FALSE);
  194.     SetDlgItemInt(IDMB_DEFAULTCHAR, textMetric.tmDefaultChar, FALSE);
  195.     SetDlgItemInt(IDMB_BREAKCHAR, textMetric.tmBreakChar, FALSE);
  196.     SetDlgItemInt(IDMB_PITCHANDFAMILY, textMetric.tmPitchAndFamily, FALSE);
  197.     SetDlgItemInt(IDMB_CHARSET, textMetric.tmCharSet, FALSE);
  198.     SetDlgItemInt(IDMB_OVERHANG, textMetric.tmOverhang, FALSE);
  199.     SetDlgItemInt(IDMB_DIGITIZEDASPECTX, textMetric.tmDigitizedAspectX, FALSE);
  200.     SetDlgItemInt(IDMB_DIGITIZEDASPECTY, textMetric.tmDigitizedAspectY, FALSE);
  201.     return TRUE;
  202. }
  203.  
  204.  
  205. void CMainWindow::OnShowTextMetric()
  206. {
  207.     CClientDC dc(this);
  208.     CFont* oldFont = dc.SelectObject(pTheFont);
  209.     if (oldFont == NULL)
  210.         return;
  211.  
  212.     TEXTMETRIC textMetric;
  213.     dc.GetTextMetrics(&textMetric);
  214.  
  215.     CMetricDlg* pDlg;
  216.     pDlg = new CMetricDlg(textMetric);
  217.  
  218.     char szDialogTitle[100];
  219.     char buf[80];
  220.     strcpy(szDialogTitle, "Metric Font: ");
  221.     dc.GetTextFace(80, buf);
  222.     strcat(szDialogTitle, buf);
  223.     pDlg->SetWindowText(szDialogTitle);
  224.  
  225.     dc.SelectObject(oldFont);
  226. }
  227.  
  228. /////////////////////////////////////////////////////////////////////////////
  229. // Show LogicalFont modeless dialog
  230.  
  231. class CLogFontDlg : public CDialog  // modeless
  232. {
  233. private:
  234.     const LOGFONT& logFont;  // just needed for init
  235.  
  236. public:
  237.     CLogFontDlg(const LOGFONT& rLogFont) : logFont(rLogFont)
  238.         {
  239.             VERIFY(Create("LogBox"));
  240.         }
  241.  
  242.     afx_msg void OnClose()
  243.         {
  244.             delete this;  // Does DestroyWindow for us.
  245.         }
  246.  
  247.     BOOL OnInitDialog();
  248.  
  249.     DECLARE_MESSAGE_MAP()
  250. };
  251.  
  252. BEGIN_MESSAGE_MAP(CLogFontDlg, CDialog)
  253.     ON_WM_CLOSE()
  254. END_MESSAGE_MAP()
  255.  
  256. BOOL CLogFontDlg::OnInitDialog()
  257. {
  258.     // Fill in the dialog with statistics.
  259.     SetDlgItemInt(IDMI_HEIGHT, logFont.lfHeight, FALSE);
  260.     SetDlgItemInt(IDMI_WIDTH, logFont.lfWidth, FALSE);
  261.     SetDlgItemInt(IDMI_ESCAPEMENT, logFont.lfEscapement, FALSE);
  262.     SetDlgItemInt(IDMI_ORIENTATION, logFont.lfOrientation, FALSE);
  263.     SetDlgItemInt(IDMI_WEIGHT, logFont.lfWeight, FALSE);
  264.     SetDlgItemInt(IDMI_ITALIC, logFont.lfItalic, FALSE);
  265.     SetDlgItemInt(IDMI_UNDERLINED, logFont.lfUnderline, FALSE);
  266.     SetDlgItemInt(IDMI_STRIKEOUT, logFont.lfStrikeOut, FALSE);
  267.     SetDlgItemInt(IDMI_CHARSET, logFont.lfCharSet, FALSE);
  268.     SetDlgItemInt(IDMI_OUTPRECISION, logFont.lfOutPrecision, FALSE);
  269.     SetDlgItemInt(IDMI_CLIPPRECISION, logFont.lfClipPrecision, FALSE);
  270.     SetDlgItemInt(IDMI_QUALITY, logFont.lfQuality, FALSE);
  271.     SetDlgItemInt(IDMI_PITCHANDFAMILY, logFont.lfPitchAndFamily, FALSE);
  272.     return TRUE;
  273. }
  274.  
  275. void CMainWindow::OnShowLogFont()
  276. {
  277.     CClientDC dc(this);
  278.     CFont* oldFont = dc.SelectObject(&systemFont);
  279.     if (oldFont == NULL)
  280.         return;
  281.  
  282.     TEXTMETRIC TextMetric;
  283.  
  284.     dc.GetTextMetrics(&TextMetric);
  285.     nLineSpace = TextMetric.tmHeight + TextMetric.tmExternalLeading;
  286.     LOGFONT logFont;
  287.     pTheFont->GetObject(sizeof(LOGFONT), &logFont);
  288.  
  289.     CLogFontDlg* pDlg;
  290.     pDlg = new CLogFontDlg(logFont);    // logFont just needed for init
  291.     char szDialogTitle[100];
  292.     strcpy(szDialogTitle, "Log Font: ");
  293.     strcat(szDialogTitle, (const char*)logFont.lfFaceName);
  294.     pDlg->SetWindowText(szDialogTitle);
  295.  
  296.     dc.SelectObject(oldFont);
  297. }
  298.  
  299. /////////////////////////////////////////////////////////////////////////////
  300. // Add Font dialog
  301.  
  302. class CAddFontDlg : public CModalDialog
  303. {
  304. public:
  305.     CAddFontDlg() : CModalDialog("Add")
  306.         { }
  307.  
  308. // Attributes
  309.     char m_szPath[256]; // not a CString since we use it
  310.                         //  as parameter to DlgDirSelect
  311.  
  312. // Implementation
  313.     BOOL OnInitDialog();
  314.     afx_msg void OnOK();
  315.     afx_msg void OnFileChange();
  316.     DECLARE_MESSAGE_MAP()
  317. };
  318.  
  319. BOOL CAddFontDlg::OnInitDialog()
  320. {
  321.     SetWindowText("Add Font Resource");
  322.     DlgDirList(m_szPath, ID_LISTBOX, ID_PATH, 0x4010);
  323.     return TRUE;
  324. }
  325.  
  326. BEGIN_MESSAGE_MAP(CAddFontDlg, CModalDialog)
  327.     ON_LBN_SELCHANGE(ID_LISTBOX, OnFileChange)
  328.     ON_LBN_DBLCLK(ID_LISTBOX, OnOK)
  329. END_MESSAGE_MAP()
  330.  
  331. void CAddFontDlg::OnFileChange()
  332. {
  333.     // If item is a directory name, append "*.fon".
  334.     //
  335.     if (DlgDirSelect(m_szPath, ID_LISTBOX))
  336.         strcat(m_szPath, "*.fon");
  337.     DlgDirList(m_szPath, ID_LISTBOX, ID_PATH, 0x4010);
  338. }
  339.  
  340. void CAddFontDlg::OnOK()
  341. {
  342.     // Get the filename from the edit control.
  343.     //
  344.     m_szPath[0] = '\0';
  345.     if (DlgDirSelect(m_szPath, ID_LISTBOX) ||
  346.         m_szPath[0] == '\0')
  347.     {
  348.         // It's still a directory, or something is wrong.
  349.         //
  350.         MessageBox("Not a file", "Add Font", MB_OK | MB_ICONQUESTION);
  351.         return;
  352.     }
  353.  
  354.     // Assume the file is worth trying.
  355.     //
  356.     EndDialog(IDOK);
  357. }
  358.  
  359. void CMainWindow::OnAddFont()
  360. {
  361.     // Spawn dialog to get the filename.
  362.     //
  363.     CAddFontDlg dlg;
  364.  
  365.     strcpy(dlg.m_szPath, "*.fon");
  366.     if (dlg.DoModal() != IDOK)
  367.         return;     // cancelled
  368.  
  369.     // Check to see if it is a new font name.
  370.     //
  371.     for (POSITION pos = fontList.GetHeadPosition(); pos != NULL; )
  372.         if (fontList.GetNext(pos) == dlg.m_szPath)
  373.         {
  374.             MessageBox("Font already exists", "Add Font",
  375.                        MB_OK | MB_ICONQUESTION);
  376.             return;
  377.         }
  378.  
  379.     // Tell Windows to add the font resource.
  380.     //
  381.     if (AddFontResource(dlg.m_szPath) == 0)
  382.     {
  383.         MessageBox("No font loaded", "Add Font", MB_OK | MB_ICONQUESTION);
  384.         return;
  385.     }
  386.  
  387.     // Let all applications know there is a new font resource.
  388.     //
  389.     ::SendMessage((HWND) 0xFFFF, WM_FONTCHANGE, NULL, (LONG) NULL);
  390.  
  391.     // Add it to our font list.
  392.     //
  393.     fontList.AddTail(dlg.m_szPath);         // save copy of string
  394. }
  395.  
  396. /////////////////////////////////////////////////////////////////////////////
  397. // Remove Font dialog
  398.  
  399. class CRmvFtDlg : public CModalDialog
  400. {
  401. public:
  402.     int m_iFont;  // font index (from global fontList)
  403.  
  404.     CRmvFtDlg() : CModalDialog("Remove")
  405.         { }
  406.  
  407.     CListBox&   FileList()
  408.         {
  409.             return *((CListBox*) GetDlgItem(ID_LISTBOX));
  410.         }
  411.  
  412.     BOOL OnInitDialog();
  413.     afx_msg void OnOK();
  414.  
  415.     DECLARE_MESSAGE_MAP()
  416. };
  417.  
  418. BOOL CRmvFtDlg::OnInitDialog()
  419. {
  420.     SetWindowText("Remove Font Resource");
  421.  
  422.     for (POSITION pos = fontList.GetHeadPosition(); pos != NULL; )
  423.         FileList().AddString(fontList.GetNext(pos));
  424.     return TRUE;
  425. }
  426.  
  427. BEGIN_MESSAGE_MAP(CRmvFtDlg, CModalDialog)
  428.     // A double-click on the listbox aliases for clicking the OK.
  429.     ON_LBN_DBLCLK(ID_LISTBOX, OnOK)
  430. END_MESSAGE_MAP()
  431.  
  432. void CRmvFtDlg::OnOK()
  433. {
  434.     // Get the filename from the edit control.
  435.     //
  436.     m_iFont = FileList().GetCurSel();
  437.  
  438.     EndDialog(IDOK);
  439. }
  440.  
  441. void CMainWindow::OnDeleteFont()
  442. {
  443.     if (fontList.IsEmpty())
  444.     {
  445.         MessageBox("No fonts to delete",
  446.             "Remove Font", MB_OK | MB_ICONQUESTION);
  447.         return;
  448.     }
  449.  
  450.     // Invoke dialog to let user select one font from list.
  451.     //
  452.     CRmvFtDlg   dlg;
  453.     if (dlg.DoModal() != IDOK || dlg.m_iFont == -1)
  454.         return;     // cancelled or no selection
  455.  
  456.     POSITION posFont = fontList.FindIndex(dlg.m_iFont);
  457.     ASSERT(posFont != NULL);
  458.  
  459.     // Remove it.  Tell all the apps.
  460.     //
  461.     RemoveFontResource(fontList.GetAt(posFont));
  462.     ::SendMessage((HWND) 0xFFFF, WM_FONTCHANGE, NULL, (LONG) NULL);
  463.  
  464.     // Remove that element in the list.
  465.     //
  466.     fontList.RemoveAt(posFont);
  467. }
  468.  
  469. /////////////////////////////////////////////////////////////////////////////
  470. // Cleanup on exit
  471.  
  472. void CMainWindow::OnDestroy()
  473. {
  474.     // Remove any fonts that were added.
  475.     //
  476.     while (!fontList.IsEmpty())
  477.         RemoveFontResource(fontList.RemoveHead());
  478.  
  479.     // Notify any other applications that the fonts have been deleted.
  480.     //
  481.     ::SendMessage((HWND) 0xFFFF, WM_FONTCHANGE, NULL, (LONG) NULL);
  482.  
  483.     // Terminate ourselves.
  484.     //
  485.     PostQuitMessage(0);
  486. }
  487.  
  488. /////////////////////////////////////////////////////////////////////////////
  489. // Routines that must enumerate all fonts.
  490. // (These keep the font names and sizes in global variables.)
  491.  
  492. int FAR PASCAL _export EnumFunc(LPLOGFONT lpLogFont, LPTEXTMETRIC, short, 
  493.         LPSTR lpData)
  494. {
  495.     switch (LOWORD((DWORD)lpData))
  496.     {
  497.         case 0:
  498.             if (FontIndex >= MAXFONT)
  499.                 return (0);
  500.             _fstrcpy(FontList[FontIndex], lpLogFont->lfFaceName);
  501.             CharSet[FontIndex] = lpLogFont->lfCharSet;
  502.             PitchAndFamily[FontIndex] = lpLogFont->lfPitchAndFamily;
  503.             return (++FontIndex);
  504.  
  505.         case 1:
  506.             if (SizeIndex >= MAXSIZE)
  507.                 return (0);
  508.             SizeList[SizeIndex] = lpLogFont->lfHeight;
  509.             return (++SizeIndex);
  510.     }
  511.     ASSERT(FALSE);
  512.     return 0;
  513. }
  514.  
  515. void CMainWindow::OnFontChange()
  516. {
  517.     FontIndex = 0;
  518.     SizeIndex = 0;
  519.     CClientDC dc(this);
  520.     ::EnumFonts(dc.m_hDC, NULL, (OLDFONTENUMPROC)EnumFunc, NULL);
  521. }
  522.  
  523. static void GetSizes(CWnd* wnd, int iCurrentFont)
  524. {
  525.     SizeIndex = 0;
  526.     CClientDC dc(wnd);
  527. #ifdef STRICT
  528.     ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (OLDFONTENUMPROC)EnumFunc, 1L);
  529. #else
  530.     ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (OLDFONTENUMPROC)EnumFunc, (LPSTR)1L);
  531. #endif
  532. }
  533.