Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/font_pp.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8771 - (hide annotations) (download) (as text)
Tue May 12 14:32:44 2020 UTC (3 years, 11 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/font_pp.cpp
File MIME type: text/x-c++src
File size: 9759 byte(s)
fontプロパティーページ追加

- Unicode/ANSI API切り替え
  - ANSI API使用時、文字コード変換に使用するコードページを変更できる
  - debugプロパティーページのUnicode/ANSI API切り替えを削除
- VTfont切り替えはすぐに設定に反映する
  - 今の所、[設定]/[フォント] から切り替えたときと同じ動作
- ANSI API利用時
  - 表示できない文字を表示
    - 半角時 '?'
    - 全角時 '?_'
- 未実装
  - フォント間
  - プロポーショナルフォント
1 zmatsuo 8771 /*
2     * (C) 2020 TeraTerm Project
3     * All rights reserved.
4     *
5     * Redistribution and use in source and binary forms, with or without
6     * modification, are permitted provided that the following conditions
7     * are met:
8     *
9     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     * 2. Redistributions in binary form must reproduce the above copyright
12     * notice, this list of conditions and the following disclaimer in the
13     * documentation and/or other materials provided with the distribution.
14     * 3. The name of the author may not be used to endorse or promote products
15     * derived from this software without specific prior written permission.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29     /* font property page */
30    
31     #include <stdio.h>
32     #define _CRTDBG_MAP_ALLOC
33     #include <stdlib.h>
34     #include <crtdbg.h>
35     #include <assert.h>
36    
37     #include "tttypes.h"
38     #include "font_pp_res.h"
39     #include "dlglib.h"
40     #include "setting.h"
41     #include "layer_for_unicode.h"
42     #include "vtdisp.h" // for DispSetupFontDlg()
43     #include "buffer.h"
44     #include "compat_win.h" // for CF_INACTIVEFONTS
45    
46     #include "font_pp.h"
47    
48     // �e���v���[�g�������������s��
49     #define REWRITE_TEMPLATE
50    
51     struct FontPPData {
52     HINSTANCE hInst;
53     const char *UILanguageFile;
54     TTTSet *pts;
55     DLGTEMPLATE *dlg_templ;
56     // LOGFONTA VTFont;
57     LOGFONTA DlgFont;
58     };
59    
60     static void GetDlgLogFont(HWND hWnd, const TTTSet *ts, LOGFONTA *logfont)
61     {
62     memset(logfont, 0, sizeof(*logfont));
63     logfont->lfHeight = -GetFontPixelFromPoint(hWnd, ts->DialogFontPoint);
64     strncpy_s(logfont->lfFaceName, sizeof(logfont->lfFaceName),ts->DialogFontName, _TRUNCATE);
65     logfont->lfCharSet = ts->DialogFontCharSet;
66     }
67    
68     static void SetDlgLogFont(HWND hWnd, const LOGFONTA *logfont, TTTSet *ts)
69     {
70     strncpy_s(ts->DialogFontName, sizeof(ts->DialogFontName), logfont->lfFaceName, _TRUNCATE);
71     ts->DialogFontPoint = GetFontPointFromPixel(hWnd, -logfont->lfHeight);
72     ts->DialogFontCharSet = logfont->lfCharSet;
73     }
74    
75     static UINT_PTR CALLBACK TFontHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
76     {
77     if (Message == WM_INITDIALOG) {
78     FontPPData *dlg_data = (FontPPData *)(((CHOOSEFONTA *)lParam)->lCustData);
79     wchar_t uimsg[MAX_UIMSG];
80     get_lang_msgW("DLG_CHOOSEFONT_STC6", uimsg, _countof(uimsg),
81     L"\"Font style\" selection here won't affect actual font appearance.", dlg_data->UILanguageFile);
82     _SetDlgItemTextW(Dialog, stc6, uimsg);
83    
84     SetFocus(GetDlgItem(Dialog,cmb1));
85    
86     CenterWindow(Dialog, GetParent(Dialog));
87     }
88     return FALSE;
89     }
90    
91     static void SetupDlgFont(HWND hWnd, FontPPData *dlg_data)
92     {
93     const TTTSet *ts = dlg_data->pts;
94    
95     // �_�C�A���O�\��
96     CHOOSEFONTA cf = {};
97     cf.lStructSize = sizeof(cf);
98     cf.hwndOwner = hWnd;
99     cf.lpLogFont = &dlg_data->DlgFont;
100     cf.Flags =
101     CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT |
102     CF_SHOWHELP | CF_NOVERTFONTS |
103     CF_ENABLEHOOK;
104     if (IsWindows7OrLater() && ts->ListHiddenFonts) {
105     cf.Flags |= CF_INACTIVEFONTS;
106     }
107     cf.lpfnHook = &TFontHook;
108     cf.nFontType = REGULAR_FONTTYPE;
109     cf.hInstance = dlg_data->hInst;
110     cf.lCustData = (LPARAM)dlg_data;
111     BOOL result = ChooseFontA(&cf);
112     }
113    
114     static void EnableCodePage(HWND hWnd, BOOL enable)
115     {
116     EnableWindow(GetDlgItem(hWnd, IDC_VTFONT_PAGECODE_LABEL), enable);
117     EnableWindow(GetDlgItem(hWnd, IDC_VTFONT_PAGECODE_EDIT), enable);
118     }
119    
120     static void SetFontString(HWND hWnd, int item, const LOGFONTA *logfont)
121     {
122     // https://docs.microsoft.com/en-us/windows/win32/api/dimm/ns-dimm-logfonta
123     // http://www.coara.or.jp/~tkuri/D/015.htm#D2002-09-14
124     char b[128];
125     sprintf_s(b, "%s (%d,%d) %d", logfont->lfFaceName, logfont->lfWidth, logfont->lfHeight, logfont->lfCharSet);
126     SetDlgItemTextA(hWnd, item, b);
127     }
128    
129     static void SetVTFontString(HWND hWnd, int item, const TTTSet *ts)
130     {
131     LOGFONTA logfont = {};
132     logfont.lfWidth = ts->VTFontSize.x;
133     logfont.lfHeight = ts->VTFontSize.y;
134     strncpy_s(logfont.lfFaceName, sizeof(logfont.lfFaceName),ts->VTFont, _TRUNCATE);
135     logfont.lfCharSet = ts->VTFontCharSet;
136     SetFontString(hWnd, item, &logfont);
137     }
138    
139     static INT_PTR CALLBACK Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
140     {
141     static const DlgTextInfo TextInfos[] = {
142     {0, "DLG_GEN_TITLE"},
143     };
144     FontPPData *dlg_data = (FontPPData *)GetWindowLongPtr(hWnd, DWLP_USER);
145     TTTSet *ts = dlg_data == NULL ? NULL : dlg_data->pts;
146    
147     switch (msg) {
148     case WM_INITDIALOG: {
149     dlg_data = (FontPPData *)(((PROPSHEETPAGEW_V1 *)lp)->lParam);
150     ts = dlg_data->pts;
151     SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)dlg_data);
152     SetDlgTexts(hWnd, TextInfos, _countof(TextInfos), dlg_data->pts->UILanguageFile);
153    
154     GetDlgLogFont(GetParent(hWnd), ts, &dlg_data->DlgFont);
155    
156     SetVTFontString(hWnd, IDC_VTFONT_EDIT, ts);
157    
158     CheckDlgButton(hWnd,
159     UnicodeDebugParam.UseUnicodeApi ? IDC_VTFONT_UNICODE : IDC_VTFONT_ANSI,
160     BST_CHECKED);
161     SetDlgItemInt(hWnd, IDC_VTFONT_PAGECODE_EDIT, UnicodeDebugParam.CodePageForANSIDraw, FALSE);
162     EnableCodePage(hWnd, UnicodeDebugParam.UseUnicodeApi ? FALSE : TRUE);
163    
164     CheckDlgButton(hWnd, IDC_LIST_HIDDEN_FONTS, ts->ListHiddenFonts);
165     EnableWindow(GetDlgItem(hWnd, IDC_LIST_HIDDEN_FONTS), IsWindows7OrLater() ? TRUE : FALSE);
166    
167     SetDlgItemInt(hWnd, IDC_SPACE_RIGHT, ts->FontDW, FALSE);
168     SetDlgItemInt(hWnd, IDC_SPACE_LEFT, ts->FontDH, FALSE);
169     SetDlgItemInt(hWnd, IDC_SPACE_TOP, ts->FontDX, FALSE);
170     SetDlgItemInt(hWnd, IDC_SPACE_BOTTOM, ts->FontDY, FALSE);
171    
172     const static I18nTextInfo visual_font_quality[] = {
173     { "DLG_TAB_VISUAL_FONT_QUALITY_DEFAULT", L"Default" },
174     { "DLG_TAB_VISUAL_FONT_QUALITY_NONANTIALIASED", L"Non-Antialiased" },
175     { "DLG_TAB_VISUAL_FONT_QUALITY_ANTIALIASED", L"Antialiased" },
176     { "DLG_TAB_VISUAL_FONT_QUALITY_CLEARTYPE", L"ClearType" },
177     };
178     SetI18nList("Tera Term", hWnd, IDC_FONT_QUALITY, visual_font_quality, _countof(visual_font_quality),
179     ts->UILanguageFile, 0);
180     int cur =
181     ts->FontQuality == DEFAULT_QUALITY ? 0 :
182     ts->FontQuality == NONANTIALIASED_QUALITY ? 1 :
183     ts->FontQuality == ANTIALIASED_QUALITY ? 2 :
184     /*ts->FontQuality == CLEARTYPE_QUALITY ? */ 3;
185     SendDlgItemMessage(hWnd, IDC_FONT_QUALITY, CB_SETCURSEL, cur, 0);
186    
187     SetFontString(hWnd, IDC_DLGFONT_EDIT, &dlg_data->DlgFont);
188     }
189     case WM_NOTIFY: {
190     NMHDR *nmhdr = (NMHDR *)lp;
191     switch (nmhdr->code) {
192     case PSN_APPLY: {
193     UnicodeDebugParam.UseUnicodeApi =
194     IsDlgButtonChecked(hWnd, IDC_VTFONT_UNICODE) == BST_CHECKED;
195     UnicodeDebugParam.CodePageForANSIDraw =
196     GetDlgItemInt(hWnd, IDC_VTFONT_PAGECODE_EDIT, NULL, FALSE);
197     // ANSI�\���p���R�[�h�y�[�W����������
198     BuffSetDispCodePage(UnicodeDebugParam.CodePageForANSIDraw);
199     ts->ListHiddenFonts = IsDlgButtonChecked(hWnd, IDC_LIST_HIDDEN_FONTS) == BST_CHECKED;
200    
201     SetDlgLogFont(GetParent(hWnd), &dlg_data->DlgFont, ts);
202    
203     break;
204     }
205     case PSN_HELP:
206     MessageBox(hWnd, "Tera Term", "not implimented",
207     MB_OK | MB_ICONEXCLAMATION);
208     break;
209     default:
210     break;
211     }
212     break;
213     }
214     case WM_COMMAND: {
215     switch (wp) {
216     case IDC_VTFONT_ANSI | (BN_CLICKED << 16):
217     case IDC_VTFONT_UNICODE | (BN_CLICKED << 16): {
218     BOOL enable = (wp & 0xffff) == IDC_VTFONT_ANSI ? TRUE : FALSE;
219     EnableCodePage(hWnd, enable);
220     break;
221     }
222     case IDC_VTFONT_CHOOSE | (BN_CLICKED << 16): {
223     DispSetupFontDlg();
224     SetDlgItemInt(hWnd, IDC_VTFONT_PAGECODE_EDIT, UnicodeDebugParam.CodePageForANSIDraw, FALSE);
225     SetVTFontString(hWnd, IDC_VTFONT_EDIT, ts);
226     break;
227     }
228     case IDC_DLGFONT_CHOOSE | (BN_CLICKED << 16):
229     SetupDlgFont(hWnd, dlg_data);
230     SetFontString(hWnd, IDC_DLGFONT_EDIT, &dlg_data->DlgFont);
231     break;
232    
233     case IDC_DLGFONT_DEFAULT | (BN_CLICKED << 16): {
234     GetMessageboxFont(&dlg_data->DlgFont);
235     SetFontString(hWnd, IDC_DLGFONT_EDIT, &dlg_data->DlgFont);
236     }
237    
238     default:
239     break;
240     }
241     break;
242     }
243     case WM_DESTROY: {
244     free(dlg_data->dlg_templ);
245     free(dlg_data);
246     SetWindowLongPtr(hWnd, DWLP_USER, NULL);
247     break;
248     }
249     default:
250     return FALSE;
251     }
252     return FALSE;
253     }
254    
255     HPROPSHEETPAGE FontPageCreate(HINSTANCE inst, TTTSet *pts)
256     {
257     // �� common/tt_res.h �� font_pp_res.h ���l�����v����������
258     const int id = IDD_TABSHEET_FONT;
259    
260     FontPPData *Param = (FontPPData *)calloc(sizeof(FontPPData), 1);
261     Param->hInst = inst;
262     Param->UILanguageFile = pts->UILanguageFile;
263     Param->pts = pts;
264    
265     PROPSHEETPAGEW_V1 psp = {};
266     psp.dwSize = sizeof(psp);
267     psp.dwFlags = PSP_DEFAULT;
268     psp.hInstance = inst;
269     psp.pszTemplate = MAKEINTRESOURCEW(id);
270     #if defined(REWRITE_TEMPLATE)
271     psp.dwFlags |= PSP_DLGINDIRECT;
272     Param->dlg_templ = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
273     psp.pResource = Param->dlg_templ;
274     #endif
275     psp.pszTitle = L"font";
276     psp.dwFlags |= (PSP_USETITLE /*| PSP_HASHELP */);
277    
278     psp.pfnDlgProc = Proc;
279     psp.lParam = (LPARAM)Param;
280    
281     HPROPSHEETPAGE hpsp = _CreatePropertySheetPageW(&psp);
282     return hpsp;
283     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26