|
|
1.1 root 1: // mainwnd.cpp : Defines the behavior of the main window 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: static UINT idPaint = 0;
18: static CFont oemFont;
19: static CFont ansiFixedFont;
20: static CFont ansiVarFont;
21: static CFont deviceFont;
22:
23: // used for mutual exclusion of menus
24: static UINT idPrevVAlign = IDM_ALIGNBASE;
25: static UINT idPrevHAlign = IDM_ALIGNLEFT;
26: static UINT idPrevFont = IDM_SYSTEM;
27:
28: /////////////////////////////////////////////////////////////////////////////
29: // Initialization and cleanup
30:
31: CMainWindow::CMainWindow(const char* szTitle)
32: {
33: VERIFY(Create(NULL, szTitle,
34: WS_OVERLAPPEDWINDOW, rectDefault, NULL, "ShowFont"));
35: }
36:
37: int CMainWindow::OnCreate(LPCREATESTRUCT)
38: {
39: OnFontChange();
40: myFont = new CFont;
41: myFont->CreateFont(
42: 10, /* height */
43: 10, /* width */
44: 0, /* escapement */
45: 0, /* orientation */
46: FW_NORMAL, /* weight */
47: FALSE, /* italic */
48: FALSE, /* underline */
49: FALSE, /* strikeout */
50: OEM_CHARSET, /* charset */
51: OUT_DEFAULT_PRECIS, /* out precision */
52: CLIP_DEFAULT_PRECIS, /* clip precision */
53: DEFAULT_QUALITY, /* quality */
54: FIXED_PITCH | FF_MODERN, /* pitch and family */
55: "Courier"); /* typeface */
56:
57: VERIFY(oemFont.CreateStockObject(OEM_FIXED_FONT));
58: VERIFY(ansiFixedFont.CreateStockObject(ANSI_FIXED_FONT));
59: VERIFY(ansiVarFont.CreateStockObject(ANSI_VAR_FONT));
60: VERIFY(systemFont.CreateStockObject(SYSTEM_FONT));
61: VERIFY(deviceFont.CreateStockObject(DEVICE_DEFAULT_FONT));
62:
63: pTheFont = &systemFont;
64: LOGFONT logFont;
65: pTheFont->GetObject(sizeof(LOGFONT), &logFont);
66: strcpy(szWindowTitle, szAppName);
67: strcat(szWindowTitle, "SYSTEM");
68: SetWindowText(szWindowTitle);
69:
70: for (int i=0; i<64; i++)
71: {
72: outputText[0][i] = i;
73: outputText[1][i] = i+64;
74: outputText[2][i] = i+128;
75: outputText[3][i] = i+192;
76: }
77: return 0;
78: }
79:
80: void CMainWindow::SetFaceName()
81: {
82: char buf[80];
83:
84: CClientDC dc(this);
85: dc.SelectObject(pTheFont);
86: strcpy(szWindowTitle, szAppName);
87: dc.GetTextFace(80, buf);
88: strcat(szWindowTitle, buf);
89: SetWindowText(szWindowTitle);
90: }
91:
92: void CMainWindow::OnExit()
93: {
94: DestroyWindow();
95: }
96:
97: /////////////////////////////////////////////////////////////////////////////
98: // Main message handling
99:
100: void CMainWindow::OnPaint()
101: {
102: CPaintDC dc(this);
103: InitDC(dc); // Prepare the DC in a common way.
104:
105: // Character set is drawn as a background.
106: //
107: if (idPaint == IDM_SHOWCHARSET)
108: ShowCharacterSet(dc, pTheFont);
109: }
110:
111: void CMainWindow::OnLButtonUp(UINT, CPoint pt)
112: {
113: // Draw the string where the mouse was clicked.
114: //
115: ptCurrent = pt;
116: ShowString();
117: }
118:
119: void CMainWindow::OnShowCharSet()
120: {
121: Invalidate(TRUE);
122: idPaint = GetCurrentMessage()->wParam;
123: }
124:
125: void CMainWindow::OnClear()
126: {
127: // Clear the window.
128: //
129: Invalidate(TRUE);
130: idPaint = 0;
131: }
132:
133: /////////////////////////////////////////////////////////////////////////////
134: // Menu commands for selecting from standard fonts.
135:
136: void CMainWindow::SetFontFromMenu(CFont& newFont)
137: {
138: // call from inside message callback
139: UINT id = GetCurrentMessage()->wParam;
140:
141: pTheFont = &newFont;
142: SetFaceName(); /* Sets window title for us. */
143: GetMenu()->CheckMenuItem(idPrevFont, MF_UNCHECKED);
144: GetMenu()->CheckMenuItem(id, MF_CHECKED);
145: idPrevFont = id;
146: }
147:
148: void CMainWindow::OnOemFont()
149: {
150: SetFontFromMenu(oemFont);
151: }
152:
153: void CMainWindow::OnAnsiFixedFont()
154: {
155: SetFontFromMenu(ansiFixedFont);
156: }
157:
158: void CMainWindow::OnAnsiVarFont()
159: {
160: SetFontFromMenu(ansiVarFont);
161: }
162:
163: void CMainWindow::OnSystemFont()
164: {
165: SetFontFromMenu(systemFont);
166: }
167:
168: void CMainWindow::OnDeviceFont()
169: {
170: SetFontFromMenu(deviceFont);
171: }
172:
173: /////////////////////////////////////////////////////////////////////////////
174:
175: // This class handles the menu commands for selecting drawing colors.
176: //
177: // Note we completely define this modal dialog here, then use it in the
178: // CMainWindow member functions, OnSetTextColor and OnSetBackgroundColor.
179:
180: class CColorDlg : public CModalDialog
181: {
182: public:
183: CColorDlg() : CModalDialog("Colors")
184: { }
185:
186: // Attributes
187: DWORD m_rgbColor; // set this before invoking, and retrieve it afterwards
188:
189: UINT GetRed()
190: { return GetDlgItemInt(ID_RED, NULL, FALSE); }
191: void SetRed(UINT nColor)
192: { SetDlgItemInt(ID_RED, nColor, FALSE); }
193:
194: UINT GetGreen()
195: { return GetDlgItemInt(ID_GREEN, NULL, FALSE); }
196: void SetGreen(UINT nColor)
197: { SetDlgItemInt(ID_GREEN, nColor, FALSE); }
198:
199: UINT GetBlue()
200: { return GetDlgItemInt(ID_BLUE, NULL, FALSE); }
201: void SetBlue(UINT nColor)
202: { SetDlgItemInt(ID_BLUE, nColor, FALSE); }
203:
204: BOOL OnInitDialog()
205: {
206: SetRed(GetRValue(m_rgbColor));
207: SetGreen(GetGValue(m_rgbColor));
208: SetBlue(GetBValue(m_rgbColor));
209: return TRUE;
210: }
211:
212: void OnOK()
213: {
214: m_rgbColor = RGB(GetRed(), GetGreen(), GetBlue());
215: EndDialog(IDOK);
216: }
217:
218: // Note: OnCancel predefined to end dialog and return IDCANCEL.
219: };
220:
221: void CMainWindow::OnSetTextColor()
222: {
223: CColorDlg dlg;
224: dlg.m_rgbColor = rgbTextColor;
225: if (dlg.DoModal() == IDOK)
226: rgbTextColor = dlg.m_rgbColor;
227: }
228:
229: void CMainWindow::OnSetBackgroundColor()
230: {
231: CColorDlg dlg;
232: dlg.m_rgbColor = rgbBkColor;
233: if (dlg.DoModal() == IDOK)
234: rgbBkColor = dlg.m_rgbColor;
235: }
236:
237: /////////////////////////////////////////////////////////////////////////////
238:
239: // These handle the menu commands for selecting drawing modes.
240:
241: void CMainWindow::OnSetOpaque()
242: {
243: nBkMode = OPAQUE;
244: GetMenu()->CheckMenuItem(IDM_TRANSPARENT, MF_UNCHECKED);
245: GetMenu()->CheckMenuItem(IDM_OPAQUE, MF_CHECKED);
246: }
247:
248: void CMainWindow::OnSetTransparent()
249: {
250: nBkMode = TRANSPARENT;
251: GetMenu()->CheckMenuItem(IDM_OPAQUE, MF_UNCHECKED);
252: GetMenu()->CheckMenuItem(IDM_TRANSPARENT, MF_CHECKED);
253: }
254:
255: /////////////////////////////////////////////////////////////////////////////
256:
257: // These routines handle the menu commands for selecting drawing alignment.
258:
259: void CMainWindow::SetAlignFromMenu(short newAlign)
260: {
261: // This routine assumes that a function listed in a message map is
262: // calling us, so that "GetCurrentMessage" works.
263: //
264: UINT id = GetCurrentMessage()->wParam;
265:
266: nAlignLCR = newAlign;
267: GetMenu()->CheckMenuItem(idPrevHAlign, MF_UNCHECKED);
268: GetMenu()->CheckMenuItem(id, MF_CHECKED);
269: idPrevHAlign = id;
270: }
271:
272: void CMainWindow::OnSetAlignLeft()
273: {
274: SetAlignFromMenu(TA_LEFT);
275: }
276:
277: void CMainWindow::OnSetAlignCenter()
278: {
279: SetAlignFromMenu(TA_CENTER);
280: }
281:
282: void CMainWindow::OnSetAlignRight()
283: {
284: SetAlignFromMenu(TA_RIGHT);
285: }
286:
287: void CMainWindow::SetVAlignFromMenu(short newAlign)
288: {
289: // This routine assumes that a function listed in a message map is
290: // calling us, so that "GetCurrentMessage" works.
291: //
292: UINT id = GetCurrentMessage()->wParam;
293:
294: nAlignTBB = newAlign;
295: GetMenu()->CheckMenuItem(idPrevVAlign, MF_UNCHECKED);
296: GetMenu()->CheckMenuItem(id, MF_CHECKED);
297: idPrevVAlign = id;
298: }
299:
300: void CMainWindow::OnSetAlignTop()
301: {
302: SetVAlignFromMenu(TA_TOP);
303: }
304:
305: void CMainWindow::OnSetAlignBase()
306: {
307: SetVAlignFromMenu(TA_BASELINE);
308: }
309:
310: void CMainWindow::OnSetAlignBottom()
311: {
312: SetVAlignFromMenu(TA_BOTTOM);
313: }
314:
315: /////////////////////////////////////////////////////////////////////////////
316:
317: // OnCreateFont:
318: // Handles the menu command for creating a new font.
319: //
320: void CMainWindow::OnCreateFont()
321: {
322: LOGFONT logFont;
323:
324: myFont->GetObject(sizeof(LOGFONT), &logFont);
325: if (DoCreateFontDlg(this, logFont))
326: {
327: delete myFont;
328: pTheFont = myFont = new CFont;
329: pTheFont->CreateFontIndirect(&logFont);
330: SetFaceName();
331: InvalidateRect(NULL, TRUE);
332: }
333: }
334:
335: /////////////////////////////////////////////////////////////////////////////
336:
337: // CMainWindow message map:
338: //
339: BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
340:
341: // Window messages
342: ON_WM_CREATE()
343: ON_WM_PAINT()
344: ON_WM_LBUTTONUP()
345: ON_WM_DESTROY()
346: ON_WM_FONTCHANGE()
347:
348: // File menu
349: ON_COMMAND(IDM_ADDFONT, OnAddFont)
350: ON_COMMAND(IDM_DELFONT, OnDeleteFont)
351: ON_COMMAND(IDM_EXIT, OnExit)
352: ON_COMMAND(IDM_ABOUT, OnAbout)
353:
354: // Show menu
355: ON_COMMAND(IDM_SHOWSTRING, ShowString)
356: ON_COMMAND(IDM_SHOWCHARSET, OnShowCharSet)
357: ON_COMMAND(IDM_SHOWLOGFONT, OnShowLogFont)
358: ON_COMMAND(IDM_SHOWTEXTMETRICS, OnShowTextMetric)
359: ON_COMMAND(IDM_CLEAR, OnClear)
360:
361: // Font menu
362: ON_COMMAND(IDM_SYSTEM, OnSystemFont)
363: ON_COMMAND(IDM_ANSIFIXED, OnAnsiFixedFont)
364: ON_COMMAND(IDM_ANSIVAR, OnAnsiVarFont)
365: ON_COMMAND(IDM_OEM, OnOemFont)
366: ON_COMMAND(IDM_DEVICEDEF, OnDeviceFont)
367: ON_COMMAND(IDM_SELECTFONT, OnSelectFont)
368: ON_COMMAND(IDM_CFONT, OnCreateFont)
369:
370: // Options menu
371: ON_COMMAND(IDM_TEXTCOLOR, OnSetTextColor)
372: ON_COMMAND(IDM_BACKGROUNDCOLOR, OnSetBackgroundColor)
373: ON_COMMAND(IDM_OPAQUE, OnSetOpaque)
374: ON_COMMAND(IDM_TRANSPARENT, OnSetTransparent)
375: ON_COMMAND(IDM_ALIGNLEFT, OnSetAlignLeft)
376: ON_COMMAND(IDM_ALIGNCENTER, OnSetAlignCenter)
377: ON_COMMAND(IDM_ALIGNRIGHT, OnSetAlignRight)
378: ON_COMMAND(IDM_ALIGNTOP, OnSetAlignTop)
379: ON_COMMAND(IDM_ALIGNBASE, OnSetAlignBase)
380: ON_COMMAND(IDM_ALIGNBOTTOM, OnSetAlignBottom)
381: END_MESSAGE_MAP()
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.