| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2151 人关注过本帖, 1 人收藏
标题:为没有TooltipText属性的控件,模拟出一个Tooltips提示框
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
tooltips是Windows标准控件,Windows标准控件用CreateWindow创建,返回的就是控件句柄。
用CreateWindow创建一个tooltips_class32类型窗体就是,相当于创建了一个tooltips控件实例。
操作是向tooltips发消息,不同的消息参数和数据执行不同的动作。
搜索一下“tooltips_class32”应该有好多可参考。



2023-03-23 10:44
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在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;
    }
2023-03-23 11:01
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用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编辑过]

2023-03-23 14:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
确要 hInstance 的,可以用API GetCurrentProcess() 获取
2023-03-23 14:23
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2023-3-23 14:20:25的发言:
CreateWindowExW()是支持宽字符串和扩展样式的窗口……


大侠果然是大侠,目光如炬!
确实,楼主搞搞阵冇帮衬,折腾了一大圈,想要静鸡鸡顺手解决掉的,也正是Unicode版的TooltipText。
若纯是ANSI版的话,可能也没那么大的兴致了。
2023-03-23 15:07
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:789
专家分:1165
注 册:2021-10-13
收藏
得分:0 
以前收藏的一段代码,你可以改一下,拿去用!
程序代码:
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编辑过]

收到的鲜花
  • cssnet2023-03-25 15:43 送鲜花  1朵   附言:非常感谢大侠无私分享!
2023-03-23 19:26
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用sam_jiang在2023-3-23 19:26:33的发言:

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


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

2023-03-23 21:08
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1730
专家分:3324
注 册:2012-2-29
收藏
得分:0 
回复 16楼 sam_jiang
学习啦,谢谢!
2023-03-24 05:36
shonken
Rank: 2
等 级:论坛游民
帖 子:116
专家分:26
注 册:2017-1-15
收藏
得分:0 
这个怎么分行、怎么换底色?

以下是引用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

2023-03-24 12:06
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:789
专家分:1165
注 册:2021-10-13
收藏
得分:0 
回复 19楼 shonken
分行显示提示内容? 这很容易实现,把显示的内容分为“...”+chr(13)+“...”,就可以了。

要改变标签的背景色,会比较麻烦,好像要用sendmessage发送一个WM_PAINT消息给标签,或是用updatewindow来实现,我对这个sendmessage不太熟悉,可能你需要@吹水佬的帮助,他对api比较熟悉。。。
2023-03-25 09:15
快速回复:为没有TooltipText属性的控件,模拟出一个Tooltips提示框
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031801 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved