2012-06-03 94 views
2

我正在使用Inno Setup構建安裝,並且正在使用組件部分來允許最終用戶選擇要安裝的可選項目。Inno Setup組件的詳細描述

其中一些項目需要更長的描述才能讓用戶有足夠的信息來智能地選擇它們。

有沒有辦法在某處添加更深入的描述?

+0

有沒有空間來放置例如與組件嚮導頁上擴展描述標籤。另一個選擇可能是使用提示,但不幸的是,你不能獲得懸停物品,並且沒有鼠標移動的事件,所以它只能用於物品點擊,什麼是混淆。如果你設計一個你想象組件嚮導頁面的截圖,把它包含到問題中。 – TLama

+1

在Inno中不是本地的,但看到[DescriptiveTypes.isi](http://www.mirality.co.nz/inno.php)腳本。這應該是可修改的以顯示'[Components]'描述。 – Deanna

回答

0

使用this advanced compiler(下載鏈接在下面的某處)。

它支持比標準編譯器更多的類和事件。您可以訪問屬性「OnItemMouseMove」。使用此功能,您可以存儲由標籤顯示的每個項目的說明。這裏有一個例子:

var 
CompLabel: TLabel; 

procedure OnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea); 
begin 
    case Index of 
    0: CompLabel.Caption := 'This is the description of Component 1'; 
    1: CompLabel.Caption := 'This is the description of Component 2'; 
    2: CompLabel.Caption := 'This is the description of Component 3'; 
    3: CompLabel.Caption := 'This is the description of Component 4' 
    else 
    CompLabel.Caption := 'Move your mouse over a component to see its description.'; 
    end; 
end; 

procedure OnMouseLeave(Sender: TObject); 
begin 
    CompLabel.Caption := 'Move your mouse over a component to see its description.'; 
end; 

procedure InitializeWizard(); 
begin 
    CompLabel := TLabel.Create(WizardForm); 
    CompLabel.Parent := WizardForm.SelectComponentsPage; 
    CompLabel.SetBounds(WizardForm.ComponentsList.Left,180,WizardForm.ComponentsList.Width,200); 
    CompLabel.Caption := 'Move your mouse over a component to see its description.'; 
    WizardForm.ComponentsList.OnItemMouseMove := @OnItemMouseMove; 
    WizardForm.ComponentsList.OnMouseLeave := @OnMouseLeave; 
    WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height - 40; 
end; 
2

此解決方案僅使用Inno Setup的正確和InnoCallback DLL libraryInnoCallback.dll)(不包括可疑起源的創新安裝的過時的第三方版本)。

該解決方案部分基於我對Inno Setup: OnHover event的回答。

根據您的需要調整HoverComponentChanged程序。

使用Unicode版本的Inno Setup。

[Files] 
Source: InnoCallback.dll; Flags: dontcopy 

[Code] 

var 
    LastMouse: TPoint; 
    CompLabel: TLabel; 

type 
    TTimerProc = procedure(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 

function GetCursorPos(var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 
function SetTimer(
    hWnd: longword; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; 
    external '[email protected] stdcall'; 
function ScreenToClient(hWnd: HWND; var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 
function ClientToScreen(hWnd: HWND; var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 
function ListBox_GetItemRect(
    const hWnd: HWND; const Msg: Integer; Index: LongInt; var Rect: TRect): LongInt; 
    external '[email protected] stdcall'; 

const 
    LB_GETITEMRECT = $0198; 
    LB_GETTOPINDEX = $018E; 

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; 
    external '[email protected]:InnoCallback.dll stdcall'; 

function FindControl(Parent: TWinControl; P: TPoint): TControl; 
var 
    Control: TControl; 
    WinControl: TWinControl; 
    I: Integer; 
    P2: TPoint; 
begin 
    for I := 0 to Parent.ControlCount - 1 do 
    begin 
    Control := Parent.Controls[I]; 
    if Control.Visible and 
     (Control.Left <= P.X) and (P.X < Control.Left + Control.Width) and 
     (Control.Top <= P.Y) and (P.Y < Control.Top + Control.Height) then 
    begin 
     if Control is TWinControl then 
     begin 
     P2 := P; 
     ClientToScreen(Parent.Handle, P2); 
     WinControl := TWinControl(Control); 
     ScreenToClient(WinControl.Handle, P2); 
     Result := FindControl(WinControl, P2); 
     if Result <> nil then Exit; 
     end; 

     Result := Control; 
     Exit; 
    end; 
    end; 

    Result := nil; 
end; 

function PointInRect(const Rect: TRect; const Point: TPoint): Boolean; 
begin 
    Result := (Point.X >= Rect.Left) and (Point.X <= Rect.Right) and 
    (Point.Y >= Rect.Top) and (Point.Y <= Rect.Bottom); 
end; 

function ListBoxItemAtPos(ListBox: TCustomListBox; Pos: TPoint): Integer; 
var 
    Count: Integer; 
    ItemRect: TRect; 
begin 
    Result := SendMessage(ListBox.Handle, LB_GETTOPINDEX, 0, 0); 
    Count := ListBox.Items.Count; 
    while Result < Count do 
    begin 
    ListBox_GetItemRect(ListBox.Handle, LB_GETITEMRECT, Result, ItemRect); 
    if PointInRect(ItemRect, Pos) then Exit; 
    Inc(Result); 
    end; 
    Result := -1; 
end; 

procedure HoverComponentChanged(Index: Integer); 
var 
    Description: string; 
begin 
    case Index of 
    0: Description := 'This is the description of Main Files'; 
    1: Description := 'This is the description of Additional Files'; 
    2: Description := 'This is the description of Help Files'; 
    else 
    Description := 'Move your mouse over a component to see its description.'; 
    end; 
    CompLabel.Caption := Description; 
end; 

procedure HoverTimerProc(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 
var 
    P: TPoint; 
    Control: TControl; 
    Index: Integer; 
begin 
    GetCursorPos(P); 
    if P <> LastMouse then { just optimization } 
    begin 
    LastMouse := P; 
    ScreenToClient(WizardForm.Handle, P); 

    if (P.X < 0) or (P.Y < 0) or 
     (P.X > WizardForm.ClientWidth) or (P.Y > WizardForm.ClientHeight) then 
    begin 
     Control := nil; 
    end 
     else 
    begin 
     Control := FindControl(WizardForm, P); 
    end; 

    Index := -1; 
    if (Control = WizardForm.ComponentsList) and 
     (not WizardForm.TypesCombo.DroppedDown) then 
    begin 
     P := LastMouse; 
     ScreenToClient(WizardForm.ComponentsList.Handle, P); 
     Index := ListBoxItemAtPos(WizardForm.ComponentsList, P); 
    end; 

    HoverComponentChanged(Index); 
    end; 
end; 

procedure InitializeWizard(); 
var 
    HoverTimerCallback: LongWord; 
begin 
    HoverTimerCallback := WrapTimerProc(@HoverTimerProc, 4); 

    SetTimer(0, 0, 50, HoverTimerCallback); 

    CompLabel := TLabel.Create(WizardForm); 
    CompLabel.Parent := WizardForm.SelectComponentsPage; 
    CompLabel.Left := WizardForm.ComponentsList.Left; 
    CompLabel.Width := WizardForm.ComponentsList.Width; 
    CompLabel.Height := ScaleY(32); 
    CompLabel.Top := 
    WizardForm.ComponentsList.Top + WizardForm.ComponentsList.Height - CompLabel.Height; 
    CompLabel.AutoSize := False; 
    CompLabel.WordWrap := True; 

    WizardForm.ComponentsList.Height := 
    WizardForm.ComponentsList.Height - CompLabel.Height - ScaleY(8); 
end; 

enter image description here

+0

這與這個問題有什麼關係?請發佈一個單獨的問題。 –