| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2152 人关注过本帖, 1 人收藏
标题:为没有TooltipText属性的控件,模拟出一个Tooltips提示框
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
结帖率:100%
收藏(1)
 问题点数:0 回复次数:29 
为没有TooltipText属性的控件,模拟出一个Tooltips提示框
感谢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编辑过]

搜索更多相关主题的帖子: Integer String 控件 VFP 提示 
2023-03-23 00:32
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
其中最最最关键的代码,主要是这几句:
程序代码:
        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编辑过]

2023-03-23 00:38
pvm2000
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:180
专家分:312
注 册:2022-12-22
收藏
得分:0 
很能钻研
2023-03-23 03:26
pvm2000
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:180
专家分:312
注 册:2022-12-22
收藏
得分:0 
很能钻研
2023-03-23 03:38
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用pvm2000在2023-3-23 03:26:45的发言:
很能钻研


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

遂斗胆发帖子求助。毕竟,熟悉API调用的大侠众多,撸起袖子,三下五除二拿下,估计也是极有可能的。
2023-03-23 06:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
空手而来的习惯不好

坚守VFP最后的阵地
2023-03-23 07:42
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:707
专家分:2833
注 册:2018-3-13
收藏
得分:0 
1. 完全可以
2. 实例句柄你传 0 给它也没什么问题,假如你精益求精的话,也可以取出来:
#define GWL_HINSTANCE    -6
hInstance= GetWindowLong(_vfp.hWnd, GWL_HINSTANCE)

这家伙很懒,啥也没留下
2023-03-23 08:07
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:447
专家分:582
注 册:2013-5-14
收藏
得分:0 
以下是引用cssnet在2023-3-23 06:52:51的发言:



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

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

个人觉得等研究透了,原来发现就是这么回事,用API看来比纯VFP代码(做个窗体mouse进显示,出消失)高大上一些!复杂的问题简单做!而不是搞得更复杂。。。。。,不喜勿喷。。。。。。。
2023-03-23 08:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
就是用Tips的方法显示本文。
Tips是Windows一个特殊窗体控件,类名为:tooltips_class32(在Commctrl定义)。
可用CreateWindow函数创建,Windows定义了一组以 TTM_ 开头的消息用来与之通信。
2023-03-23 09:53
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:789
专家分:1165
注 册:2021-10-13
收藏
得分:0 
API函数的问题找吹水老准没错
2023-03-23 10:24
快速回复:为没有TooltipText属性的控件,模拟出一个Tooltips提示框
数据加载中...
 
   



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

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