3

NoBugz( Hans Passant )によって書かれた古いコードを見つけました。これは、理解していれば、リッチテキストボックスで4.0ではなくRTF5.0を使用するように強制します。基本的には、プロパティ自体を継承してオーバーライドするクラスです。RichTextBoxCreateParams

private static IntPtr moduleHandle;

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern IntPtr LoadLibrary(string lpFileName);

protected override CreateParams CreateParams
{
    get
    {
        if (moduleHandle == IntPtr.Zero)
        {
            moduleHandle = LoadLibrary("msftedit.dll");
            if ((long)moduleHandle < 0x20) throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not load Msftedit.dll");
        }
        CreateParams createParams = base.CreateParams;
        createParams.ClassName = "RichEdit50W";
        if (this.Multiline)
        {
            if (((this.ScrollBars & RichTextBoxScrollBars.Horizontal) != RichTextBoxScrollBars.None) && !base.WordWrap)
            {
                createParams.Style |= 0x100000;
                if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None)
                {
                    createParams.Style |= 0x2000;
                }
            }
            if ((this.ScrollBars & RichTextBoxScrollBars.Vertical) != RichTextBoxScrollBars.None)
            {
                createParams.Style |= 0x200000;
                if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None)
                {
                    createParams.Style |= 0x2000;
                }
             }
        }
        if ((BorderStyle.FixedSingle == base.BorderStyle) && ((createParams.Style & 0x800000) != 0))
        {
            createParams.Style &= -8388609;
            createParams.ExStyle |= 0x200;
        }
        return createParams;
    }
}

このオーバーライドを実行すると、RTFを最初の行を超えて表示できません。例えば

string rtf = @"{\rtf1\ansi\deff0{\fonttbl{\f0 Arial;}{\f1 Courier New;}}\viewkind4\uc1\pard\lang1033\f0\fs20 {\pard\f0\ul\b Activated Partial Thromboplastin Time\b0 : Collected: "
                 + @"8/21/2012 4:15:00 AM\ulnon\f0\par}\par\pard\lang1033\f0\fs20 {\trowd"
                 + @"\trql\trgaph100\trrh280\trleft0\intbl"
                 + @"\cellx4000"
                 + @"\cellx9500"
                 + @"Activated Partial Thromboplastin Time\cell"
                 + @"36.8 Seconds\cell"
                 + @"\intbl\row}";
CustomRtb cRtb = new CustomRtb();
cRtb.Rtf = rtf;//Only the first line shows in the form...

新しい標準は、Rtfエラーの許容度がはるかに低いのでしょうか。5.0で提供されるよりきれいなテーブルフォーマットが必要です

UPDATE
変更するとデータが表示されます

+ @"\trql\trgaph100\trrh280\trleft0\intbl"

+ @"\trql\trgaph100\trrh280\trleft0"


さらにテストしたところ、RTFはMSWordで見栄えがすることがわかりました。実際、このコードは、次のようにMsftEditを使用してRTFを生成します。

{\*\generator Msftedit 5.41.21.2510;}。Wordで実際のRTFを開くと、問題ないように見えます。私はこのコードを使用し、それは私が言葉で見るものとほとんど一致します。いくつかの境界線を削除する必要があります。MsfteditがRTFを生成してテーブル内でわずかに位置がずれている理由を確認するには、さらに深く掘り下げる必要があります。しかし、ええ、全体として、この質問は私がSOでできることの範囲を超えています。

4

1 に答える 1

1

コードでRTFを手作りするのは簡単なことではありません。これらのエスケープ文字に注意を払う必要があり、スペースも非常に重要になります。

これに取り組む最も簡単な方法は、リバースエンジニアリングすることです。Microsoft Wordを開き、テーブルを作成し、好みに合わせてフォーマットしてから、CustomRtbコントロールにコピーして貼り付け、生成された結果のRTFコードを確認します。

private string Sample() {
  StringBuilder sb = new StringBuilder();
  sb.Append(@"{\rtf1\ansi\deff0");
  sb.Append(@"{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}");
  sb.Append(@"{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fnil\fcharset0 Microsoft Sans Serif;}}");
  sb.Append(@"{\*\generator Msftedit 5.41.21.2510;}");
  sb.Append(@"\viewkind4\uc1\pard\sa200\sl276\slmult1\lang1033\ul\b\f0\fs20");
  sb.Append(@" Activated Partial Thromboplastin Time\b0 : Collected:8/21/2012 4:15:00 AM\par");
  sb.Append(@"\trowd\trgaph108\trleft-108\trbrdrl\brdrs\brdrw10 \trbrdrt\brdrs\brdrw10");
  sb.Append(@" \trbrdrr\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trpaddl108\trpaddr108\trpaddfl3\trpaddfr3");
  sb.Append(@"\clbrdrl\brdrw10\brdrs\clbrdrt\brdrw10\brdrs\clbrdrr\brdrw10\brdrs\clbrdrb\brdrw10\brdrs");
  sb.Append(@" \cellx4680\clbrdrl\brdrw10\brdrs\clbrdrt\brdrw10\brdrs\clbrdrr\brdrw10\brdrs\clbrdrb\brdrw10\brdrs");
  sb.Append(@" \cellx9468\pard\intbl\ulnone Actived Partial Thromboplastin Time");
  sb.Append(@" \cell\pard\intbl\qr 36.8 Seconds\cell\row\pard\sa200\sl276\slmult1\par");
  sb.Append(@"\pard\f2\fs17\par");
  sb.Append(@"}");

  return sb.ToString();
}

ご覧のとおり、RTFコードはかなりおしゃべりになる可能性があります。これにより、太字と下線付きのテキスト行が作成され、次にセルが境界線で囲まれた2列のテーブルが作成され、2番目のセルが右揃えになります。

于 2012-08-28T12:42:03.947 に答える