2012-12-09 134 views
2

我想通过将BorderStyle设置为bsNone来制作具有自定义外观的安装程序并禁用了标题栏。如果标题栏被禁用,使Inno Setup WizardForm可移动

现在我不能再移动窗口了。我环顾四周,找到了Delphi的解决方案:
http://www.chami.com/tips/delphi/010397D.html

这可以在Inno Setup中完成吗?

我已经查阅了MSDN上的WM_NCHITTEST这个东西,但我无法弄清楚是否以及如何使这项工作。

编辑:环顾四周,编译它使用advanced compiler先进的编译器,我想出了这个,但它不起作用。它编译,但当我点击窗口内,我不能拖动它。

procedure Dragg(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    SendMessage(WizardForm.Handle, $F112, $F012, 0); 
end; 

procedure InitializeWizard(); 
begin 
    WizardForm.OnMouseDown := @Dragg; 
end; 

回答

4

没有办法处理消息或更改控件的WndProc。有一些机会实施无证拖动,如this post,但不幸的是,InnoSetup没有为脚本发布鼠标停止事件,所以如果没有一些外部库文件,那么你运气不好。


使用您提到的库和代码;您错过了ReleaseCapture函数调用。使用这个脚本代码,而不是(不要忘记,该向导形式的唯一裸露部分是左下):

[Code] 
function ReleaseCapture: BOOL; 
    external '[email protected] stdcall'; 

const 
    SC_DRAGMOVE = $F012; 
    WM_SYSCOMMAND = $0112; 

procedure OnMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    ReleaseCapture; 
    WizardForm.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0); 
end; 

procedure InitializeWizard; 
begin 
    WizardForm.OnMouseDown := @OnMouseDown; 
end; 
+1

这不是完全不可能,但这需要一个外部DLL的帮助下,子类主Inno窗口。这就是疯狂,和/或斯巴达。 – Miral

+0

@Miral,yup,这就是为什么我通过*没有一些外部库文件*结束这篇文章的原因* :-) – TLama

+0

哦,是的,我忘了提及我使用restools.hanzify.org上提供的advenced编译器,它能够处理鼠标停止事件以及标准编译器缺少的许多其他功能。它包含一个显示所有支持类的txt文件。你可以在这里得到它:http://restools.hanzify.org/article.asp?id=89 – user1662035