Inno自定义界面学习笔记(二)之拖动窗口
上一篇讲了如何去除默认窗口的控件。它的效果是这样的
这样不仅空,而且鼠标还不能拖动。我们现在要添加拖动的效果。
思路
重载OnMouseDown事件的支持,当用户在点击鼠标时,导向我们自己的procedure。
因为Inno5.5之后,WizardForm不再支持OnMouseDown, 所以首先我们要先创建一个Label覆盖窗口,再将label设置为透明,由Label来重载OnMouseDown。
这其中要用到一个系统api: ReleaseCapture。ReleaseCapture是系统api,inno要使用,就要先声明这个api。
声明一个系统调用的api
使用的方法也很简单:
function ReleaseCapture() : longint; external 'ReleaseCapture@user32.dll stdcall';
这样,我们就可以在Inno脚本中使用ReleaseCapture。相似的,我们也可以这样声明 KillTimer,ReleaseDC ,BitBlt 等Windows API 。这便是 inno 可以 自定义界面的技术基础。
实现
我们使用如下代码,便可以实现窗口拖动:
//代码区
[Code]
//变量声明区域
var
label_wizardform_main:TLabel;//声明一个TLabel类型的标签
//声明系统调用
function ReleaseCapture() : longint; external 'ReleaseCapture@user32.dll stdcall';
//鼠标点击回调
procedure wizardform_on_mouse_down(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture
SendMessage(WizardForm.Handle, $112, $F012, 0);
end;
//函数声明:
//重载安装程序初始化函数(和上边那个不一样),进行初始化操作
procedure InitializeWizard();
begin
//窗口分为几个区域,一个是内围(中间大部靠左),一个是外围(靠右部分),一个下部(高度较小的一个区域)
WizardForm.InnerNotebook.Hide(); //隐藏内嵌的提示文字
WizardForm.OuterNotebook.Hide(); //隐藏外围的提示文字
WizardForm.Bevel.Hide(); //bevel是斜面的意思。但在此处是内外围与下部的分界线
WizardForm.BorderStyle:=bsnone;//隐藏边框
label_wizardform_main := TLabel.Create(WizardForm);
with label_wizardform_main do
begin
Parent := WizardForm;
AutoSize := False;
Left := 0;
Top := 0;
ClientWidth := WizardForm.ClientWidth;
ClientHeight := WizardForm.ClientHeight;
Caption := '';
Transparent := TRUE;
OnMouseDown := @wizardform_on_mouse_down;
end;
说明1
在语句 : SendMessage(WizardForm.Handle, $112, $F012, 0); 中 $112是 WM_SYSCOMMAND的16进制,$F012是 SC_MOVE | HTCAPTION
(详细原因,可以参看 请问SendMessage(wm_syscommand,0xf012,0)是什么意思?-CSDN论坛)
这些都是系统定义的值
#define WM_SYSCOMMAND 0x0112
#define SC_MOVE 0xF010
#define HTCAPTION 2
说明2
label_wizardform_main := TLabel.Create(WizardForm);
with label_wizardform_main do
begin
Parent := WizardForm;
AutoSize := False;
Left := 0;
Top := 0;
ClientWidth := WizardForm.ClientWidth;
ClientHeight := WizardForm.ClientHeight;
Caption := '';
Transparent := TRUE;
OnMouseDown := @wizardform_on_mouse_down;
end;