Inno setup TLabel或TNewStaticText-焦点上的change.Font.Style,就像光标随.Cursor变化一样

Inno setup TLabel或TNewStaticText-焦点上的change.Font.Style,就像光标随.Cursor变化一样,inno-setup,onfocus,tlabel,Inno Setup,Onfocus,Tlabel,是否可以更改焦点TLabel或TNewStaticText上的.Font.Style,就像使用.cursor时光标一样 目前在Inno设置中没有内置的跟踪鼠标悬停的功能。然而,通过截取控件的窗口过程,您可以自己跟踪它。对于以下示例,您将需要该库: [设置] AppName=我的程序 AppVersion=1.5 DefaultDirName={pf}\My程序 OutputDir=userdocs:Inno设置示例输出 [档案] 来源:“InnoCallback.dll”;DestDir:“{t

是否可以更改焦点
TLabel
TNewStaticText
上的
.Font.Style
,就像使用
.cursor
时光标一样

目前在Inno设置中没有内置的跟踪鼠标悬停的功能。然而,通过截取控件的窗口过程,您可以自己跟踪它。对于以下示例,您将需要该库:

[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
OutputDir=userdocs:Inno设置示例输出
[档案]
来源:“InnoCallback.dll”;DestDir:“{tmp}”;标志:dontcopy
[守则]
#ifdef UNICODE
#定义AW“W”
#否则
#定义“A”
#恩迪夫
常数
GWL_WNDPROC=-4;
WM_MOUSEMOVE=$0200;
类型
WPARAM=UINT_PTR;
LPARAM=长型;
LRESULT=LongInt;
TWindowProc=函数(hwnd:hwnd;uMsg:UINT;wParam:wParam;
lParam:lParam):LRESULT;
函数SetCapture(hWnd:hWnd):hWnd;
外部的SetCapture@user32.dllstdcall';
函数释放捕获:BOOL;
外部的ReleaseCapture@user32.dllstdcall';
函数GetMessagePos:DWORD;
外部的GetMessagePos@user32.dllstdcall';
函数GetWindowRect(hWnd:hWnd;out-lpRect:TRect):BOOL;
外部的GetWindowRect@user32.dllstdcall';
函数CallWindowProc(lpPrevWndFunc:LongInt;hWnd:hWnd;Msg:UINT;
wParam:wParam;lParam:lParam):LRESULT;
外部“CallWindowProc{#AW}@user32.dll stdcall”;
函数SetWindowLong(hWnd:hWnd;nIndex:Integer;
dwNewLong:LongInt):LongInt;
外部“SetWindowLong{#AW}@user32.dll stdcall”;
函数WrapWindowProc(回调:TWindowProc;ParamCount:Integer):长单词;
外部的wrapcallback@files:InnoCallback.dll stdcall';
类型
TControlRec=记录
悬停:布尔;//悬停状态
WndProc:LongInt;//原始窗口程序
控件:TWinControl;//控制实例
结束;
变量
StaticText1:TNewStaticText;
StaticText2:TNewStaticText;
ControlList:TControlRec的数组;
//通过句柄查找控件的助手函数
函数GetControlRec(句柄:HWND):TControlRec;
变量
I:整数;
开始
对于I:=0到高(控制器)do
如果ControlList[I].Control.Handle=Handle,则
开始
结果:=控制器[I];
出口
结束;
结束;
//将拦截窗口过程附加到控件的函数
//并创建控制记录并将其添加到控制列表中
程序附件WndProc(控件:TWinControl;WindowProc:TWindowProc);
开始
SetArrayLength(控制器,GetArrayLength(控制器)+1);
控制员[高(控制员)]。悬停:=假;
控制员[高(控制员)]。控制:=控制;
控制器列表[高(控制器列表)].WndProc:=SetWindowLong(控制.Handle,
GWL_WNDPROC,WrapWindowProc(WindowProc,4));
结束;
//函数将windows过程还原到列表中的所有控件
程序恢复;
变量
I:整数;
开始
对于I:=0到高(控制器)do
SetWindowLong(ControlList[I].Control.Handle,GWL_WNDPROC,ControlList[I].WNDPROC);
结束;
//helper函数,用于根据GetMessagePos的结果创建TPoint结构
//函数调用
函数生成点(值:DWORD):TPoint;
开始
结果.X:=值和$FFFF;
结果Y:=值shr 16;
结束;
//帮助函数,它替代了我没有使用的PtInRect Windows API函数
//由于某种原因能够导入
函数PointInRect(const-Rect:TRect;const-Point:TPoint):布尔;
开始

结果:=(Point.X>=Rect.Left)和(Point.X=Rect.Top)和(Point.Y对我来说,下面的命令:
High(ControlList)
给我以下错误:未知标识符“High”,我相信
High
它只适用于Unicode Inno???(如果我错了请纠正我:-)


我用
GetArrayLength(ControlList)-1

替换了
High(ControlList)
,使它工作起来了。请发表评论-只是否决投票无助于解决问题。这正是我想要实现的,我希望它不会是一个简单的函数:-)谢谢!是否可以将此函数附加到
TBitmapImage
?否,因为
TBitmapImage
tgraphic控件的后代,它没有消息泵,因为它不是窗口控件(没有
句柄和窗口进程)。此脚本中的
AttachWndProc
方法允许您仅传递能够执行此操作的控件,即
TWinControl
子体。其余的被脚本编译器拒绝。是的,我一直在处理Unicode Inno设置。没有合理的理由在2014年使用ANSI one;)