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

1.1       root        1: // cfont.cpp : Defines the CFontDlg modal dialog for ShowFont.
                      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: /////////////////////////////////////////////////////////////////////////////
                     16: 
                     17: // CFontDlg:
                     18: // This class is completely declared and defined in this file.
                     19: // Unlike most classes, the declaration is not in a separate header file
                     20: // which is included in other sources.  Instead, a simple function
                     21: // creates an object and invokes the dialog.
                     22: //
                     23: // This technique may simplify the use of classes whose objects can be
                     24: // created and destroyed without much other interaction; modal dialogs like
                     25: // this are often candidates for this approach.
                     26: //
                     27: class CFontDlg : public CModalDialog
                     28: {
                     29: private:
                     30:        LOGFONT&  logFont;
                     31: public:
                     32:        CFontDlg(CWnd* pWnd, LOGFONT& rLogFont)
                     33:                : logFont(rLogFont), CModalDialog("CFont", pWnd)
                     34:                        { }
                     35: 
                     36: 
                     37:        // One way of getting access to members type-safely is to use
                     38:        // member functions like the below that do the appropriate call
                     39:        // to GetDlgItem() and cast the result to the correct C++ type.
                     40: 
                     41:        // simple edit item
                     42:        CEdit&      FaceEdit()
                     43:                                        { return *((CEdit*) GetDlgItem(ID_FACE)); } 
                     44: 
                     45:        // styles (checkboxes)
                     46:        CButton&    ItalicCheck()
                     47:                                        { return *((CButton*) GetDlgItem(ID_ITALIC)); } 
                     48:        CButton&    UnderlineCheck()
                     49:                                        { return *((CButton*) GetDlgItem(ID_UNDERLINE)); } 
                     50:        CButton&    StrikeOutCheck()
                     51:                                        { return *((CButton*) GetDlgItem(ID_STRIKEOUT)); } 
                     52: 
                     53: 
                     54:        // When dealing with edit controls used for parsed number values,
                     55:        // inline routines that call GetDlgItemInt/SetDlgItemInt are used.
                     56: 
                     57:        int         GetHeight()
                     58:                                        { return GetDlgItemInt(ID_HEIGHT); }
                     59:        void        SetHeight(int n)
                     60:                                        { SetDlgItemInt(ID_HEIGHT, n); }
                     61:        int         GetWidth()
                     62:                                        { return GetDlgItemInt(ID_WIDTH); }
                     63:        void        SetWidth(int n)
                     64:                                        { SetDlgItemInt(ID_WIDTH, n); }
                     65:        int         GetEscapement()
                     66:                                        { return GetDlgItemInt(ID_ESCAPEMENT); }
                     67:        void        SetEscapement(int n)
                     68:                                        { SetDlgItemInt(ID_ESCAPEMENT, n); }
                     69:        int         GetOrientation()
                     70:                                        { return GetDlgItemInt(ID_ORIENTATION); }
                     71:        void        SetOrientation(int n)
                     72:                                        { SetDlgItemInt(ID_ORIENTATION, n); }
                     73:        int         GetWeight()
                     74:                                        { return GetDlgItemInt(ID_WEIGHT); }
                     75:        void        SetWeight(int n)
                     76:                                        { SetDlgItemInt(ID_WEIGHT, n); }
                     77:        int         GetCharSetNum()
                     78:                                        { return GetDlgItemInt(ID_CHARSET); }
                     79:        void        SetCharSetNum(int n)
                     80:                                        { SetDlgItemInt(ID_CHARSET, n); }
                     81: 
                     82: 
                     83:        // When dealing with radio groups - it is easy to provide Get and Set
                     84:        // functions that treat the group as one value.
                     85:        //
                     86:        // In the following we convert the radio button IDs to zero based values.
                     87: 
                     88:        int     GetOutPrecision()
                     89:                                { return GetCheckedRadioButton(ID_OUT_STRING, ID_OUT_DEFAULT)
                     90:                                        - ID_OUT_STRING; }
                     91:        void    SetOutPrecision(int n)
                     92:                                { CheckRadioButton(ID_OUT_STRING, ID_OUT_DEFAULT,
                     93:                                        ID_OUT_STRING + n); }
                     94:        int     GetClipPrecision()
                     95:                                { return GetCheckedRadioButton(ID_CLIP_CHAR, ID_CLIP_DEFAULT)
                     96:                                        - ID_CLIP_CHAR; }
                     97:        void    SetClipPrecision(int n)
                     98:                                { CheckRadioButton(ID_CLIP_CHAR, ID_CLIP_DEFAULT,
                     99:                                        ID_CLIP_CHAR + n); }
                    100:        int     GetQuality()
                    101:                                { return GetCheckedRadioButton(ID_PROOF, ID_DEF_QUALITY)
                    102:                                        - ID_PROOF; }
                    103:        void    SetQuality(int n)
                    104:                                { CheckRadioButton(ID_PROOF, ID_DEF_QUALITY, ID_PROOF + n); }
                    105:        int     GetPitch()
                    106:                                { return GetCheckedRadioButton(ID_FIXED, ID_DEF_PITCH)
                    107:                                        - ID_FIXED; }
                    108:        void    SetPitch(int n)
                    109:                                { CheckRadioButton(ID_FIXED, ID_DEF_PITCH, ID_FIXED + n); }
                    110:        int     GetFamily()
                    111:                                { return GetCheckedRadioButton(ID_ROMAN, ID_DEF_FAMILY)
                    112:                                        - ID_ROMAN; }
                    113:        void    SetFamily(int n)
                    114:                                { CheckRadioButton(ID_ROMAN, ID_DEF_FAMILY, ID_ROMAN + n); }
                    115:        int     GetCharSetOption()
                    116:                                { return GetCheckedRadioButton(ID_ANSI, ID_OEM) - ID_ANSI; }
                    117:        void    SetCharSetOption(int n)
                    118:                                { CheckRadioButton(ID_ANSI, ID_OEM, ID_ANSI + n); }
                    119: 
                    120:        afx_msg void OnLight()
                    121:        {
                    122:                SetWeight(FW_LIGHT);
                    123:        }
                    124: 
                    125:        afx_msg void OnNormal()
                    126:        {
                    127:                SetWeight(FW_NORMAL);
                    128:        }
                    129: 
                    130:        afx_msg void OnBold()
                    131:        {
                    132:                SetWeight(FW_BOLD);
                    133:        }
                    134: 
                    135:        afx_msg void OnChangeWeight()
                    136:        {
                    137:                // set a specific weight (uncheck all)
                    138:                CheckRadioButton(ID_LIGHT, ID_BOLD, 0);
                    139:        }
                    140: 
                    141:        afx_msg void OnAnsi()
                    142:        {
                    143:                SetCharSetNum(ANSI_CHARSET);
                    144:        }
                    145: 
                    146:        afx_msg void OnOEM()
                    147:        {
                    148:                SetCharSetNum(OEM_CHARSET);
                    149:        }
                    150: 
                    151:        afx_msg void OnCharSet()
                    152:        {
                    153:                // specific character set size - assume neither ANSI not OEM
                    154:                CheckRadioButton(ID_ANSI, ID_OEM, 0);
                    155:        }
                    156: 
                    157:        BOOL    OnInitDialog();
                    158:        virtual void OnOK();
                    159: 
                    160:        DECLARE_MESSAGE_MAP()
                    161: };
                    162: 
                    163: // CFontDlg message map:
                    164: // This map ties each child control's notification messages (clicks) to
                    165: // the appropriate member functions.
                    166: //
                    167: BEGIN_MESSAGE_MAP(CFontDlg, CModalDialog)
                    168:        ON_COMMAND(ID_LIGHT, OnLight)
                    169:        ON_COMMAND(ID_NORMAL, OnNormal)
                    170:        ON_COMMAND(ID_BOLD, OnBold)
                    171:        ON_COMMAND(ID_WEIGHT, OnChangeWeight)
                    172:        ON_COMMAND(ID_ANSI, OnAnsi)
                    173:        ON_COMMAND(ID_OEM, OnOEM)
                    174:        ON_COMMAND(ID_CHARSET, OnCharSet)
                    175:        // Note that OnOK is already inherited virtually.
                    176: END_MESSAGE_MAP()
                    177: 
                    178: /////////////////////////////////////////////////////////////////////////////
                    179: // RadioGroup mapping tables
                    180: 
                    181: // In the dialog, radio groups are represented with 0 based numbers.
                    182: // Outside of the dialog, we want those numbers to represent specific
                    183: // values to set or get from a LOGFONT.  The 'MatchValue' function takes
                    184: // one of these values, and turns it into a zero based index.
                    185: // The 'GetValue' function takes the zero based index and returns
                    186: // the appropriate value.
                    187: 
                    188: static int MatchValue(int value, int * pValues)
                    189:        // return the index of the match, or -1
                    190: {
                    191:        for (int index = 0; *pValues != -1; index++)
                    192:        {
                    193:                if (value == *pValues++)
                    194:                        return index;
                    195:        }
                    196:        return -1;
                    197: }
                    198: 
                    199: static int GetValue(int index, int * pValues)
                    200: {
                    201:        // index into array with special case for negative values
                    202:        if (index < 0)
                    203:                return 0;       // hopefully a sensible default
                    204:        else
                    205:                return pValues[index];
                    206: }
                    207: 
                    208: // The following tables must be in the same order as the radio buttons
                    209: // defined in the resource file.
                    210: 
                    211: static int rgOutPrecision[] =
                    212: {
                    213:        OUT_STRING_PRECIS,
                    214:        OUT_CHARACTER_PRECIS,
                    215:        OUT_STROKE_PRECIS,
                    216:        OUT_DEFAULT_PRECIS,
                    217:        -1 /* end */
                    218: };
                    219: 
                    220: static int rgClipPrecision[] =
                    221: {
                    222:        CLIP_CHARACTER_PRECIS,
                    223:        CLIP_STROKE_PRECIS,
                    224:        CLIP_DEFAULT_PRECIS,
                    225:        -1 /* end */
                    226: };
                    227: 
                    228: static int rgQuality[] =
                    229: {
                    230:        PROOF_QUALITY,
                    231:        DRAFT_QUALITY,
                    232:        DEFAULT_QUALITY,
                    233:        -1 /* end */
                    234: };
                    235: 
                    236: static int rgPitch[] =
                    237: {
                    238:        FIXED_PITCH,
                    239:        VARIABLE_PITCH,
                    240:        DEFAULT_PITCH,
                    241:        -1 /* end */
                    242: };
                    243: 
                    244: static int rgFamily[] =
                    245: {
                    246:        FF_ROMAN,
                    247:        FF_SWISS,
                    248:        FF_MODERN,
                    249:        FF_SCRIPT,
                    250:        FF_DECORATIVE,
                    251:        FF_DONTCARE,
                    252:        -1 /* end */
                    253: };
                    254: 
                    255: static int rgCharSet[] =
                    256: {
                    257:        ANSI_CHARSET,
                    258:        OEM_CHARSET,
                    259:        -1 /* end */
                    260: };
                    261: 
                    262: /////////////////////////////////////////////////////////////////////////////
                    263: // OnInitDialog:
                    264: // This is called when the dialog is invoked.  We set the state of all of
                    265: // the child controls to appropriate states from our logFont information.
                    266: //
                    267: BOOL CFontDlg::OnInitDialog()
                    268: {
                    269:        SetHeight(logFont.lfHeight);
                    270:        SetWidth(logFont.lfWidth);
                    271:        SetEscapement(logFont.lfEscapement);
                    272:        SetOrientation(logFont.lfOrientation);
                    273:        FaceEdit().SetWindowText((LPSTR)logFont.lfFaceName);
                    274:        SetCharSetNum(logFont.lfCharSet);
                    275: 
                    276:        ItalicCheck().SetCheck(logFont.lfItalic);
                    277:        StrikeOutCheck().SetCheck(logFont.lfStrikeOut);
                    278:        UnderlineCheck().SetCheck(logFont.lfUnderline);
                    279: 
                    280:        SetOutPrecision(MatchValue(logFont.lfOutPrecision, rgOutPrecision));
                    281:        SetClipPrecision(MatchValue(logFont.lfClipPrecision, rgClipPrecision));
                    282:        SetQuality(MatchValue(logFont.lfQuality, rgQuality));
                    283:        SetCharSetOption(MatchValue(logFont.lfCharSet, rgCharSet));
                    284: 
                    285:        BYTE pitch = logFont.lfPitchAndFamily & 3;
                    286:        BYTE family = logFont.lfPitchAndFamily & 0xf0;
                    287:        SetPitch(MatchValue(pitch, rgPitch));
                    288:        SetFamily(MatchValue(family, rgFamily));
                    289: 
                    290:        // If the weight matches one of the special values, check that radio
                    291:        // button.
                    292:        //
                    293:        SetWeight(logFont.lfWeight);
                    294:        switch (logFont.lfWeight)
                    295:        {
                    296:        case FW_LIGHT:
                    297:                CheckRadioButton(ID_LIGHT, ID_BOLD, ID_LIGHT);
                    298:                break;
                    299: 
                    300:        case FW_NORMAL:
                    301:                CheckRadioButton(ID_LIGHT, ID_BOLD, ID_NORMAL);
                    302:                break;
                    303: 
                    304:        case FW_BOLD:
                    305:                CheckRadioButton(ID_LIGHT, ID_BOLD, ID_BOLD);
                    306:                break;
                    307:        }
                    308: 
                    309:        return TRUE;
                    310: }
                    311: 
                    312: /////////////////////////////////////////////////////////////////////////////
                    313: // OnOK:
                    314: // This is automatically called when the OK button is pushed.  We update
                    315: // the logFont information and end the dialog with the "successful" return
                    316: // of IDOK.
                    317: //
                    318: void CFontDlg::OnOK()
                    319: {
                    320:        logFont.lfHeight = GetHeight();
                    321:        logFont.lfWidth = GetWidth();
                    322:        logFont.lfEscapement = GetEscapement();
                    323:        logFont.lfOrientation = GetOrientation();
                    324:        FaceEdit().GetWindowText((LPSTR)logFont.lfFaceName, 32);
                    325:        logFont.lfWeight = GetWeight();
                    326:        logFont.lfCharSet = GetCharSetNum();
                    327: 
                    328:        logFont.lfItalic = ItalicCheck().GetCheck();
                    329:        logFont.lfStrikeOut = StrikeOutCheck().GetCheck();
                    330:        logFont.lfUnderline = UnderlineCheck().GetCheck();
                    331: 
                    332:        logFont.lfOutPrecision = GetValue(GetOutPrecision(), rgOutPrecision);
                    333:        logFont.lfClipPrecision = GetValue(GetClipPrecision(), rgClipPrecision);
                    334:        logFont.lfQuality = GetValue(GetQuality(), rgQuality);
                    335:        // lfCharSet is not set by radio group (get from edit text)
                    336: 
                    337:        // pitch and family are combined
                    338:        BYTE pitch = GetValue(GetPitch(), rgPitch);
                    339:        BYTE family = GetValue(GetFamily(), rgFamily);
                    340:        logFont.lfPitchAndFamily = pitch | family;  // put back together
                    341: 
                    342:        EndDialog(IDOK);
                    343: }
                    344: 
                    345: /////////////////////////////////////////////////////////////////////////////
                    346: // DoCreateFontDlg:
                    347: // This function is the only interface required to use this class.  Calling
                    348: // it will create and invoke a CFontDlg object, and will not return until
                    349: // the modal dialog has been closed.  Include showfont.h for the prototype.
                    350: //
                    351: int DoCreateFontDlg(CWnd* pWnd, LOGFONT& rLogFont)
                    352: {
                    353:        CFontDlg dlg(pWnd, rLogFont);
                    354:        return dlg.DoModal();
                    355: }
                    356: 

unix.superglobalmegacorp.com

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