【问题标题】:wpLicese Page check if ScrollBars position is max (Inno Setup)wpLicese 页面检查 ScrollBars 位置是否为最大值(Inno Setup)
【发布时间】:2012-05-15 15:53:21
【问题描述】:

是否可以在 Inno Setup 的 wpLicense 页面中检查 ScrollBar 的位置,而无需编写自定义备忘录页面?

例如

procedure CurPageChanged(CurPageID: Integer);
 begin

     if CurPageID = wpLicense then
        WizardForm.LicenseAcceptedRadio.Enabled := False;
        WizardForm.LicenseNotAcceptedRadio.Enabled := False;

     if ScrollBar.Position := ScrollBar.Max then
        WizardForm.LicenseAcceptedRadio.Enabled := True;
        WizardForm.LicenseNotAcceptedRadio.Enabled := True;
  end;

【问题讨论】:

    标签: position scrollbar inno-setup


    【解决方案1】:

    无法直接访问这些滚动条,但是您可以通过这种方式使用 GetScrollInfo 函数:

    [code]
    const
      SB_VERT = 1;
      SIF_RANGE = 1;
      SIF_POS = 4;
      SIF_PAGE = 2;
    
    type
      TScrollInfo = record
        cbSize: UINT;
        fMask: UINT;
        nMin: Integer;
        nMax: Integer;
        nPage: UINT;
        nPos: Integer;
        nTrackPos: Integer;
      end;
    
    function GetScrollInfo(hWnd: HWND; BarFlag: Integer; 
      var ScrollInfo: TScrollInfo): BOOL;
      external 'GetScrollInfo@user32.dll stdcall';
    
    procedure CurPageChanged(CurPageID: Integer);
    var
      ScrollInfo: TScrollInfo;
    begin
      if CurPageID = wpLicense then
      begin
        ScrollInfo.cbSize := SizeOf(ScrollInfo);
        ScrollInfo.fMask := SIF_RANGE or SIF_POS or SIF_PAGE;
        if GetScrollInfo(WizardForm.LicenseMemo.Handle, SB_VERT, ScrollInfo) then
          if ScrollInfo.nPos = ScrollInfo.nMax - ScrollInfo.nPage then
            MsgBox('You are at the end of the license!', mbInformation, MB_OK);
      end;
    end;
    

    【讨论】:

    • 我只是想问一下。很容易用 CallBack 包装函数以重复检查时间。但是在这种状态下,您必须根据许可证文件设置长度。这可能会很棘手,因为例如Windows 中的字体 DPI。
    • 我不确定我是否收到您的最后评论,但这应该与 DPI 无关(因为备忘录本身会为您执行此操作)。并且LicenseMemo 已准备好使用,因为InitializeWizard 事件触发。
    【解决方案2】:

    这就是我现在所拥有的。它有效,但是如果您发现任何问题,请说我喜欢 cmets。

    procedure OnScrollPosition(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
      SysTime: DWORD);
      var
        ScrollInfo: TScrollInfo;
    begin
      ScrollInfo.cbSize := SizeOf(ScrollInfo);
      ScrollInfo.fMask := SIF_RANGE or SIF_POS or SIF_PAGE;
        if GetScrollInfo(WizardForm.LicenseMemo.Handle, SB_VERT, ScrollInfo) then
           if ScrollInfo.nPos = ScrollInfo.nMax - ScrollInfo.nPage then
              begin
                WizardForm.LicenseAcceptedRadio.Enabled := True;
                WizardForm.LicenseNotAcceptedRadio.Enabled := True;
              end;
    end;
    
    procedure ScrollPosition();
    var
      TimerCallback: LongWord;
    begin
      TimerCallback := WrapTimerProc(@OnScrollPosition, 4);
      TimerID := SetTimer(0, 0, 500, TimerCallback);
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    var
      ScrollInfo: TScrollInfo;
    begin
       if CurPageID = wpInstalling then
         StartSlideTimer
       else
         KillSlideTimer;
    if CurPageID = wpLicense then
      WizardForm.LicenseAcceptedRadio.Enabled := False;
      WizardForm.LicenseNotAcceptedRadio.Enabled := False;
      ScrollPosition
    end;
    

    【讨论】:

    • 实际上你想让用户只在他们阅读许可时才接受许可。 InnoSetup 不支持重定向WndProc 是一种伤害。你可以很容易地捕捉到WM_VSCROLL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多