我正在使用 NSIS(Nullsoft 脚本安装系统)开发安装程序并遇到问题。我的目标是更改应用程序中表单的大小,但是当表单大小超过用户的屏幕分辨率时,部分表单无法正确呈现。
问题:
当我使用SetWindowPos函数更改表单的大小时,如果表单大小大于屏幕分辨率,则屏幕区域之外的表单部分似乎根本没有被渲染。
例如,如果用户的屏幕分辨率设置为 800x600,则使用提供的代码后,表单不会按预期调整为 900x800。相反,不会从表单的一侧渲染 100 个像素,而从另一侧渲染 200 个像素。
代码:
这是我正在使用的 NSIS 代码:
System::Call 'user32::SetWindowPos(i$HWNDPARENT,i,i,i,i 900,i 800,i 0x16)'
我面临的问题:
1-部分表单未渲染: 当我将表单尺寸设置为大于屏幕分辨率时,似乎显示区域之外的表单部分根本未渲染。
2-大小和位置设置:即使我使用SetWindowPos并确保参数设置正确,问题仍然存在。
问题:
是否有解决方案可以确保表单的所有部分(甚至可见屏幕区域之外的部分)都能正确呈现?我是否应该更改 NSIS 中的任何特定设置或参数来解决此问题?
;-----------------
!include "MUI2.nsh"
!include "x64.nsh"
!include "WinMessages.nsh"
;-----------------
;-----------------
Var nsDialogs
Var BTN_QUIT
;-----------------
;-----------------
Page Custom Custom_Page_Show
;-----------------
Function Custom_Page_Show
;-----------------
MoveAnywhere::Hook
;-----------------
System::Call 'user32::SetWindowLong(i $HWNDPARENT,i -16,i 339871820)'
;-----------------
System::Call 'user32::SetWindowPos(i$HWNDPARENT,i,i,i,i 1400,i 1024,i 0x16)'
nsDialogs::Create 1044
Pop $nsDialogs
SetCtlColors $nsDialogs 0x000000 0xfafafa
System::Call 'USER32::MoveWindow(p$nsDialogs,i0,i0,i 1400,i 1024,i1)'
;-----------------
;-----------------
${NSD_CreateButton} 100 17 100 29 "QUIT"
Pop $BTN_QUIT
CreateFont $0 "Myriad Pro" 20 700
SendMessage $BTN_QUIT ${WM_SETFONT} $0 1
SetCtlColors $BTN_QUIT 0xffffff 0x015f72
${NSD_OnClick} $BTN_QUIT BTN_QUIT_Click
;-----------------
;-----------------
${NSD_CreateButton} 1200 17 100 29 "CLOSE"
Pop $BTN_QUIT
CreateFont $0 "Myriad Pro" 20 700
SendMessage $BTN_QUIT ${WM_SETFONT} $0 1
SetCtlColors $BTN_QUIT 0xffffff 0x015f72
${NSD_OnClick} $BTN_QUIT BTN_QUIT_Click
;-----------------
;-----------------
nsDialogs::Show
;-----------------
FunctionEnd
Function BTN_QUIT_Click
;-----------------
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Bye!!"
SendMessage $HWNDPARENT ${WM_CLOSE} 0 0
Quit
;-----------------
FunctionEnd
Section
SectionEnd
在提供的代码中,我将页面大小设置为1400 X 1024。如果Windows中的显示分辨率设置为大于此值,则显示整个程序窗体,并且QUIT和CLOSE两个按钮也被显示可见。
但是,如果Windows中的显示分辨率设置为小于程序中定义的值(例如800 X 600),则程序窗体将根据显示分辨率(在本例中为800 X 600)进行渲染。 在此输入图片描述
使用以下代码时会出现此问题:
System::Call 'user32::SetWindowLong(i $HWNDPARENT,i -16,i 339871820)'
此代码用于删除程序的标题栏。我进行了广泛的调查,但未能解决问题。