Annotation of mstools/mfc/samples/showfont/dialogs.cpp, revision 1.1.1.1

1.1       root        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((LPSTR)(LPCSTR)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((LPSTR)(LPCSTR)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], (PSTR)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: #ifdef _NTWIN
                    521:        ::EnumFonts(dc.m_hDC, NULL, (FONTENUMPROC)EnumFunc, NULL);
                    522: #else
                    523:        ::EnumFonts(dc.m_hDC, NULL, (OLDFONTENUMPROC)EnumFunc, NULL);
                    524: #endif
                    525: }
                    526: 
                    527: static void GetSizes(CWnd* wnd, int iCurrentFont)
                    528: {
                    529:        SizeIndex = 0;
                    530:        CClientDC dc(wnd);
                    531: 
                    532: #ifdef _NTWIN
                    533: #ifdef STRICT
                    534:        ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (FONTENUMPROC)EnumFunc, (LPARAM)1L);
                    535: #else
                    536:        ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (FONTENUMPROC)EnumFunc, (LPARAM)1L);
                    537: #endif // STRICT
                    538: #else
                    539: #ifdef STRICT
                    540:        ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (OLDFONTENUMPROC)EnumFunc, 1L);
                    541: #else
                    542:        ::EnumFonts(dc.m_hDC, FontList[iCurrentFont], (OLDFONTENUMPROC)EnumFunc, (LPSTR)1L);
                    543: #endif // STRICT
                    544: #endif // NTWIN
                    545: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.