|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.