- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我found NoBugz ( Hans Passant ) 编写的一些旧代码,据我所知,它强制 richtextbox 使用 RTF 5.0 而不是 4.0。基本上它只是一个继承 RichTextBox
并重写 CreateParams
属性的类
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 提供的更漂亮的表格格式
更新
如果我改变数据显示
+ @"\trql\trgaph100\trrh280\trleft0\intbl"
到
+ @"\trql\trgaph100\trrh280\trleft0"
经过进一步测试,我发现 RTF 在 MS Word 中看起来不错。事实上,我们的代码使用 MsftEdit 生成 RTF,如下所示:
{\*\generator Msftedit 5.41.21.2510;}
。我在 Word 中打开实际的 RTF,它看起来不错。我使用这段代码,它与我在 word 中看到的非常匹配。我只需要删除一些边框。我将不得不做一些更深入的挖掘,以了解为什么 Msftedit 生成的 RTF 在表格中稍微对齐不当。但是,是的,总的来说,这个问题超出了我在 SO 中可以做的范围。
最佳答案
在代码中手工制作 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 代码可能会变得相当冗长。这创建了一行带有粗体和下划线的文本,然后是一个带有边框单元格的双列表,第二个单元格右对齐。
关于c# - 当我覆盖 CreateParams 时,RichTextBox 不显示所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148731/
我正在尝试将 Sqllite 内存数据库与 ServiceStack 一起运行。 Visual Studio .net 4.6.1 中的控制台应用程序 (如果我在 LinqPad 中运行相同的代码,它
我想避免应用程序面板中的闪烁,在4个月前进行谷歌搜索之后,在尝试子类化面板之后,在此处询问两三次之后,在其他论坛询问之后......没有人有解决方案,但今天我在最后一个答案中奇迹般地找到了解决方案:I
我正在动态创建一个覆盖 CreateParams 的表单,以便我可以将其显示在任务栏上。从动态创建的表单中,我调用 TColorDialog,但一旦显示,我的表单将进入 MainForm 下方,而 C
以前,当我想创建一个点击表单时,我是 tempted to use platform invokes to set the extended window styles (user32.dll 中的G
我正在尝试此操作,但出现错误ADODB.Recordset错误'800a0e78'关闭对象时不允许操作。在带有此代码的行If ScopeID.EOF Then 请不要回答使用CreateParam方法
我found NoBugz ( Hans Passant ) 编写的一些旧代码,据我所知,它强制 richtextbox 使用 RTF 5.0 而不是 4.0。基本上它只是一个继承 RichTextB
完整的源代码可以在这里找到: http://www.eyeClaxton.com/download/delphi/SkinProject.zip 我正在尝试创建一个没有“标题或边框”的皮肤表单,但仍然
在我继承并迁移到 XE5 的一些遗留 D7 代码中,我发现了下面的代码。 注释指出,如果它是从非 WinControl 创建的,它会欺骗 Windows 认为它是子窗体。代码库中有一个地方调用 C
谁能解释一下它们之间的区别和关系 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
我是一名优秀的程序员,十分优秀!