Sertac Akyuz
の助けを借りて、直接の理由は\bullet
の文字セットに関連しているようです:私のローカライズされたWindowsでは、Alt(0149)と入力することによる\bullet
入力は常に\fcharset134
を取得し、EM_SETCHARFORMAT
を介してフォントを変更しようとすると常に失敗します(まあ、色、サイズ、スタイルは実際に変更できますが、フォントファミリ名は変更できません)。
したがって、最も簡単な回避策は、最初に文字セットをリセットしてから、フォントを変更することです。
注:RichEdit(バージョン> = 4.1)を使用する必要があります!
注:RichEditバージョンは、MSDNの Rich Edit Controlsについて 、Murray SargentのMSDNブログ RichEditバージョン および RichEditバージョンの7.0への更新 にあります。後半のページでは、4.1以降のRichEditバージョンについて言及しています。テストとして、Office2010に付属のRICHED20.DLLをアプリケーションと一緒にWindows2000にコピーしましたが、すべてが魅力のように機能します。
procedure TMainForm.ButtonFontClick(Sender: TObject);
var
format: TCharFormat2;
begin
if dlgFontCdxTxt.Execute then
begin
FillChar(format, sizeof(format), 0);
format.cbSize:= Sizeof(format);
format.dwMask:= CFM_CHARSET;
format.bCharSet := 1; // or 0;
redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
FillChar(format, sizeof(format), 0);
format.cbSize:= Sizeof(format);
format.dwMask:= CFM_FACE;
StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));
redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
end;
redtTextBlock.SetFocus;
end;
=================================================
Wikipedia によると、WordPad
はMicrosoftのRichEdit
コントロール、バージョン1.0、2.0、3.0をそれぞれWindows 95、98、Windows2000で使用していました。 Windows XP SP1以降では、ワードパッドはWindows7を含むRichEdit4.1を使用します。
ワードパッドで編集されているrtfドキュメントに、テキスト以外の文字Alt(0149)、the bullet dot •
が含まれているとします。 (またはU + 2022)
Windows 2000SP4またはXP SP2では、その箇条書きのフォントはワードパッドのデフォルトフォントのみを使用できます。つまり、ワードパッドでその箇条書きのフォントをインタラクティブに変更することはできません。
ただし、Windows 7 SP1では、フォントをfirst changing to "Arial Unicode MS"
だけ変更してから、任意のフォントに無制限に変更できます。
さらに、Windows 7のワードパッドを使用して作成されたドットの異なるフォントを含むワードパッドドキュメントは、Windows2000またはXPのワードパッドで正しく開いて表示できます。
TRichEdit(Delphi XE、Windows 7)は、Windows7でワードパッドを使用して作成されたワードパッドドキュメントをTRichEdit.Lines.LoadFromFile
によって正しく開いて表示することもできます。
インタラクティブに、TRichEdit(Delphi XE、Windows 7)を使用すると、the bullet dot
のフォントを「ArialUnicodeMS」に変更できます。ただし、TRichEditでインタラクティブに他のフォントに変更することはできません。
したがって、(1)Windows 7でのワードパッドの動作が異なる理由、および(2)TRichEditを同じように動作させることができるかどうか疑問に思っています。
PS:ワードパッドでドットを取得するには、Alt(0149)を数回入力する必要がある場合があります。提案されているように、2022とAlt + xを入力すると、常に機能します ここ 。
PS: TFontDialogがScreen.Fontsよりも少ないフォントを提供するのはなぜですか? の答えで述べられているように、ワードパッドのフォントを「アクティブ化」する必要があります。
PS:Wordではいつでもドットを別のフォントに変更できます。
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fswiss\fprq2\fcharset134 Arial Unicode MS;}{\f1\fnil\fcharset0 Arial Unicode MS;}{\f2\froman\fprq2\fcharset0 Times New Roman;}{\f3\fscript\fprq2\fcharset0 Comic Sans MS;}{\f4\fnil\fcharset0 Comic Sans MS;}{\f5\fmodern\fprq1\fcharset0 Consolas;}{\f6\fnil\fcharset0 Consolas;}{\f7\fmodern\fprq1\fcharset0 Lucida Console;}{\f8\fnil\fcharset0 Lucida Console;}{\f9\froman\fprq2\fcharset2 Symbol;}{\f10\froman\fprq2\fcharset0 Symbol;}{\f11\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\nowidctlpar\sa200\sl276\slmult1\lang2052\f0\fs22 Arial sample text \lang1033\f1\bullet\f2\par
\b\f3 Comic sample text \f4\bullet\f2\par
\b0\f5 Consolas sample text \f6\bullet\f2\par
\f7 Lucida sample text \f8\bullet\f2\par
\pard\nowidctlpar\qj\lang2052\f9 symbl sample text \lang1033\f10\u149?\kerning2\fs21\par
\pard\sa200\sl276\slmult1\lang2052\kerning0\f11\fs22\par
}
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'MainForm'
ClientHeight = 362
ClientWidth = 637
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object pnlBtn: TPanel
Left = 0
Top = 0
Width = 637
Height = 57
Align = alTop
Caption = 'pnlBtn'
TabOrder = 0
object Button1: TButton
Left = 240
Top = 14
Width = 137
Height = 31
Caption = 'Analyze Rich Edit'
TabOrder = 0
OnClick = Button1Click
end
end
object pnlClient: TPanel
Left = 0
Top = 57
Width = 637
Height = 305
Align = alClient
Caption = 'pnlClient'
TabOrder = 1
object redtTextBlock: TRichEdit
Left = 1
Top = 1
Width = 225
Height = 303
Align = alLeft
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
Lines.Strings = (
'redt1')
ParentFont = False
TabOrder = 0
end
object mmo1: TMemo
Left = 226
Top = 1
Width = 410
Height = 303
Align = alClient
Lines.Strings = (
'mmo1')
TabOrder = 1
end
end
object Button2: TButton
Left = 36
Top = 14
Width = 171
Height = 31
Caption = 'Font...'
TabOrder = 2
OnClick = Button2Click
end
object dlgFontCdxTxt: TFontDialog
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
Left = 480
Top = 16
end
end
unit uMainForm;
interface
uses
Contnrs,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TCdxmlStyle = class
public
FontName: string;
Str: string;
end;
TCdxmlText = class
public
Styles: TObjectList;
constructor Create;
end;
TMainForm = class(TForm)
redtTextBlock: TRichEdit;
mmo1: TMemo;
pnlBtn: TPanel;
pnlClient: TPanel;
Button1: TButton;
Button2: TButton;
dlgFontCdxTxt: TFontDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure TestLoadFromFile;
procedure AnalyzeRichEdit;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses
RichEdit, StrUtils;
{ TCdxmlText }
constructor TCdxmlText.Create;
begin
Styles := TObjectList.Create;
end;
var
l_HiddenRichEdit: TRichEdit;
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
begin
TestLoadFromFile;
AnalyzeRichEdit;
end;
procedure TMainForm.Button2Click(Sender: TObject);
var
format: TCharFormat2;
begin
if dlgFontCdxTxt.Execute then
begin
FillChar(format, sizeof(format), 0);
format.cbSize:= Sizeof(format);
format.dwMask:= CFM_FACE;
StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));
redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
end;
redtTextBlock.SetFocus;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
AnalyzeRichEdit;
end;
procedure TMainForm.TestLoadFromFile;
begin
redtTextBlock.Clear;
redtTextBlock.Lines.LoadFromFile('sample.rtf');
end;
procedure TMainForm.AnalyzeRichEdit;
var
l_MemStream: TMemoryStream;
l_Format: TCharFormat2;
I, J: Integer;
l_CdxmlStyle, l_CdxmlStyleWorker: TCdxmlStyle;
l_StyleFont: string;
l_CdxmlText: TCdxmlText;
begin
l_CdxmlStyle := nil;
l_CdxmlStyleWorker := nil;
mmo1.Clear;
l_MemStream := TMemoryStream.Create;
redtTextBlock.Lines.SaveToStream(l_MemStream);
l_MemStream.Seek(0, soFromBeginning);
l_HiddenRichEdit.Lines.LoadFromStream(l_MemStream);
l_CdxmlText := TCdxmlText.Create;
for I := 0 to Length(TrimRight(l_HiddenRichEdit.Text)) - 1 do
begin
l_CdxmlStyleWorker := TCdxmlStyle.Create;
FillChar(l_Format, sizeof(l_Format), 0);
l_Format.cbSize:= Sizeof(l_Format);
l_Format.dwMask:= CFM_FACE;
l_HiddenRichEdit.SelStart := I;
l_HiddenRichEdit.SelLength := 1;
l_HiddenRichEdit.Perform(EM_GETCHARFORMAT, SCF_SELECTION, Integer(@l_Format));
l_CdxmlStyleWorker.FontName := l_Format.szFaceName;
l_CdxmlStyleWorker.Str := AnsiReplaceStr(l_HiddenRichEdit.SelText, #13, #13#10);
if l_CdxmlStyle = nil then
begin
l_CdxmlText.Styles.Add(l_CdxmlStyleWorker);
l_CdxmlStyle := l_CdxmlStyleWorker;
end
else if (l_CdxmlStyleWorker.FontName <> l_CdxmlStyle.FontName ) then
begin
l_CdxmlText.Styles.Add(l_CdxmlStyleWorker);
l_CdxmlStyle := l_CdxmlStyleWorker;
end
else
begin
l_CdxmlStyle.Str := l_CdxmlStyle.Str + l_CdxmlStyleWorker.Str;
end;
end;
for I := 0 to l_CdxmlText.Styles.Count - 1 do
begin
l_CdxmlStyle := TCdxmlStyle(l_CdxmlText.Styles[I]);
mmo1.Lines.Add(l_CdxmlStyle.Str + ':' + l_CdxmlStyle.FontName);
end;
end;
initialization
l_HiddenRichEdit := TRichEdit.CreateParented(HWND_MESSAGE);
end.
チェックすることの1つは、ワードパッドとTRichEditで使用されるリッチエディットコントロールが同じであるかどうかを確認することです。 (Spy ++)Spyxx.exeをチェックして、コントロールのクラスとスタイルが同じであることを確認することをお勧めします。それらが同じである場合は、Spy ++を使用して、コントロールが同じメッセージを受信していることも確認します。コントロールが同じではないか、同じように構成されていないのではないかと思います。
それらが同じコントロールでない場合は、ワードパッドと同じコントロールを使用できるはずです(標準のWindowsカスタムコントロールの一部であると想定しています)。また、Spy ++を使用して、ワードパッドと同じ方法でスタイルを設定します。また、同じメッセージを送信する必要がある場合もあります。