Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?
Mit Hilfe von Sertac Akyuz
es scheint der direkte Grund hängt mit der Zeichenkodierung \bullet
: In meinem lokalisierten Windows, die \bullet
Eingabe durch Eingabe von Alt(0149) bekommt immer \fcharset134
, und versuche, ändern Sie die zugehörige schriftart durch EM_SETCHARFORMAT
immer fehl (gut, die Farbe, Größe, Stil kann zwar geändert werden, aber nicht Namen für die schriftart).
Die einfachste Lösung ist daher der erste reset den Zeichensatz und dann die schriftart ändern.
Hinweis: RichEdit (version >= 4.1) verwendet werden sollte!
Hinweis: RichEdit-Versionen finden Sie auf MSDN ist Über Das Rich-Edit-Steuerelemente, Murray Sargent MSDN Blog RichEdit-Versionen und RichEdit-Versionen, das Update auf 7.0. Die letzteren Seiten erwähnt RichEdit-Versionen höher als 4.1. Als test habe ich kopiert die RICHED20.DLL versendet mit Office 2010 zusammen mit der Anwendung auf Windows 2000, und alles funktioniert wie ein Charme!
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;
==================================================
Laut Wikipedia, WordPad
Microsofts RichEdit
control, Versionen 1.0, 2.0 und 3.0 in Windows 95, 98 und Windows 2000, beziehungsweise. In Windows XP SP1 und höher, WordPad verwendet RichEdit 4.1, einschließlich Windows 7.
Sagen, ein rtf-Dokument, bearbeitet in WordPad, enthält einen nicht-text-Zeichen die Alt-Taste(0149), the bullet dot •
. (Oder U+2022)
In Windows 2000 SP4 oder XP SP2, die schriftart, die Kugel dot kann nur die Standard-schriftart in WordPad. Das heißt, man kann sich nicht ändern schriftart, die Kugel dot interaktiv in WordPad.
Aber in Windows 7 SP1, man könnte seine Schrift first changing to "Arial Unicode MS"
, und dann zu jedem gewünschten schriftart unbegrenzte Zeiten.
Außerdem, WordPad-Dokument, erstellt mit WordPad in Windows 7, enthält verschiedene Schriften von der dot geöffnet und angezeigt werden können, richtig in WordPad in Windows 2000 oder XP.
Den TRichEdit (Delphi XE, Windows 7) können Sie auch öffnen und anzeigen der WordPad-Dokument erstellt mit WordPad in Windows 7 richtig TRichEdit.Lines.LoadFromFile
.
Interaktiv, die TRichEdit (Delphi XE, Windows 7) ermöglicht the bullet dot
's schriftart geändert werden in "Arial Unicode MS". Jedoch kann man nicht weiter gehen, zu ändern, um andere Schriftarten interaktiv in TRichEdit.
Ich bin deshalb Fragen, (1) der Grund für das unterschiedliche Verhalten von WordPad in Windows 7, und (2) ob es möglich ist, zu machen TRichEdit Verhalten sich gleich?
PS: kann Man brauchen, geben Sie Alt(0149) mehrere Male, um den Punkt in WordPad. Eingabe 2022 und Alt+x funktioniert immer, wie vorgeschlagen,hier.
PS: Man muss auf "aktivieren" Schriftarten in WordPad wie bereits in der Antwort zu Warum TFontDialog gibt weniger Schriften als Bildschirm.Schriftarten?
PS: Man kann sich immer ändern Sie den Punkt, um verschiedene Schriftarten in Word.
Probe.rtf (einfügen in eine plain-text-Datei und ändern Sie dann die Erweiterung in das rtf-Format zu verwenden)
{\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
}
uMainForm.dfm anzeigen das format der Zeilen von TRichEdit
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
uMainForm.pas anzeigen das format der Zeilen von TRichEdit
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.
- Nur nebenbei,
François
schrieb darüber, wie der Einsatz von verschiedenen version des rich-edit-Steuerelementthis blog post
. Sie könnten versuchen, zu verwenden es auch. - Ich danke Ihnen sehr für Ihren Kommentar! Ich habe gerade versucht RichEdit 4.1 (verifiziert durch einfügen in einer farbigen Tabelle), wie Sie vorschlagen, aber ich kann immer noch nicht die schriftart ändern, der Punkt, um zum Beispiel einen Comic oder Lucida in das TRichEdit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Sache zu prüfen, um zu sehen, ob das richedit-Steuerelemente von WordPad und TRichEdit sind die gleichen. Ich würde empfehlen, Sie überprüfen mit (Spy++) Spyxx.exe um sicherzustellen, dass die Steuerung hat die gleiche Klasse und die gleichen Stile. Wenn Sie identisch sind, würde ich dann auch überprüfen, um sicherzustellen, dass die Kontrollen sind, die die selben Nachrichten wieder mit Spy++. Ich vermute, dass die Steuerelemente sind NICHT die gleichen, oder dass Sie sind nicht genau gleich konfiguriert.
Wenn Sie nicht die gleiche Kontrolle, dann sollten Sie in der Lage sein, die Verwendung der gleichen Steuerung wie WordPad (vorausgesetzt, es ist Teil der standard-Windows custom controls). Und Spy++, verwenden um das Format der gleichen Weise, dass WordPad ist. Auch, müssen Sie möglicherweise senden Sie die gleichen Botschaften.