-rw-r--r-- | FontsPage.cpp | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/FontsPage.cpp b/FontsPage.cpp new file mode 100644 index 0000000..772f962 --- a/dev/null +++ b/FontsPage.cpp | |||
@@ -0,0 +1,333 @@ | |||
1 | // FontsPage.cpp : implementation file | ||
2 | // | ||
3 | |||
4 | #include "stdafx.h" | ||
5 | #include "T42.h" | ||
6 | #include "FontsPage.h" | ||
7 | |||
8 | #ifdef _DEBUG | ||
9 | #define new DEBUG_NEW | ||
10 | #undef THIS_FILE | ||
11 | static char THIS_FILE[] = __FILE__; | ||
12 | #endif | ||
13 | |||
14 | ///////////////////////////////////////////////////////////////////////////// | ||
15 | // CFontsPage property page | ||
16 | |||
17 | IMPLEMENT_DYNCREATE(CFontsPage, CPropertyPage) | ||
18 | |||
19 | CFontsPage::CFontsPage() : CPropertyPage(CFontsPage::IDD) | ||
20 | { | ||
21 | //{{AFX_DATA_INIT(CFontsPage) | ||
22 | //}}AFX_DATA_INIT | ||
23 | CRichEditCtrl tmp; | ||
24 | tmp.Create(WS_CHILD,CRect(0,0,0,0),AfxGetApp()->m_pMainWnd,0); | ||
25 | memset(&m_fmtChar,0,sizeof(m_fmtChar)); | ||
26 | m_fmtLast=NULL; | ||
27 | } | ||
28 | |||
29 | CFontsPage::~CFontsPage() | ||
30 | { | ||
31 | } | ||
32 | |||
33 | void CFontsPage::DoDataExchange(CDataExchange* pDX) | ||
34 | { | ||
35 | CPropertyPage::DoDataExchange(pDX); | ||
36 | //{{AFX_DATA_MAP(CFontsPage) | ||
37 | DDX_Control(pDX, IDC_TIP, m_TipCtl); | ||
38 | DDX_Control(pDX, IDC_FORECOLOR, m_fgColorCtl); | ||
39 | DDX_Control(pDX, IDC_BACKCOLOR, m_bgColorCtl); | ||
40 | DDX_Control(pDX, IDC_CHARSET, m_CharsetCtl); | ||
41 | DDX_Control(pDX, IDC_UNDERLINE, m_UnderlineCtl); | ||
42 | DDX_Control(pDX, IDC_STRIKEOUT, m_StrikeoutCtl); | ||
43 | DDX_Control(pDX, IDC_ITALIC, m_ItalicCtl); | ||
44 | DDX_Control(pDX, IDC_BOLD, m_BoldCtl); | ||
45 | DDX_Control(pDX, IDC_FONTSIZE, m_SizeCtl); | ||
46 | DDX_Control(pDX, IDC_FORMATNAME, m_FormatsCtl); | ||
47 | DDX_Control(pDX, IDC_FACES, m_FacesCtl); | ||
48 | DDX_Control(pDX, IDC_SAMPLE, m_SampleCtl); | ||
49 | //}}AFX_DATA_MAP | ||
50 | } | ||
51 | |||
52 | |||
53 | BEGIN_MESSAGE_MAP(CFontsPage, CPropertyPage) | ||
54 | //{{AFX_MSG_MAP(CFontsPage) | ||
55 | ON_CBN_SELENDOK(IDC_FACES, OnSelendokFaces) | ||
56 | ON_BN_CLICKED(IDC_BOLD, OnBold) | ||
57 | ON_CBN_SELENDOK(IDC_FONTSIZE, OnSelendokFontsize) | ||
58 | ON_CBN_EDITCHANGE(IDC_FONTSIZE, OnEditchangeFontsize) | ||
59 | ON_BN_CLICKED(IDC_ITALIC, OnItalic) | ||
60 | ON_BN_CLICKED(IDC_STRIKEOUT, OnStrikeout) | ||
61 | ON_BN_CLICKED(IDC_UNDERLINE, OnUnderline) | ||
62 | ON_CBN_SELENDOK(IDC_CHARSET, OnSelendokCharset) | ||
63 | ON_BN_CLICKED(IDC_BACKCOLOR, OnBackcolor) | ||
64 | ON_BN_CLICKED(IDC_FORECOLOR, OnForecolor) | ||
65 | ON_LBN_SELCHANGE(IDC_FORMATNAME, OnSelchangeFormatname) | ||
66 | //}}AFX_MSG_MAP | ||
67 | END_MESSAGE_MAP() | ||
68 | |||
69 | ///////////////////////////////////////////////////////////////////////////// | ||
70 | // CFontsPage message handlers | ||
71 | |||
72 | BOOL CFontsPage::OnInitDialog() | ||
73 | { | ||
74 | CPropertyPage::OnInitDialog(); | ||
75 | |||
76 | m_SampleCtl.GetDefaultCharFormat(m_fmtDefChar); | ||
77 | |||
78 | // Fill in faces combo | ||
79 | m_FacesCtl.ResetContent(); | ||
80 | CClientDC dc(NULL); | ||
81 | LOGFONT lf; | ||
82 | memset(&lf,0,sizeof(lf)); | ||
83 | lf.lfCharSet = DEFAULT_CHARSET; | ||
84 | EnumFontFamiliesEx(dc.m_hDC,&lf,(FONTENUMPROC)FillInFaces,(LPARAM)&m_FacesCtl,0); | ||
85 | |||
86 | // Fill in formats list | ||
87 | FillInFormats(); | ||
88 | |||
89 | return TRUE; // return TRUE unless you set the focus to a control | ||
90 | // EXCEPTION: OCX Property Pages should return FALSE | ||
91 | } | ||
92 | |||
93 | int CALLBACK CFontsPage::FillInFaces(const ENUMLOGFONTEX* lpelfe,const TEXTMETRIC* lpntme,const int FontType,const LPARAM lParam) | ||
94 | { | ||
95 | //if(FontType!=TRUETYPE_FONTTYPE) | ||
96 | // return 1; | ||
97 | CComboBox* cb = (CComboBox*)lParam; | ||
98 | ASSERT(cb); | ||
99 | if(cb->FindString(0,lpelfe->elfLogFont.lfFaceName)>=0) | ||
100 | return 1; | ||
101 | cb->AddString(lpelfe->elfLogFont.lfFaceName); | ||
102 | return 1; | ||
103 | } | ||
104 | |||
105 | |||
106 | void CFontsPage::UpdateFormat(BOOL bSave) | ||
107 | { | ||
108 | if(bSave){ | ||
109 | CString tmp; | ||
110 | m_FacesCtl.GetWindowText(tmp); | ||
111 | strcpy(m_fmtChar.szFaceName,tmp); m_fmtChar.dwMask|=CFM_FACE; | ||
112 | m_SizeCtl.GetWindowText(tmp); | ||
113 | m_fmtChar.yHeight = atoi(tmp)?(atoi(tmp)*REFS2PTS):m_fmtChar.yHeight; | ||
114 | m_fmtChar.dwMask|=CFM_SIZE; | ||
115 | if(m_BoldCtl.GetCheck()) | ||
116 | m_fmtChar.dwEffects|=CFE_BOLD; | ||
117 | else | ||
118 | m_fmtChar.dwEffects&=~CFE_BOLD; | ||
119 | m_fmtChar.dwMask|=CFM_BOLD; | ||
120 | if(m_ItalicCtl.GetCheck()) | ||
121 | m_fmtChar.dwEffects|=CFE_ITALIC; | ||
122 | else | ||
123 | m_fmtChar.dwEffects&=~CFE_ITALIC; | ||
124 | m_fmtChar.dwMask|=CFM_ITALIC; | ||
125 | if(m_StrikeoutCtl.GetCheck()) | ||
126 | m_fmtChar.dwEffects|=CFE_STRIKEOUT; | ||
127 | else | ||
128 | m_fmtChar.dwEffects&=~CFE_STRIKEOUT; | ||
129 | m_fmtChar.dwMask|=CFM_STRIKEOUT; | ||
130 | if(m_UnderlineCtl.GetCheck()) | ||
131 | m_fmtChar.dwEffects|=CFE_UNDERLINE; | ||
132 | else | ||
133 | m_fmtChar.dwEffects&=~CFE_UNDERLINE; | ||
134 | m_fmtChar.dwMask|=CFM_UNDERLINE; | ||
135 | if(m_CharsetCtl.IsWindowEnabled()) | ||
136 | m_fmtChar.bCharSet=m_CharsetCtl.GetItemData(m_CharsetCtl.GetCurSel()); | ||
137 | else | ||
138 | m_fmtChar.bCharSet=DEFAULT_CHARSET; | ||
139 | m_fmtChar.crTextColor = m_fgColorCtl.m_Color; | ||
140 | m_fmtChar.dwMask|=CFM_COLOR; | ||
141 | m_fmtChar.dwEffects&=~CFE_AUTOCOLOR; | ||
142 | UpdateSample(); | ||
143 | }else{ | ||
144 | if(m_fmtChar.cbSize!=sizeof(m_fmtChar)) | ||
145 | memmove(&m_fmtChar,&m_fmtDefChar,sizeof(m_fmtChar)); | ||
146 | if(m_fmtChar.dwMask&CFM_FACE) | ||
147 | m_FacesCtl.SelectString(0,m_fmtChar.szFaceName); | ||
148 | CString tmp; | ||
149 | if(m_fmtChar.dwMask&CFM_SIZE){ | ||
150 | tmp.Format("%d",m_fmtChar.yHeight/REFS2PTS); | ||
151 | m_SizeCtl.SetWindowText(tmp); | ||
152 | } | ||
153 | if(m_fmtChar.dwMask&CFM_BOLD) | ||
154 | m_BoldCtl.SetCheck((m_fmtChar.dwEffects&CFE_BOLD)?1:0); | ||
155 | if(m_fmtChar.dwMask&CFM_ITALIC) | ||
156 | m_ItalicCtl.SetCheck((m_fmtChar.dwEffects&CFE_ITALIC)?1:0); | ||
157 | if(m_fmtChar.dwMask&CFM_STRIKEOUT) | ||
158 | m_StrikeoutCtl.SetCheck((m_fmtChar.dwEffects&CFE_STRIKEOUT)?1:0); | ||
159 | if(m_fmtChar.dwMask&CFM_UNDERLINE) | ||
160 | m_UnderlineCtl.SetCheck((m_fmtChar.dwEffects&CFE_UNDERLINE)?1:0); | ||
161 | m_fgColorCtl.m_Color = (m_fmtChar.dwMask&CFM_COLOR)?m_fmtChar.crTextColor:0; | ||
162 | m_fgColorCtl.Invalidate(); | ||
163 | FillCharsets(); | ||
164 | } | ||
165 | } | ||
166 | |||
167 | void CFontsPage::UpdateSample() | ||
168 | { | ||
169 | m_SampleCtl.SetReadOnly(TRUE); | ||
170 | m_SampleCtl.SetTargetDevice(NULL,0); | ||
171 | m_SampleCtl.SetSel(0,-1); | ||
172 | m_SampleCtl.ReplaceSel( | ||
173 | (m_fmtChar.dwMask&CFM_FACE) | ||
174 | ? ( | ||
175 | (*m_fmtChar.szFaceName) | ||
176 | ? m_fmtChar.szFaceName | ||
177 | : "Sample" | ||
178 | ) | ||
179 | : "Sample" | ||
180 | ); | ||
181 | m_SampleCtl.SetSel(0,-1); | ||
182 | m_SampleCtl.SetSelectionCharFormat(m_fmtChar); | ||
183 | PARAFORMAT pf; | ||
184 | memset(&pf,0,sizeof(pf)); | ||
185 | pf.cbSize = sizeof(pf); | ||
186 | pf.dwMask = PFM_ALIGNMENT; | ||
187 | pf.wAlignment = PFA_CENTER; | ||
188 | m_SampleCtl.SetParaFormat(pf); | ||
189 | m_SampleCtl.HideSelection(TRUE,TRUE); | ||
190 | if(m_bgColorCtl.IsWindowEnabled()) | ||
191 | m_SampleCtl.SetBackgroundColor(FALSE,m_bgColorCtl.m_Color); | ||
192 | } | ||
193 | |||
194 | void CFontsPage::OnSelendokFaces() | ||
195 | { | ||
196 | UpdateFormat(TRUE); | ||
197 | FillCharsets(); | ||
198 | } | ||
199 | |||
200 | void CFontsPage::OnSelendokFontsize() | ||
201 | { | ||
202 | CString tmp; | ||
203 | m_SizeCtl.GetLBText(m_SizeCtl.GetCurSel(),tmp); | ||
204 | m_SizeCtl.SetWindowText(tmp); | ||
205 | UpdateFormat(TRUE); | ||
206 | } | ||
207 | void CFontsPage::OnEditchangeFontsize() | ||
208 | { | ||
209 | UpdateFormat(TRUE); | ||
210 | } | ||
211 | |||
212 | void CFontsPage::OnBold() | ||
213 | { | ||
214 | UpdateFormat(TRUE); | ||
215 | } | ||
216 | void CFontsPage::OnItalic() | ||
217 | { | ||
218 | UpdateFormat(TRUE); | ||
219 | } | ||
220 | void CFontsPage::OnStrikeout() | ||
221 | { | ||
222 | UpdateFormat(TRUE); | ||
223 | } | ||
224 | void CFontsPage::OnUnderline() | ||
225 | { | ||
226 | UpdateFormat(TRUE); | ||
227 | } | ||
228 | |||
229 | void CFontsPage::FillCharsets() | ||
230 | { | ||
231 | m_CharsetCtl.EnableWindow(TRUE); | ||
232 | m_CharsetCtl.ResetContent(); | ||
233 | CString tmp; | ||
234 | tmp.LoadString(IDS_CHARSET_AUTO); | ||
235 | VERIFY(m_CharsetCtl.AddString(tmp)==0); | ||
236 | VERIFY(m_CharsetCtl.SetItemData(0,DEFAULT_CHARSET)!=LB_ERR); | ||
237 | if(m_fmtChar.dwMask&CFM_FACE && *m_fmtChar.szFaceName){ | ||
238 | CClientDC dc(NULL); | ||
239 | LOGFONT lf; | ||
240 | memset(&lf,0,sizeof(lf)); | ||
241 | lf.lfCharSet = DEFAULT_CHARSET; | ||
242 | strcpy(lf.lfFaceName,m_fmtChar.szFaceName); | ||
243 | EnumFontFamiliesEx(dc.m_hDC,&lf,(FONTENUMPROC)FillInCharsets,(LPARAM)&m_CharsetCtl,0); | ||
244 | } | ||
245 | int ii = m_CharsetCtl.GetCount(); | ||
246 | for(int i=0;i<ii;i++){ | ||
247 | if(m_CharsetCtl.GetItemData(i)==m_fmtChar.bCharSet){ | ||
248 | m_CharsetCtl.SetCurSel(i); | ||
249 | break; | ||
250 | } | ||
251 | } | ||
252 | m_CharsetCtl.EnableWindow(m_CharsetCtl.GetCount()>1); | ||
253 | } | ||
254 | |||
255 | int CALLBACK CFontsPage::FillInCharsets(const ENUMLOGFONTEX* lpelfe,const TEXTMETRIC* lpntme,const int FontType,const LPARAM lParam) | ||
256 | { | ||
257 | //if(FontType!=TRUETYPE_FONTTYPE) | ||
258 | // return 1; | ||
259 | CComboBox* cb = (CComboBox*)lParam; | ||
260 | ASSERT(cb); | ||
261 | if(cb->FindString(0,(char*)lpelfe->elfScript)>=0) | ||
262 | return 1; | ||
263 | int i = cb->AddString((char*)lpelfe->elfScript); | ||
264 | ASSERT(i>=0); | ||
265 | VERIFY(cb->SetItemData(i,lpelfe->elfLogFont.lfCharSet)!=LB_ERR); | ||
266 | return 1; | ||
267 | } | ||
268 | |||
269 | void CFontsPage::OnSelendokCharset() | ||
270 | { | ||
271 | UpdateFormat(TRUE); | ||
272 | } | ||
273 | |||
274 | void CFontsPage::FillInFormats() | ||
275 | { | ||
276 | AddFmt(IDS_FMT_T42LOCAL,&m_fmtT42Local); | ||
277 | AddFmt(IDS_FMT_T42REMOTE,&m_fmtT42Remote); | ||
278 | AddFmt(IDS_FMT_T42SYSTEM,&m_fmtT42System,0); | ||
279 | m_FormatsCtl.SetCurSel(0); | ||
280 | OnSelchangeFormatname(); | ||
281 | } | ||
282 | void CFontsPage::AddFmt(UINT name,CFontFormat* cf,UINT flags) | ||
283 | { | ||
284 | CString f; | ||
285 | VERIFY(f.LoadString(name)); | ||
286 | int lf = f.Find('\n'); | ||
287 | int i = m_FormatsCtl.AddString((lf<0)?f:f.Left(lf)); | ||
288 | ASSERT(i>=0); | ||
289 | m_FormatsCtl.SetItemData(i,(LPARAM)cf); | ||
290 | cf->m_Tip = (lf<0)?"":f.Mid(lf+1); | ||
291 | cf->m_Flags = flags; | ||
292 | } | ||
293 | void CFontsPage::OnSelchangeFormatname() | ||
294 | { | ||
295 | CFontFormat* fmt = (CFontFormat*)m_FormatsCtl.GetItemData(m_FormatsCtl.GetCurSel()); | ||
296 | if(m_fmtLast){ | ||
297 | memmove(&m_fmtLast->m_fmtChar,&m_fmtChar,sizeof(m_fmtLast->m_fmtChar)); | ||
298 | if(m_fmtLast->m_Flags&CFontFormat::flagBGColor) | ||
299 | m_fmtLast->m_bgColor = m_bgColorCtl.m_Color; | ||
300 | } | ||
301 | BOOL bBG = fmt->m_Flags&CFontFormat::flagBGColor; | ||
302 | m_bgColorCtl.EnableWindow(bBG); | ||
303 | m_TipCtl.SetWindowText(fmt->m_Tip); | ||
304 | m_fmtLast = fmt; | ||
305 | memmove(&m_fmtChar,&m_fmtLast->m_fmtChar,sizeof(m_fmtChar)); | ||
306 | if(bBG){ | ||
307 | m_bgColorCtl.m_Color = m_fmtLast->m_bgColor; | ||
308 | m_bgColorCtl.Invalidate(); | ||
309 | } | ||
310 | UpdateFormat(FALSE); | ||
311 | UpdateSample(); | ||
312 | } | ||
313 | |||
314 | void CFontsPage::OnBackcolor() | ||
315 | { | ||
316 | m_bgColorCtl.SetColor(); | ||
317 | UpdateFormat(TRUE); | ||
318 | } | ||
319 | void CFontsPage::OnForecolor() | ||
320 | { | ||
321 | m_fgColorCtl.SetColor(); | ||
322 | UpdateFormat(TRUE); | ||
323 | } | ||
324 | |||
325 | void CFontsPage::OnOK() | ||
326 | { | ||
327 | if(m_fmtLast){ | ||
328 | memmove(&m_fmtLast->m_fmtChar,&m_fmtChar,sizeof(m_fmtLast->m_fmtChar)); | ||
329 | if(m_fmtLast->m_Flags&CFontFormat::flagBGColor) | ||
330 | m_fmtLast->m_bgColor = m_bgColorCtl.m_Color; | ||
331 | } | ||
332 | CPropertyPage::OnOK(); | ||
333 | } | ||