GFontDialog.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:16k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: GFontDialog.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Drawing;
  7. using System.Drawing.Text;
  8. using System.Collections;
  9. using System.ComponentModel;
  10. using System.Windows.Forms;
  11. using System.Diagnostics;
  12. using System.Runtime.InteropServices;
  13. using Poderosa.Config;
  14. namespace Poderosa.Forms {
  15. /// <summary>
  16. /// GFontDialog 偺奣梫偺愢柧偱偡丅
  17. /// </summary>
  18. internal class GFontDialog : System.Windows.Forms.Form {
  19. //偙偺僟僀傾儘僌偼尵岅偵傛偭偰條巕偑堘偭偰偔傞
  20. private Language _language;
  21. private System.Windows.Forms.ListBox _asciiFontList;
  22. private System.Windows.Forms.Label _lAsciiFont;
  23. private System.Windows.Forms.Label _lFontSize;
  24. private ComboBox _fontSizeList;
  25. private System.Windows.Forms.CheckBox _checkClearType;
  26. private System.Windows.Forms.Label _lJapaneseFont;
  27. private System.Windows.Forms.ListBox _japaneseFontList;
  28. private ClearTypeAwareLabel _lASCIISample;
  29. private ClearTypeAwareLabel _lJapaneseSample;
  30. private System.Windows.Forms.Button _okButton;
  31. private System.Windows.Forms.Button _cancelButton;
  32. /// <summary>
  33. /// 昁梫側僨僓僀僫曄悢偱偡丅
  34. /// </summary>
  35. private System.ComponentModel.Container components = null;
  36. private bool _ignoreEvent;
  37. private Font _japaneseFont;
  38. private Font _asciiFont;
  39. public Font JapaneseFont {
  40. get {
  41. return _japaneseFont;
  42. }
  43. }
  44. public Font ASCIIFont {
  45. get {
  46. return _asciiFont;
  47. }
  48. }
  49. public bool UseClearType {
  50. get {
  51. return _checkClearType.Checked;
  52. }
  53. }
  54. public void SetFont(bool cleartype, Font ascii, Font japanese) {
  55. _ignoreEvent = true;
  56. _asciiFont = ascii;
  57. _japaneseFont = japanese;
  58. _checkClearType.Checked = cleartype;
  59. _lASCIISample.ClearType = cleartype;
  60. _lJapaneseSample.ClearType = cleartype;
  61. int s = (int)ascii.Size;
  62. _fontSizeList.SelectedIndex = _fontSizeList.FindStringExact(s.ToString());
  63. _asciiFontList.SelectedIndex = _asciiFontList.FindStringExact(ascii.Name);
  64. _japaneseFontList.SelectedIndex = _japaneseFontList.FindStringExact(japanese.Name);
  65. if(_asciiFontList.SelectedIndex==-1) _asciiFontList.SelectedIndex = _asciiFontList.FindStringExact("Courier New");
  66. if(_japaneseFontList.SelectedIndex==-1) _japaneseFontList.SelectedIndex = _japaneseFontList.FindStringExact("俵俽 僑僔僢僋");
  67. _lASCIISample.Font = ascii;
  68. _lJapaneseSample.Font = japanese;
  69. _ignoreEvent = false;
  70. }
  71. public GFontDialog() {
  72. //
  73. // Windows 僼僅乕儉 僨僓僀僫 僒億乕僩偵昁梫偱偡丅
  74. //
  75. InitializeComponent();
  76. _language = GApp.Options.Language;
  77. this._lAsciiFont.Text = GApp.Strings.GetString("Form.GFontDialog._lAsciiFont");
  78. this._lJapaneseFont.Text = GApp.Strings.GetString("Form.GFontDialog._lJapaneseFont");
  79. this._lFontSize.Text = GApp.Strings.GetString("Form.GFontDialog._lFontSize");
  80. this._checkClearType.Text = GApp.Strings.GetString("Form.GFontDialog._checkClearType");
  81. this._okButton.Text = GApp.Strings.GetString("Common.OK");
  82. this._cancelButton.Text = GApp.Strings.GetString("Common.Cancel");
  83. this._lASCIISample.Text = GApp.Strings.GetString("Common.FontSample");
  84. this._lJapaneseSample.Text = GApp.Strings.GetString("Common.JapaneseFontSample");
  85. this.Text = GApp.Strings.GetString("Form.GFontDialog.Text");
  86. if(_language==Language.English) {
  87. _lJapaneseFont.Visible = false;
  88. _japaneseFontList.Visible = false;
  89. _lJapaneseSample.Visible = false;
  90. int dl = _lJapaneseFont.Width/2-32;
  91. int dw = 72;
  92. _lAsciiFont.Left += dl;
  93. _lAsciiFont.Width += dw;
  94. _asciiFontList.Left += dl;
  95. _asciiFontList.Width += dw;
  96. _lASCIISample.Left += dl;
  97. _lASCIISample.Width += dw;
  98. }
  99. //
  100. // TODO: InitializeComponent 屇傃弌偟偺屻偵丄僐儞僗僩儔僋僞 僐乕僪傪捛壛偟偰偔偩偝偄丅
  101. //
  102. InitUI();
  103. }
  104. /// <summary>
  105. /// 巊梡偝傟偰偄傞儕僜乕僗偵屻張棟傪幚峴偟傑偡丅
  106. /// </summary>
  107. protected override void Dispose( bool disposing ) {
  108. if( disposing ) {
  109. if(components != null) {
  110. components.Dispose();
  111. }
  112. }
  113. base.Dispose( disposing );
  114. }
  115. #region Windows Form Designer generated code
  116. /// <summary>
  117. /// 僨僓僀僫 僒億乕僩偵昁梫側儊僜僢僪偱偡丅偙偺儊僜僢僪偺撪梕傪
  118. /// 僐乕僪 僄僨傿僞偱曄峏偟側偄偱偔偩偝偄丅
  119. /// </summary>
  120. private void InitializeComponent() {
  121. this._asciiFontList = new System.Windows.Forms.ListBox();
  122. this._lAsciiFont = new System.Windows.Forms.Label();
  123. this._lFontSize = new System.Windows.Forms.Label();
  124. this._fontSizeList = new ComboBox();
  125. this._checkClearType = new System.Windows.Forms.CheckBox();
  126. this._lJapaneseFont = new System.Windows.Forms.Label();
  127. this._japaneseFontList = new System.Windows.Forms.ListBox();
  128. this._lASCIISample = new Poderosa.Forms.ClearTypeAwareLabel();
  129. this._lJapaneseSample = new Poderosa.Forms.ClearTypeAwareLabel();
  130. this._okButton = new System.Windows.Forms.Button();
  131. this._cancelButton = new System.Windows.Forms.Button();
  132. this.SuspendLayout();
  133. // 
  134. // _asciiFontList
  135. // 
  136. this._asciiFontList.ItemHeight = 12;
  137. this._asciiFontList.Location = new System.Drawing.Point(8, 88);
  138. this._asciiFontList.Name = "_asciiFontList";
  139. this._asciiFontList.Size = new System.Drawing.Size(128, 100);
  140. this._asciiFontList.TabIndex = 4;
  141. this._asciiFontList.SelectedIndexChanged += new System.EventHandler(this.OnASCIIFontChange);
  142. // 
  143. // _lAsciiFont
  144. // 
  145. this._lAsciiFont.Location = new System.Drawing.Point(8, 64);
  146. this._lAsciiFont.Name = "_lAsciiFont";
  147. this._lAsciiFont.Size = new System.Drawing.Size(120, 23);
  148. this._lAsciiFont.TabIndex = 3;
  149. this._lAsciiFont.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
  150. // 
  151. // _lFontSize
  152. // 
  153. this._lFontSize.Location = new System.Drawing.Point(16, 12);
  154. this._lFontSize.Name = "_lFontSize";
  155. this._lFontSize.Size = new System.Drawing.Size(104, 16);
  156. this._lFontSize.TabIndex = 0;
  157. // 
  158. // _fontSizeList
  159. // 
  160. this._fontSizeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
  161. this._fontSizeList.Location = new System.Drawing.Point(136, 8);
  162. this._fontSizeList.Name = "_fontSizeList";
  163. this._fontSizeList.Size = new System.Drawing.Size(121, 20);
  164. this._fontSizeList.TabIndex = 1;
  165. this._fontSizeList.SelectedIndexChanged += new System.EventHandler(this.UpdateFontSample);
  166. // 
  167. // _checkClearType
  168. // 
  169. this._checkClearType.Location = new System.Drawing.Point(24, 32);
  170. this._checkClearType.Name = "_checkClearType";
  171. this._checkClearType.FlatStyle = FlatStyle.System;
  172. this._checkClearType.Size = new System.Drawing.Size(240, 32);
  173. this._checkClearType.TabIndex = 2;
  174. this._checkClearType.CheckedChanged += new System.EventHandler(this.UpdateFontSample);
  175. // 
  176. // _lJapaneseFont
  177. // 
  178. this._lJapaneseFont.Location = new System.Drawing.Point(144, 64);
  179. this._lJapaneseFont.Name = "_lJapaneseFont";
  180. this._lJapaneseFont.Size = new System.Drawing.Size(128, 23);
  181. this._lJapaneseFont.TabIndex = 5;
  182. this._lJapaneseFont.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
  183. // 
  184. // _japaneseFontList
  185. // 
  186. this._japaneseFontList.ItemHeight = 12;
  187. this._japaneseFontList.Location = new System.Drawing.Point(144, 88);
  188. this._japaneseFontList.Name = "_japaneseFontList";
  189. this._japaneseFontList.Size = new System.Drawing.Size(128, 100);
  190. this._japaneseFontList.TabIndex = 6;
  191. this._japaneseFontList.SelectedIndexChanged += new System.EventHandler(this.OnJapaneseFontChange);
  192. // 
  193. // _lASCIISample
  194. // 
  195. this._lASCIISample.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
  196. this._lASCIISample.ClearType = false;
  197. this._lASCIISample.Location = new System.Drawing.Point(8, 192);
  198. this._lASCIISample.Name = "_lASCIISample";
  199. this._lASCIISample.Size = new System.Drawing.Size(128, 40);
  200. this._lASCIISample.TabIndex = 7;
  201. this._lASCIISample.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
  202. // 
  203. // _lJapaneseSample
  204. // 
  205. this._lJapaneseSample.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
  206. this._lJapaneseSample.ClearType = false;
  207. this._lJapaneseSample.Location = new System.Drawing.Point(144, 192);
  208. this._lJapaneseSample.Name = "_lJapaneseSample";
  209. this._lJapaneseSample.Size = new System.Drawing.Size(128, 40);
  210. this._lJapaneseSample.TabIndex = 8;
  211. this._lJapaneseSample.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
  212. // 
  213. // _okButton
  214. // 
  215. this._okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
  216. this._okButton.Location = new System.Drawing.Point(112, 236);
  217. this._okButton.Name = "_okButton";
  218. this._okButton.FlatStyle = FlatStyle.System;
  219. this._okButton.TabIndex = 9;
  220. this._okButton.Click += new System.EventHandler(this.OnOK);
  221. // 
  222. // _cancelButton
  223. // 
  224. this._cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
  225. this._cancelButton.Location = new System.Drawing.Point(200, 236);
  226. this._cancelButton.Name = "_cancelButton";
  227. this._cancelButton.FlatStyle = FlatStyle.System;
  228. this._cancelButton.TabIndex = 10;
  229. this._cancelButton.Click += new System.EventHandler(this.OnCancel);
  230. // 
  231. // GFontDialog
  232. // 
  233. this.AcceptButton = this._okButton;
  234. this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
  235. this.CancelButton = this._cancelButton;
  236. this.ClientSize = new System.Drawing.Size(282, 271);
  237. this.Controls.AddRange(new System.Windows.Forms.Control[] {
  238.   this._cancelButton,
  239.   this._okButton,
  240.   this._lJapaneseSample,
  241.   this._lASCIISample,
  242.   this._japaneseFontList,
  243.   this._lJapaneseFont,
  244.   this._checkClearType,
  245.   this._fontSizeList,
  246.   this._lFontSize,
  247.   this._lAsciiFont,
  248.   this._asciiFontList});
  249. this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
  250. this.MaximizeBox = false;
  251. this.MinimizeBox = false;
  252. this.Name = "GFontDialog";
  253. this.ShowInTaskbar = false;
  254. this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
  255. this.ResumeLayout(false);
  256. }
  257. #endregion
  258. private void InitUI() {
  259. _fontSizeList.Items.Add("6");
  260. _fontSizeList.Items.Add("8");
  261. _fontSizeList.Items.Add("9");
  262. _fontSizeList.Items.Add("10");
  263. _fontSizeList.Items.Add("11");
  264. _fontSizeList.Items.Add("12");
  265. _fontSizeList.Items.Add("14");
  266. _fontSizeList.Items.Add("16");
  267. _fontSizeList.Items.Add("18");
  268. _fontSizeList.Items.Add("20");
  269. InitFontList();
  270. /*
  271. foreach(FontFamily f in FontFamily.Families) {
  272. if(!f.IsStyleAvailable(FontStyle.Regular|FontStyle.Underline|FontStyle.Bold)) continue;
  273. Win32.LOGFONT lf = new Win32.LOGFONT();
  274. new Font(f, 10).ToLogFont(lf);
  275. //if((lf.lfPitchAndFamily & 0x01)==0) continue; //fixed pitch偺傒擣傔傞
  276. Debug.WriteLine(lf.lfFaceName+" " + lf.lfCharSet + " " + lf.lfPitchAndFamily);
  277. if(lf.lfCharSet==128)
  278. _japaneseFontList.Items.Add(f.GetName(0));
  279. if(lf.lfCharSet!=2) //Symbol梡偼彍偔
  280. _asciiFontList.Items.Add(f.GetName(0));
  281. }
  282. */
  283. }
  284. private void InitFontList() {
  285. Win32.tagLOGFONT lf = new Win32.tagLOGFONT();
  286. Graphics g = CreateGraphics();
  287. IntPtr hDC = g.GetHdc();
  288. Win32.EnumFontFamExProc proc = new Win32.EnumFontFamExProc(FontProc);
  289. IntPtr lParam = new IntPtr(0);
  290. lf.lfCharSet = 1; //default
  291. Win32.EnumFontFamiliesEx(hDC, ref lf, proc, lParam, 0);
  292. //lf.lfCharSet = 128; //擔杮岅
  293. //lParam = new IntPtr(128);
  294. //Win32.EnumFontFamiliesEx(hDC, ref lf, proc, lParam, 0);
  295. g.ReleaseHdc(hDC);
  296. }
  297. private int FontProc(ref Win32.ENUMLOGFONTEX lpelfe, ref Win32.NEWTEXTMETRICEX lpntme, uint FontType, IntPtr lParam) {
  298. //(lpelfe.lfPitchAndFamily & 2)==0)
  299. bool interesting = FontType==4 && (lpntme.ntmTm.tmPitchAndFamily & 1)==0 && lpelfe.lfFaceName[0]!='@';
  300. //if(!interesting)
  301. // if(lpelfe.lfFaceName=="FixedSys" || lpelfe.lfFaceName=="Terminal") interesting = true; //偙偺俀偮偩偗偼TrueType偱側偔偲傕儕僗僩偵偄傟傞
  302. if(interesting) { //廲彂偒偱側偄偙偲偼偙傟偱偟偐敾掕偱偒側偄偺偐丠
  303. if(_language==Language.Japanese && lpntme.ntmTm.tmCharSet==128) {
  304. _japaneseFontList.Items.Add(lpelfe.lfFaceName);
  305. //擔杮岅僼僅儞僩偱傕ASCII偼昁偢昞帵偱偒傞偼偢
  306. if(_asciiFontList.FindStringExact(lpelfe.lfFaceName)==-1)
  307. _asciiFontList.Items.Add(lpelfe.lfFaceName);
  308. }
  309. else if(lpntme.ntmTm.tmCharSet==0) {
  310. if(_asciiFontList.FindStringExact(lpelfe.lfFaceName)==-1)
  311. _asciiFontList.Items.Add(lpelfe.lfFaceName);
  312. }
  313. }
  314. return 1;
  315. }
  316. private void UpdateFontSample(object sender, EventArgs args) {
  317. if(_ignoreEvent) return;
  318. _lASCIISample.ClearType = _checkClearType.Checked;
  319. _lJapaneseSample.ClearType = _checkClearType.Checked;
  320. OnJapaneseFontChange(sender, args);
  321. OnASCIIFontChange(sender, args);
  322. _lASCIISample.Invalidate();
  323. _lJapaneseSample.Invalidate();
  324. }
  325. private void OnJapaneseFontChange(object sender, EventArgs args) {
  326. if(_ignoreEvent || _japaneseFontList.SelectedIndex==-1) return;
  327. string fontname = (string)_japaneseFontList.Items[_japaneseFontList.SelectedIndex];
  328. _japaneseFont = GUtil.CreateFont(fontname, GetFontSize());
  329. _lJapaneseSample.Font = _japaneseFont;
  330. }
  331. private void OnASCIIFontChange(object sender, EventArgs args) {
  332. if(_ignoreEvent || _asciiFontList.SelectedIndex==-1) return;
  333. string fontname = (string)_asciiFontList.Items[_asciiFontList.SelectedIndex];
  334. _asciiFont = GUtil.CreateFont(fontname, GetFontSize());
  335. _lASCIISample.Font = _asciiFont;
  336. }
  337. private void OnOK(object sender, EventArgs args) {
  338. if(!CheckFixedSizeFont("FixedSys", 14) || !CheckFixedSizeFont("Terminal", 6,10,14,17,20))
  339. this.DialogResult = DialogResult.None;
  340. else {
  341. this.DialogResult = DialogResult.OK;
  342. try {
  343. Close();
  344. }
  345. catch(Exception ex) {
  346. Debug.WriteLine(ex.Message);
  347. Debug.WriteLine(ex.StackTrace);
  348. }
  349. }
  350. }
  351. private void OnCancel(object sender, EventArgs args) {
  352. this.DialogResult = DialogResult.Cancel;
  353. Close();
  354. }
  355. //屌掕挿僼僅儞僩傪巊偭偰偄傞偲偒丄擣傔傜傟偰偄側偄僒僀僘傪巜掕偟偰偄偨傜寈崘偟偰false傪曉偡丅
  356. //allowed_sizes偼僒僀僘巜掕偺儕僗僩偵娷傑傟偰偄傞傕偺傪巊梡偡傞偙偲両
  357. private bool CheckFixedSizeFont(string name, params float[] allowed_sizes) {
  358. if(_asciiFont.Name==name || _japaneseFont.Name==name) {
  359. float sz = GetFontSize();
  360. bool contained = false;
  361. float diff = Single.MaxValue;
  362. float nearest = 0;
  363. foreach(float t in allowed_sizes) {
  364. if(t==sz) {
  365. contained = true;
  366. break;
  367. }
  368. else {
  369. if(diff > Math.Abs(sz - t)) {
  370. diff = Math.Abs(sz - t);
  371. nearest = t;
  372. }
  373. }
  374. }
  375. if(!contained) {
  376. GUtil.Warning(this, String.Format(GApp.Strings.GetString("Message.GFontDialog.NotTrueTypeWarning"), name, nearest));
  377. _fontSizeList.SelectedIndex = _fontSizeList.FindStringExact(nearest.ToString());
  378. return false;
  379. }
  380. else
  381. return true;
  382. }
  383. else
  384. return true;
  385. }
  386. private float GetFontSize() {
  387. return Single.Parse((string)_fontSizeList.Items[_fontSizeList.SelectedIndex]);
  388. }
  389. }
  390. class ClearTypeAwareLabel : Label {
  391.         private bool _clearType;
  392. public bool ClearType {
  393. get {
  394. return _clearType;
  395. }
  396. set {
  397. _clearType = value;
  398. }
  399. }
  400. protected override void OnPaint(PaintEventArgs args) {
  401. base.OnPaint(args);
  402. args.Graphics.TextRenderingHint = _clearType? TextRenderingHint.ClearTypeGridFit : TextRenderingHint.SystemDefault;
  403. }
  404. }
  405. }