注册 登录
编程论坛 VFP论坛

话说,VFP有无可用/好用/易用的“Markdown编辑框”控件?

cssnet 发布于 2025-06-14 14:59, 2395 次点击
我拿这问题请教DeepSeek,结果,它审慎地建议我,倒不如换一种现代的、流行的编程语言。
用VFP实现Markdown控件,性价比太低,不划算。
大意是。


准确地下一个定义:
===================
Markdown编辑框控件,指的是一种可以实时渲染MD标记,并可任意编辑当中文字的“标记文本编辑框”控件;必要时,可一键切换至“源码RAW模式”,以便修改MD标记;并可一键切换回“实时渲染格式文档模式”,继续编辑格式文档。
===================
其实,在线版的Markdown编辑器,大多正是如此这般东东。只不过,许多Markdown编辑器是一左一右两个窗口,左边源码,右边预览而已。那样子实现太笨拙了!试想,若richtextbox控件,也像这样子分左、右两栏:左边编辑RTF源码,右边显示RTF渲染效果,VFP或VB6程序,还能好好地用richtextbox控件去取代Editbox控件,展示格式并编辑格式文本么?

我们需要的,就是这样一个可简单地取代Richtextbox或Editbox控件的MdTextbox控件啊——

凡是原先用Richtextbox的表单,都可以删除这个Richtextbox,改换成MdTextbox,实现几乎一样的业务逻辑;
凡是原先用Editbox的表单,都可以删除这个Editbox,改换成MdTextbox,实现几乎一样的业务逻辑;
甚至,凡是原先用Textbox的表单,都可以删除这个Textbox,改换成MdTextbox,实现几乎一样的业务逻辑。



MD的好处是,傻瓜都能看懂!
因为本质上,MD只是“纯TXT文本 + 简单几种格式标记”,阅读MD源码,跟阅读TXT,最终用户的阅读体验,差别并不大,甚至几乎可忽略不计。
这么说半天,有些抽象。咱不妨作一个“样本对照实验”:
你用记事本分别打开一份MD源码,和一份RTF源码,分别阅读试试!



[此贴子已经被作者于2025-6-16 11:25编辑过]

59 回复
#52
cssnet2025-07-19 15:33
以下是引用cssnet在2025-7-18 21:59:44的发言:
一旦嵌入的 word 失去焦点(比如,点击表单以外的区域,甚至是点击 word 以外的表单内的其他控件或空白区域),word 文字工作区就会一片灰白;原来输入到 word 的文字,都变得不再可见……


针对此问题,DeepSeek 给出的方案,真的很有意思,哈哈哈哈!也算得上是脑洞大开!不知哪位天才想出来的!——

方法3:内存位图缓存(最稳定方案)
* -------------------------
* 声明API
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER CreateCompatibleBitmap IN gdi32 INTEGER hdc, INTEGER nWidth, INTEGER nHeight
DECLARE INTEGER BitBlt IN gdi32 ;
    INTEGER hDestDC, INTEGER x, INTEGER y, INTEGER nWidth, INTEGER nHeight, ;
    INTEGER hSrcDC, INTEGER xSrc, INTEGER ySrc, INTEGER dwRop

* 在失去焦点时截屏保存
PROCEDURE oleWord.LostFocus
    LOCAL hDC, hBmp
    hDC = CreateCompatibleDC(0)
    hBmp = CreateCompatibleBitmap(hDC, THIS.Width, THIS.Height)
    = BitBlt(THISFORM.picCache.hDC, 0, 0, THIS.Width, THIS.Height, ;
             THIS.hDC, 0, 0, 0x00CC0020)  && SRCCOPY
    THISFORM.lNeedRedraw = .T.
ENDPROC

* 在Paint事件中恢复图像
PROCEDURE oleWord.Paint
    IF THISFORM.lNeedRedraw
        = BitBlt(THIS.hDC, 0, 0, THIS.Width, THIS.Height, ;
                 THISFORM.picCache.hDC, 0, 0, 0x00CC0020)
    ENDIF
ENDPROC

* 专业级效果:实现类似Visual Studio代码编辑器的"僵尸视图"效果
* -------------------------

想想,还真 TM 有可能会奏效咧!
#53
wcx_cc2025-07-19 17:19
51楼说的情况,不知道是采用哪种方式运行?可能打开的方式或嵌入方法有不合适的?
#54
cssnet2025-07-19 17:42
以下是引用wcx_cc在2025-7-19 17:19:16的发言:

51楼说的情况,不知道是采用哪种方式运行?可能打开的方式或嵌入方法有不合适的?


因为你50楼说的是“word 嵌入表单内”,就找了一段【嵌入】的代码来测试,如下。不知你平时用的何种方式嵌入 word 对象?能否列前边几句生成 word 对象的代码来看看?

oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**************************************************
*-- Form:         form1 (e:\vfp\test\Test1.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*
DEFINE CLASS form1 AS form

    Top = 20
    Left = 20
    Height = 700
    Width = 1440
    ShowWindow = 2
    DoCreate = .T.
    AutoCenter = .T.
    Caption = "将word直接嵌入VFP表单中"
    Name = "Form1"

    PROCEDURE Init
        WITH THISFORM
            .ADDOBJECT('oWordDoc','OleControl','Word.Document')
            .oWordDoc.LEFT = 0
            .oWordDoc.TOP = 0
            .oWordDoc.HEIGHT = .HEIGHT
            .oWordDoc.WIDTH = .WIDTH
            .oWordDoc.VISIBLE =  .T.
            * 这一句比较古老,可能不是必须 .oWordDoc.DOVERB(0)
        ENDWITH
    ENDPROC

ENDDEFINE
*
*-- EndDefine: form1
**************************************************

#55
cssnet2025-07-19 20:05
我知道,常规的作法是:

MyWord=CreateObject('Word.Application')
MyWord.Visible=.T.
MyWord.Documents.Add
……

只是那样一来,Word是一个独立窗口,若是最大化或者放在屏幕的某一个角落,那还好说;可若是放在屏幕正中间,四周被其他VFP原生控件所环绕——比如说,窗体布局像个“回”字,中间是word,四周是别人——那么,界面设计就极其困难了!我实在想不出有什么办法,能够协调好word窗口与其他VFP控件的布局关系。

故而,THISFORM.AddObject("oleWord", "OLEControl", "Word.Document"),这样子嵌入Word文档对象,是最最方便处理的方式。只是如此一来,Word瞬间变得好脆弱,好敏感,如同一只弱不禁风的小猫,一有风吹草动就消失无影踪。

呵呵。
#56
wcx_cc2025-07-19 22:17
只有本站会员才能查看附件,请 登录

是不是要这种效果? 纯VFP 的,没有任何第三方插件

[此贴子已经被作者于2025-7-19 22:23编辑过]

#57
cssnet2025-07-19 22:40
以下是引用wcx_cc在2025-7-19 22:17:07的发言:

是不是要这种效果? 纯VFP 的,没有任何第三方插件


很漂亮!留意到你右半边的 Word 未获得焦点时,文字并未消失,这间接证明了 DeepSeek 给出的方案有其可行性。
我虽不太乐意放置一个 Timer 去实时监测 Word 的焦点状况,只不过既然你能做出来,那就勉为其难也试试呗!
#58
cssnet2025-07-20 09:18
其实 DeepSeek 一开始给出的方案,就是用一个 Timer 间隔500毫秒实时监测 Word 的焦点,一旦失去焦点,便立刻抢夺焦点,并刷新Word对象的显示。当时我想都没想就拒绝了,事关,在我的表单上已有一个 Timer 间隔500毫秒正实时监测着别的控件,两个 Timer,我怕它们分赃不匀会干架!接着,DeepSeek 这才挖空心思,给出了另外一堆奇奇怪怪、脑洞大开的解决方案。其中,“屏幕截图方案”令我老人家叹为观止!

Timer 实时监测 Word 的焦点方案,还有一个必要前提:表单上没有其他文字输入控件。观察56楼,恰好他的表单上也没有其他TextBox或EditBox。因为若表单中还存在其他文字输入框的话,焦点抢夺将导致其他文字框控件无法做一个安静的美男子,无法顺畅地输入文字。

我试着协调一下,将两个 Timer 合而为一,或许就可以再试试 DeepSeek 最初给出的方案了。
#59
wcx_cc2025-07-20 11:10
word页面显示,与焦点在哪里没有任何关系。没有timer处理。form内可以放入2个以上的word同时轮番输入,相互之间没有任何影响的。没有其他额外处理,完全等同于多个edite 同页面输入。
#60
cssnet2025-07-20 13:24
以下是引用wcx_cc在2025-7-20 11:10:40的发言:

word页面显示,与焦点在哪里没有任何关系。没有timer处理。form内可以放入2个以上的word同时轮番输入,相互之间没有任何影响的。没有其他额外处理,完全等同于多个edite 同页面输入。


这话题开始变得有点儿意思了。先前无意中看到一篇《精通在VFP中调用WORD的方法.doc》,好像是针对Word 2003的,也没正儿八经实践过。其实,一边聊Word,一边暗暗考虑的是,能否将“Word”替代为类似“Typora”那样的文档。

毕竟,但凡用过了Typora,谁还稀罕Word啊!

我明白的,技术细节你不方便透露,没关系,随便聊聊就成。

12