我已经使用richtext.RichTextCtrl
和wxPython 2.8.12.1
创建了RTF编辑器(Python 2.7
)。通过使用PyRTFParser
,我实现了一些RTF内容和图像的处理。它还支持RTF和图像的复制粘贴。
问题是所有客户端数据库都包含使用VB 6 RichText control
存储的RTF数据。当我将这些数据加载到我的RichTextCtrl
中时,它不支持表,失去一些格式和项目符号,并显示图像错误(Windows Meta File)。
我必须提供可以将数据库(使用VB 6 RichText control
存储)中的旧数据显示到wxPython
中的功能。wx.TextCtrl
提供TE_RICH
和TE_RICH2
工具,但不提供检索RTF内容的方法。它也不支持图像。
考虑以下几点:
这是我要从中复制内容的单词文档。
这是VB 6 RichText control
中的粘贴结果。
这是在wx.TextCtrl
中用TE_RICH2
粘贴的结果。提供更好的表格,但没有图像。
这是richtext.RichTextCtrl
中的粘贴结果。表数据混乱,格式丢失。
有什么解决方案可以支持wx.TextCtrl
中的图像以及获得RTF内容形式吗?
还是有什么方法可以直接在VB 6 RichText control
中使用wxpython
?
RTF内容示例(存储在数据库中):
{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fprq2\fcharset2 Symbol;}{\f3\froman\fprq2\fcharset0 Cambria;}{\f4\fnil\fcharset0 MS Sans Serif;}}
{\colortbl ;\red0\green0\blue0;\red151\green72\blue7;\red54\green95\blue145;}
{\stylesheet{ Normal;}{\s1 heading 1;}}
\viewkind4\uc1\trowd\trgaph108\trleft-15\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\pard\intbl\ltrpar\sl276\slmult1\cf1\b\f0\fs24 Categor Limits\cell\cf0\b0\f1\fs20\row
\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\pard\intbl\ltrpar\sl276\slmult1\cf2\b\f0\fs22 Lower Limit\cell Sales Category\cell\cf0\b0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 0\cell Poor\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 1000\cell Average\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 5000\cell Good\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 7000\cell Excellent\cell\cf0\f1\fs20\row
\pard\ltrpar\sa200\sl276\slmult1\f0\fs22
\par \pard\ltrpar\fi-360\li720\sa200\sl276\slmult1\f2\'b7\tab\f0 Item 1
\par \f2\'b7\tab\f0 Item 2
\par \pard\ltrpar\keep\keepn\s1\sb480\sl276\slmult1\cf3\b\f3\fs28 Colorful Text here\'85
\par \pard\ltrpar\cf0\b0\f4\fs17
\par }
最佳答案
VB6是ANSI RTF。即没有UNICODE。它也很旧,已经发布了许多较新的版本。
这是访问较新版本的方法。它创建一个RTF窗口,发送消息以获取COM接口,然后通过TOM(文本对象模型)使用它。
Ret = LoadLibrary("c:\windows\system32\MSFTEDIT.dll")
If Ret = 0 Then MsgBox "Load Lib " & Err.LastDllError
Flags = WS_CHILD + WS_HSCROLL + WS_VSCROLL + WS_VISIBLE + ES_MULTILINE + ES_AUTOHSCROLL + ES_AUTOVSCROLL + ES_NOHIDESEL + ES_WANTRETURN
Dim barray() As Byte
barray = "RICHEDIT50W" & vbNullChar
gRtfHwnd = CreateWindowEx(WS_EX_ACCEPTFILES + WS_EX_CLIENTEDGE, barray(0), "", Flags, 0, 0, ScaleX(Me.ScaleWidth, vbTwips, vbPixels), ScaleY(Me.ScaleHeight, vbTwips, vbPixels), Me.hWnd, vbNull, App.hInstance, vbNull)
Ret = SendMessageByVal(gRtfHwnd, EM_SETTEXTMODE, TM_MULTILEVELUNDO + TM_PLAINTEXT + TM_MULTICODEPAGE, 0)
If GetTextMode(gRtfHwnd) <> 41 Then MsgBox "get Text mode = " & GetTextMode(gRtfHwnd)
Ret = SendMessageByVal(gRtfHwnd, EM_SETEDITSTYLE, SES_ALLOWBEEPS + SES_USECRLF, SES_ALLOWBEEPS + SES_USECRLF)
Ret = SendMessageByVal(gRtfHwnd, EM_SETLANGOPTIONS, IMF_None, IMF_None)
If GetTextMode(gRtfHwnd) <> 41 Then MsgBox "get Text mode (2) = " & GetTextMode(gRtfHwnd)
Ret = SendMessageByVal(gRtfHwnd, EM_SETTYPOGRAPHYOPTIONS, TO_None, TO_None)
'Below is the default anyway with CreateWin flags spec above
Ret = SendMessageByVal(gRtfHwnd, EM_SETOPTIONS, ECO_AUTOHSCROLL + ECO_AUTOVSCROLL + ECO_NOHIDESEL + ECO_WANTRETURN, ECOOP_OR)
Dim ParaFormat As ITextPara
Dim FontFormat As ITextFont
Ret = SendMessageAny(gRtfHwnd, EM_GETOLEINTERFACE, 0, TomObj)
Set TomDoc = TomObj
关于python - 在wxPython中使用VB 6 RichText控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26316194/