注册 登录
编程论坛 VFP论坛

为没有TooltipText属性的控件,模拟出一个Tooltips提示框

cssnet 发布于 2023-03-23 00:32, 2681 次点击
感谢sam_jiang大侠贴出了VFP代码,详见16#:

程序代码:

Show_Tips('提示标签测试','这个是一个用API在VFP下直接建立的提示标签!','3000')  
********************************
*!*        原程序来至行者
*!*        修改:自由的风
*!*        原程序地址:http://hi.baidu.com/myvfp/blog/item/21434a00eb66c403738b651d.html
********************************
Function Show_Tips
        Lparameters toTitle,TipStr,cTime  &&提示标题,提示内容,显示时间
        Declare Integer CreateWindowEx In user32 Integer,String,String,Integer,Integer,Integer,;
                INTEGER,Integer,Integer,Integer,Integer,Integer
        Declare Integer SendMessage In user32 Integer,Integer,Integer,String @
        Declare Integer SendMessage In user32 As SendMessageLong Integer,Integer,Integer,Integer
        Declare Integer GetWindowLong In user32 Integer,Integer
        Declare Integer DestroyWindow In user32 Integer HWnd
        Declare Integer StrDup In shlwapi String @
        Declare Sleep In kernel32 Integer dwMilliseconds
        Declare SHORT GetCursorPos In user32 String @
        WM_USER = 0x400
        TTS_NOPREFIX = 0x2
        TTF_TRANSPARENT = 0x100
        TTM_ADDTOOLA = (WM_USER + 4)
        TTM_ACTIVATE = WM_USER + 1
        TTM_SETTITLE = (WM_USER + 32)
        TTS_BALLOON = 0x40
        TTS_ALWAYSTIP = 0x1
        TTF_SUBCLASS = 0x10
        TTF_IDISHWND = 0x1
        TTS_CLOSE=0x80
        TTM_TRACKPOSITION = WM_USER + 18
        TTM_TRACKACTIVATE=WM_USER + 17
        TTM_SETTITLEA=(WM_USER+32)
        TTF_TRACK =0x20
        Orientation=0&&调整箭头方向,0朝上,1朝下
        TOOLTIPS_CLASSA = "tooltips_class32"
        hParentHWnd=0
        hInstance=GetWindowLong(hParentHWnd,-6)
        TipStrhMem= StrDup(@TipStr)
        mSize=BinToC(44,'4rs')
        If Orientation=0
                mFlags=BinToC(Bitor(TTF_IDISHWND,TTF_TRANSPARENT,TTF_TRACK),'4rs')
        Else
                mFlags=BinToC(TTF_IDISHWND+TTF_TRANSPARENT+TTF_SUBCLASS,'4rs')
        Endif
        mhwnd=BinToC(hParentHWnd,'4rs')
        mId=BinToC(hParentHWnd,'4rs')
        mRect=Replicate(0h00000000,4)
        mInstance=BinToC(hInstance,'4rs')
        mStr=BinToC(TipStrhMem,'4rs')
        mlParam=BinToC(0,'4rs')
        TIPINFO=mSize+mFlags+mhwnd+mId+mRect+mInstance+mStr+mlParam
        lnStyle=TTF_IDISHWND+TTF_TRANSPARENT+TTF_TRACK+TTS_BALLOON+TTS_CLOSE
        lTTHwnd=CreateWindowEx(0,TOOLTIPS_CLASSA,Null,lnStyle,0,0,0,0,0,0,0,0)
        SendMessage(lTTHwnd,TTM_ADDTOOLA,0,@TIPINFO)
        SendMessage(lTTHwnd,TTM_SETTITLEA,1,@toTitle)
        If Orientation=0
                POINTAPI=Replicate(Chr(0),8)
                GetCursorPos(@POINTAPI)
                x=CToBin(Substr(POINTAPI,1,4),'4rs')
                Y=CToBin(Substr(POINTAPI,5,4),'4rs')
                SendMessageLong(lTTHwnd,TTM_TRACKPOSITION,0,Bitlshift(Y-15,16)+X-5)
                SendMessage(lTTHwnd, TTM_TRACKACTIVATE,1,@TIPINFO)
        Endif
        If Val(Alltrim(cTime))>0
                Sleep(Val(cTime))
                If lTTHwnd>0
                        DestroyWindow(lTTHwnd)
                Endif
        Endif
Endfunc


(附:原帖提到了几个问题,不过,现在既已有了VFP源码,也就不再重要了——

先前从网上复制了一段VB6代码,毕竟从未正经摸过VB6,单凭经验去看,有几点看不太分明:

1、GetHWndForToolTip()估计是递归找出顶层容器控件的句柄吧,能否无视之并剔除之,改为直接采用表单的hWnd?只因VFP的普通控件,似乎没有控件句柄。
2、API函数CreateWindowExW()的调用参数似乎有些复杂,从未在VFP中用过,乍一看头皮发麻,其中App.hInstance,是否大致对应于_screen.hWnd之类吧?
3、若不考虑icon、WrapTextLength、ForeColor、BackColor、baloon style……等等特效,在VB6中模拟生成一个Tooltip提示框似乎非常简单,无非也就两步:

首先,CreateWindowExW()创建Tooltip框,
紧接着,填充好TOOLINFO结构,通过SendMessageLong()传递过去,设置好相关属性即可。)


[此贴子已经被作者于2023-3-25 15:50编辑过]

29 回复
#2
cssnet2023-03-23 00:38
其中最最最关键的代码,主要是这几句:
程序代码:

        lTTHwnd=CreateWindowEx(0,TOOLTIPS_CLASSA,Null,lnStyle,0,0,0,0,0,0,0,0)
        SendMessage(lTTHwnd,TTM_ADDTOOLA,0,@TIPINFO)
        SendMessage(lTTHwnd,TTM_SETTITLEA,1,@toTitle)
        If Orientation=0
                POINTAPI=Replicate(Chr(0),8)
                GetCursorPos(@POINTAPI)
                x=CToBin(Substr(POINTAPI,1,4),'4rs')
                Y=CToBin(Substr(POINTAPI,5,4),'4rs')
                SendMessageLong(lTTHwnd,TTM_TRACKPOSITION,0,Bitlshift(Y-15,16)+X-5)
                SendMessage(lTTHwnd, TTM_TRACKACTIVATE,1,@TIPINFO)
        Endif



[此贴子已经被作者于2023-3-25 15:51编辑过]

#3
pvm20002023-03-23 03:26
很能钻研
#4
pvm20002023-03-23 03:38
很能钻研
#5
cssnet2023-03-23 06:52
以下是引用pvm2000在2023-3-23 03:26:45的发言:
很能钻研


大哥取笑了,只因mouseMove缺了快捷提示框,被投诉了,这才满世界搜解决方案。虽不熟vb6,仍勉为其难硬啃生肉。迷迷糊糊看过几遍,才发觉,真正实现起来并不复杂,只缺几个关键细节没看明白而已。

遂斗胆发帖子求助。毕竟,熟悉API调用的大侠众多,撸起袖子,三下五除二拿下,估计也是极有可能的。
#6
sdta2023-03-23 07:42
空手而来的习惯不好
#7
csyx2023-03-23 08:07
1. 完全可以
2. 实例句柄你传 0 给它也没什么问题,假如你精益求精的话,也可以取出来:
#define GWL_HINSTANCE    -6
hInstance= GetWindowLong(_vfp.hWnd, GWL_HINSTANCE)
#8
iswith2023-03-23 08:21
以下是引用cssnet在2023-3-23 06:52:51的发言:



大哥取笑了,只因mouseMove缺了快捷提示框,被投诉了,这才满世界搜解决方案。虽不熟vb6,仍勉为其难硬啃生肉。迷迷糊糊看过几遍,才发觉,真正实现起来并不复杂,只缺几个关键细节没看明白而已。

遂斗胆发帖子求助。毕竟,熟悉API调用的大侠众多,撸起袖子,三下五除二拿下,估计也是极有可能的。

个人觉得等研究透了,原来发现就是这么回事,用API看来比纯VFP代码(做个窗体mouse进显示,出消失)高大上一些!复杂的问题简单做!而不是搞得更复杂。。。。。,不喜勿喷。。。。。。。
#9
吹水佬2023-03-23 09:53
就是用Tips的方法显示本文。
Tips是Windows一个特殊窗体控件,类名为:tooltips_class32(在Commctrl定义)。
可用CreateWindow函数创建,Windows定义了一组以 TTM_ 开头的消息用来与之通信。
#10
sam_jiang2023-03-23 10:24
API函数的问题找吹水老准没错
#11
吹水佬2023-03-23 10:44
tooltips是Windows标准控件,Windows标准控件用CreateWindow创建,返回的就是控件句柄。
用CreateWindow创建一个tooltips_class32类型窗体就是,相当于创建了一个tooltips控件实例。
操作是向tooltips发消息,不同的消息参数和数据执行不同的动作。
搜索一下“tooltips_class32”应该有好多可参考。



#12
cssnet2023-03-23 11:01
以下是引用吹水佬在2023-3-23 10:44:06的发言:
tooltips是Windows标准控件,Windows标准控件用CreateWindow创建,返回的就是控件句柄。
用CreateWindow创建一个tooltips_class32类型窗体就是,相当于创建了一个tooltips控件实例。
操作是向tooltips发消息,不同的消息参数和数据执行不同的动作。
搜索一下“tooltips_class32”应该有好多可参考。


非常感谢吹版耐心细致的指导!
转头我试试将顶楼VB代码对译成VFP代码看看。
感觉上,无非是小心地调试好这一句:

hwndTT = CreateWindowExW(0&, StrPtr(TOOLTIPS_CLASS), 0&, lWinStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0&, 0&, App.hInstance, 0&)

至于结构tagTOOLINFO,老办法,简单以字符串填充好就成了:

typedef struct tagTOOLINFO{
    UINT cbSize;
    UINT uFlags;
    HWND hwnd;
    UINT uId;
    RECT rect;
    HINSTANCE hinst;
    LPTSTR lpszText;
    }
#13
吹水佬2023-03-23 14:20
以下是引用cssnet在2023-3-23 11:01:53的发言:

感觉上,无非是小心地调试好这一句:

hwndTT = CreateWindowExW(0&, StrPtr(TOOLTIPS_CLASS), 0&, lWinStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0&, 0&, App.hInstance, 0&)

CreateWindowExW()是支持宽字符串和扩展样式的窗口,VFP对宽字符不感兴趣,且扩展样式用的是0&,这样的话用CreateWindow()应该就可以(简单点)。
CreateWindow的参数看似复杂,主要的无非就是窗口类、窗口样式、窗口大小。

[此贴子已经被作者于2023-3-23 14:27编辑过]

#14
吹水佬2023-03-23 14:23
确要 hInstance 的,可以用API GetCurrentProcess() 获取
#15
cssnet2023-03-23 15:07
以下是引用吹水佬在2023-3-23 14:20:25的发言:
CreateWindowExW()是支持宽字符串和扩展样式的窗口……


大侠果然是大侠,目光如炬!
确实,楼主搞搞阵冇帮衬,折腾了一大圈,想要静鸡鸡顺手解决掉的,也正是Unicode版的TooltipText。
若纯是ANSI版的话,可能也没那么大的兴致了。
#16
sam_jiang2023-03-23 19:26
以前收藏的一段代码,你可以改一下,拿去用!
程序代码:

Show_Tips('提示标签测试','这个是一个用API在VFP下直接建立的提示标签!','3000')  
********************************
*!*        原程序来至行者
*!*        修改:自由的风
*!*        原程序地址:http://hi.baidu.com/myvfp/blog/item/21434a00eb66c403738b651d.html
********************************
Function Show_Tips
        Lparameters toTitle,TipStr,cTime  &&提示标题,提示内容,显示时间
        Declare Integer CreateWindowEx In user32 Integer,String,String,Integer,Integer,Integer,;
                INTEGER,Integer,Integer,Integer,Integer,Integer
        Declare Integer SendMessage In user32 Integer,Integer,Integer,String @
        Declare Integer SendMessage In user32 As SendMessageLong Integer,Integer,Integer,Integer
        Declare Integer GetWindowLong In user32 Integer,Integer
        Declare Integer DestroyWindow In user32 Integer HWnd
        Declare Integer StrDup In shlwapi String @
        Declare Sleep In kernel32 Integer dwMilliseconds
        Declare SHORT GetCursorPos In user32 String @
        WM_USER = 0x400
        TTS_NOPREFIX = 0x2
        TTF_TRANSPARENT = 0x100
        TTM_ADDTOOLA = (WM_USER + 4)
        TTM_ACTIVATE = WM_USER + 1
        TTM_SETTITLE = (WM_USER + 32)
        TTS_BALLOON = 0x40
        TTS_ALWAYSTIP = 0x1
        TTF_SUBCLASS = 0x10
        TTF_IDISHWND = 0x1
        TTS_CLOSE=0x80
        TTM_TRACKPOSITION = WM_USER + 18
        TTM_TRACKACTIVATE=WM_USER + 17
        TTM_SETTITLEA=(WM_USER+32)
        TTF_TRACK =0x20
        Orientation=0&&调整箭头方向,0朝上,1朝下
        TOOLTIPS_CLASSA = "tooltips_class32"
        hParentHWnd=0
        hInstance=GetWindowLong(hParentHWnd,-6)
        TipStrhMem= StrDup(@TipStr)
        mSize=BinToC(44,'4rs')
        If Orientation=0
                mFlags=BinToC(Bitor(TTF_IDISHWND,TTF_TRANSPARENT,TTF_TRACK),'4rs')
        Else
                mFlags=BinToC(TTF_IDISHWND+TTF_TRANSPARENT+TTF_SUBCLASS,'4rs')
        Endif
        mhwnd=BinToC(hParentHWnd,'4rs')
        mId=BinToC(hParentHWnd,'4rs')
        mRect=Replicate(0h00000000,4)
        mInstance=BinToC(hInstance,'4rs')
        mStr=BinToC(TipStrhMem,'4rs')
        mlParam=BinToC(0,'4rs')
        TIPINFO=mSize+mFlags+mhwnd+mId+mRect+mInstance+mStr+mlParam
        lnStyle=TTF_IDISHWND+TTF_TRANSPARENT+TTF_TRACK+TTS_BALLOON+TTS_CLOSE
        lTTHwnd=CreateWindowEx(0,TOOLTIPS_CLASSA,Null,lnStyle,0,0,0,0,0,0,0,0)
        SendMessage(lTTHwnd,TTM_ADDTOOLA,0,@TIPINFO)
        SendMessage(lTTHwnd,TTM_SETTITLEA,1,@toTitle)
        If Orientation=0
                POINTAPI=Replicate(Chr(0),8)
                GetCursorPos(@POINTAPI)
                x=CToBin(Substr(POINTAPI,1,4),'4rs')
                Y=CToBin(Substr(POINTAPI,5,4),'4rs')
                SendMessageLong(lTTHwnd,TTM_TRACKPOSITION,0,Bitlshift(Y-15,16)+X-5)
                SendMessage(lTTHwnd, TTM_TRACKACTIVATE,1,@TIPINFO)
        Endif
        If Val(Alltrim(cTime))>0
                Sleep(Val(cTime))
                If lTTHwnd>0
                        DestroyWindow(lTTHwnd)
                Endif
        Endif
Endfunc


[此贴子已经被作者于2023-3-23 19:28编辑过]

#17
cssnet2023-03-23 21:08
以下是引用sam_jiang在2023-3-23 19:26:33的发言:

以前收藏的一段代码,你可以改一下,拿去用!
Show_Tips('提示标签测试','这个是一个用API在VFP下直接建立的提示标签!','3000')  
……


非常感谢!赶紧复制回家,好好钻研。
大侠一出手,直接省掉了啃生肉将VB6对译成VFP的大麻烦,大困难!

#18
schtg2023-03-24 05:36
回复 16楼 sam_jiang
学习啦,谢谢!
#19
shonken2023-03-24 12:06
这个怎么分行、怎么换底色?

以下是引用sam_jiang在2023-3-23 19:26:33的发言:

以前收藏的一段代码,你可以改一下,拿去用!

Show_Tips('提示标签测试','这个是一个用API在VFP下直接建立的提示标签!','3000')  
********************************
*!*        原程序来至行者
*!*        修改:自由的风
*!*        原程序地址:http://hi.baidu.com/myvfp/blog/item/21434a00eb66c403738b651d.html
********************************
Function Show_Tips
        Lparameters toTitle,TipStr,cTime  &&提示标题,提示内容,显示时间
        Declare Integer CreateWindowEx In user32 Integer,String,String,Integer,Integer,Integer,;
                INTEGER,Integer,Integer,Integer,Integer,Integer
        Declare Integer SendMessage In user32 Integer,Integer,Integer,String @
        Declare Integer SendMessage In user32 As SendMessageLong Integer,Integer,Integer,Integer
        Declare Integer GetWindowLong In user32 Integer,Integer
        Declare Integer DestroyWindow In user32 Integer HWnd
        Declare Integer StrDup In shlwapi String @
        Declare Sleep In kernel32 Integer dwMilliseconds
        Declare SHORT GetCursorPos In user32 String @
        WM_USER = 0x400
        TTS_NOPREFIX = 0x2
        TTF_TRANSPARENT = 0x100
        TTM_ADDTOOLA = (WM_USER + 4)
        TTM_ACTIVATE = WM_USER + 1
        TTM_SETTITLE = (WM_USER + 32)
        TTS_BALLOON = 0x40
        TTS_ALWAYSTIP = 0x1
        TTF_SUBCLASS = 0x10
        TTF_IDISHWND = 0x1
        TTS_CLOSE=0x80
        TTM_TRACKPOSITION = WM_USER + 18
        TTM_TRACKACTIVATE=WM_USER + 17
        TTM_SETTITLEA=(WM_USER+32)
        TTF_TRACK =0x20
        Orientation=0&&调整箭头方向,0朝上,1朝下
        TOOLTIPS_CLASSA = "tooltips_class32"
        hParentHWnd=0
        hInstance=GetWindowLong(hParentHWnd,-6)
        TipStrhMem= StrDup(@TipStr)
        mSize=BinToC(44,'4rs')
        If Orientation=0
                mFlags=BinToC(Bitor(TTF_IDISHWND,TTF_TRANSPARENT,TTF_TRACK),'4rs')
        Else
                mFlags=BinToC(TTF_IDISHWND+TTF_TRANSPARENT+TTF_SUBCLASS,'4rs')
        Endif
        mhwnd=BinToC(hParentHWnd,'4rs')
        mId=BinToC(hParentHWnd,'4rs')
        mRect=Replicate(0h00000000,4)
        mInstance=BinToC(hInstance,'4rs')
        mStr=BinToC(TipStrhMem,'4rs')
        mlParam=BinToC(0,'4rs')
        TIPINFO=mSize+mFlags+mhwnd+mId+mRect+mInstance+mStr+mlParam
        lnStyle=TTF_IDISHWND+TTF_TRANSPARENT+TTF_TRACK+TTS_BALLOON+TTS_CLOSE
        lTTHwnd=CreateWindowEx(0,TOOLTIPS_CLASSA,Null,lnStyle,0,0,0,0,0,0,0,0)
        SendMessage(lTTHwnd,TTM_ADDTOOLA,0,@TIPINFO)
        SendMessage(lTTHwnd,TTM_SETTITLEA,1,@toTitle)
        If Orientation=0
                POINTAPI=Replicate(Chr(0),8)
                GetCursorPos(@POINTAPI)
                x=CToBin(Substr(POINTAPI,1,4),'4rs')
                Y=CToBin(Substr(POINTAPI,5,4),'4rs')
                SendMessageLong(lTTHwnd,TTM_TRACKPOSITION,0,Bitlshift(Y-15,16)+X-5)
                SendMessage(lTTHwnd, TTM_TRACKACTIVATE,1,@TIPINFO)
        Endif
        If Val(Alltrim(cTime))>0
                Sleep(Val(cTime))
                If lTTHwnd>0
                        DestroyWindow(lTTHwnd)
                Endif
        Endif
Endfunc

#20
sam_jiang2023-03-25 09:15
回复 19楼 shonken
分行显示提示内容? 这很容易实现,把显示的内容分为“...”+chr(13)+“...”,就可以了。

要改变标签的背景色,会比较麻烦,好像要用sendmessage发送一个WM_PAINT消息给标签,或是用updatewindow来实现,我对这个sendmessage不太熟悉,可能你需要@吹水佬的帮助,他对api比较熟悉。。。
#21
cssnet2023-03-25 10:46
以下是引用sam_jiang在2023-3-25 09:15:43的发言:
要改变标签的背景色,会比较麻烦,好像要用sendmessage发送一个WM_PAINT消息给标签,或是用updatewindow来实现,我对这个sendmessage不太熟悉,可能你需要@吹水佬的帮助,他对api比较熟悉。。。


不得不敲敲小黑板!顶楼的VB6代码就有前景、背景色的代码好吧:

    ' Colors.
    If lForeColor <> -1 Then SendMessage hwndTT, TTM_SETTIPTEXTCOLOR, lForeColor, 0&
    If lBackColor <> -1 Then SendMessage hwndTT, TTM_SETTIPBKCOLOR, lBackColor, 0&
    '

#22
吹水佬2023-03-25 12:29
以下是引用sam_jiang在2023-3-25 09:15:43的发言:

分行显示提示内容? 这很容易实现,把显示的内容分为“...”+chr(13)+“...”,就可以了。

要改变标签的背景色,会比较麻烦,好像要用sendmessage发送一个WM_PAINT消息给标签,或是用updatewindow来实现,我对这个sendmessage不太熟悉,可能你需要@吹水佬的帮助,他对api比较熟悉。。。

这个windows标准控件有一套专用的控制消息,可以参考MS的文档资料:

Windows控件
https://learn.

Windows控件/控件库/工具提示/工具提示控件参考/工具提示控制消息
https://learn.

只有本站会员才能查看附件,请 登录
#23
sam_jiang2023-03-25 13:09
鍥炲? 21妤
鏀瑰ぉ绌轰簡缈昏瘧鐪嬬湅
#24
吹水佬2023-03-25 19:38
以下是引用cssnet在2023-3-23 15:07:43的发言:

确实,楼主搞搞阵冇帮衬,折腾了一大圈,想要静鸡鸡顺手解决掉的,也正是Unicode版的TooltipText。
若纯是ANSI版的话,可能也没那么大的兴致了。

用VFP封装Windows全部标准控件,VFP的Unicode就不是问题了。好像 Delphi VCL 的 TWinControl 类,也是封装Windows的标准控件。
#25
csyx2023-03-25 19:59
以下是引用吹水佬在2023-3-25 19:38:01的发言:
用VFP封装Windows全部标准控件,VFP的Unicode就不是问题了。好像 Delphi VCL 的 TWinControl 类,也是封装Windows的标准控件。

不是问题吗?只不过能勉强支持输出而已,其他问题仍然大着,源码不能用unicode编码保存就是问题,即使换个编辑器可以保存unicode编码格式的源码,调试器支持吗?build 支持吗?
#26
吹水佬2023-03-25 20:41
以下是引用csyx在2023-3-25 19:59:15的发言:
不是问题吗?只不过能勉强支持输出而已,其他问题仍然大着,源码不能用unicode编码保存就是问题,即使换个编辑器可以保存unicode编码格式的源码,调试器支持吗?build 支持吗?

个人理解:
VFP的unicode问题是相对的,主要是数据I/O部份,能解决实际应用问题就算不是问题了。
在此也只是针对Windows标准控件而言,其他的不能用Windows标准控件的就另当别论。
VFP源码和编译无需使用unicode编码。
调试器I/O部份可以通过一些调试手段解决。
当然了,既然要求变,想百份百忠诚VFP原意是不可能的,不破不立。

说归说,做归做。
VFP要真像Delphi那样封装Windows控件不是说到就能做得到,能做得到也不一定能做得好。
Delphi与MFC的封装不同,Delphi的数据感知封装初给人的感觉很好,但当数据规模大到一定时性能大大下降的缺点就可能令人难以接受。





#27
csyx2023-03-25 20:55
六年前,从我开始学习使用vfp开始,每个人的电脑上就有一整套的 Microsoft Forms 2.0 基本控件,全部支持 unicode,可是 vfp 不支持 unicode 一直都还是被诟病的主要原因,并没有因为有这些支持 unicode 的控件而消失
没有底层支持,这类修修补补对 vfp coder 来说,unicode I/O 实现就是一件丑陋和痛苦的事情

[此贴子已经被作者于2023-3-25 20:59编辑过]

#28
吹水佬2023-03-25 21:17
今时今日对VFP就不能要求太多了,VFP不可能再现当初的光彩,能活下去才是硬道理。
那怕是能解决一个小小的unicode的Tooltips提示问题,也算是给VFP注入一点新鲜空气,丑陋就不见得,痛苦一点又算什么。
#29
cssnet2023-03-25 22:07
以下是引用吹水佬在2023-3-25 19:38:01的发言:
好像 Delphi VCL 的 TWinControl 类,也是封装Windows的标准控件。


不知今时今日,用Delphi的人,还多不多?
印象中,我老人家曾用Delphi 6/7编写过软件,Delphi的效率很高,但是……编译出来的软件,好像总会随机地遇到一些莫名其妙的错误,总是给我一种错觉:
我说,是不是微软在操作系统底层暗地里搞鬼啊?Windows但凡监测到Delphi编译的软件,就随机地抛出各种异常来,让用户对Delphi敬而远之?
嗯……极有可能!

#30
吹水佬2023-03-26 10:54
以下是引用cssnet在2023-3-25 22:07:01的发言:

不知今时今日,用Delphi的人,还多不多?

Delphi自从被Borland出卖后就没有关注过。虽然也是被出卖,VFP的命运就悲惨。
Delphi被改名拆分后发展方向主要是多平台/跨平台移动开发。
当年国内的Delphi论坛(大富翁论坛)还真够热闹,那情景现在的编程论坛可能难再见到。

[此贴子已经被作者于2023-3-26 14:09编辑过]

1