在 NSIS 中更改表单大小的问题:部分表单无法在较小的显示器上呈现

问题描述 投票:0回答:1

我正在使用 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 中的任何特定设置或参数来解决此问题?

nsis screen-resolution
1个回答
0
投票
;-----------------
        !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)'

此代码用于删除程序的标题栏。我进行了广泛的调查,但未能解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.