PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]


Страниц : 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

Farser21
07-02-2015, 15:10
Dodakaedr, теперь код не может понять индефикатор GWL_EXSTYLE

Dodakaedr
07-02-2015, 15:15
теперь код не может понять индефикатор GWL_EXSTYLE »
попробуйте так обьявить

[code]
const
GWL_EXSTYLE = (-20);
WS_EX_COMPOSITED = $2000000;

MogilShik2007
07-02-2015, 15:32
Такс, вроде перелопатил в скрипте исдон 0.5 в 0.6, но терь исдон отказывается извлекаться, мож кто подскажет - http://rghost.ru/8ZdbkzBdh

Farser21
07-02-2015, 15:46
Dodakaedr, теперь Handle не понимает.
P.S. Это окно скрыть можно?
http://s020.radikal.ru/i723/1502/02/420e49f65432.png

Dodakaedr
07-02-2015, 16:06
теперь Handle не понимает. »
ну тогда не знаю.
P.S. Это окно скрыть можно? »
компонентам добавьте флаг disablenouninstallwarning

Farser21
07-02-2015, 16:21
Dodakaedr, спасибо за помощь.
Еще есть небольшой вопрос... Можно ли в окне компонентов сменить цвет\стиль\размер определенный надписи? Не все тексты в окне компонентов а например только заголовки.

MogilShik2007
07-02-2015, 16:34
Dodakaedr, спасибо за помощь.
Еще есть небольшой вопрос... Можно ли в окне компонентов сменить цвет\стиль\размер определенный надписи? Не все тексты в окне компонентов а например только заголовки. »

Можно через скрипт ReDrawText 1.5e, но если не шаришь, то не разберешься.

Dodakaedr
07-02-2015, 16:43
Можно ли в окне компонентов сменить цвет\стиль\размер определенный надписи? »
стиль можно так: procedure InitializeWizard();
begin
WizardForm.ComponentsList.ItemFontStyle[0] := [fsBold];
end;
а насчет цвета и размера не знаю, но хотел бы узнать))

Farser21
07-02-2015, 17:04
Dodakaedr, хм.. интересно, а можно ли менять стиль заданному тексту, ибо сейчас он сменился только в самой первой строке.

Dodakaedr
07-02-2015, 17:07
хм.. интересно, а можно ли менять стиль заданному тексту, ибо сейчас он сменился только в самой первой строке. »
указывайте по индексу... отсчет с 0 (нуля). 0=первая строка в компонент листе
procedure InitializeWizard();
begin
WizardForm.ComponentsList.ItemFontStyle[0] := [fsBold];
WizardForm.ComponentsList.ItemFontStyle[6] := [fsBold];
end;

MogilShik2007
07-02-2015, 17:10
Вот модуль работы с текстом, цвета, правка и т.д.

Dodakaedr
07-02-2015, 17:58
Вот модуль работы с текстом, цвета, правка и т.д. »
судя из примера должно работать, но увы...нет, для компонентов не подходит:#include "ReDrawText v.1.5e4.iss"

[Setup]
AppName=MyProgram
AppVerName=1.0
DefaultDirName={pf}\MyProgram
OutputDir=.


[Components]
Name: one; Description: "Компонент 1"; Types: full custom;
Name: one\two; Description: "Компонент 2"; Types: full custom;

[Code]

var
Label1: TLabel;
Label1Rdw: TRedrawedLabel;

procedure RedesignWizardForm;
begin
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Hint:=IntToStr($00FF00);
AutoSize:=False;
Parent := WizardForm.WelcomePage;
Alignment:=taCenter;
Left := ScaleX(216);
Top := ScaleY(256);
Width := ScaleX(40);
Height := ScaleY(14);
//звездочки удалите
Caption := '[*name=Verdana][*size=8][*i][*color=$FF0000]Крутая Игра[/color][/i][/size][/name]';
end;
Label1Rdw:= ReDrawText(Label1);
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
WizardForm.ComponentsList.ItemCaption[0] := Label1.Caption;
end;
[code]
type
TSize = record
cx: Longint;
cy: Longint;
end;
ABC = record
abcA: Integer;
abcB: UINT;
abcC: Integer;
end;
HDC = Longword;
HGDIOBJ = Longword;
TRedrawedLabel = record Base: TLabel; Parts, Shadow: array of Tlabel; end;
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif

const
FS_SOLID = $8;
FS_MINIMIZE = $10;

function GetTextExtentPoint32(DC: HDC; S: String; Len: Integer; var Size: TSize): Boolean; external 'GetTextExtentPoint32{#A}@gdi32.dll stdcall';
function GetTextExtentExPoint(DC: HDC; lpszStr: PChar; cchString, nMaxExtent: Integer; var lpnFit: Integer; alpDx: Integer; var lpSize: TSize): Boolean; external 'GetTextExtentExPoint{#A}@gdi32.dll stdcall';
function GetClientDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function ReleaseClientDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external 'SelectObject@gdi32.dll stdcall';
function SetRect(var lpRect: TRect; xLeft,yTop,xRight,yBottom: Integer): Boolean; external 'SetRect@user32.dll stdcall';
function InvalidateRect(hWnd: HWND; lpRect: TRect; bErase: BOOL): BOOL; external 'InvalidateRect@user32.dll stdcall';
function GetCharABCWidths(DC: HDC; uFirstChar, uLastChar: UINT; var lpAbc: ABC): Boolean; external 'GetCharABCWidths{#A}@gdi32.dll stdcall';

function FindSpace(s: string; Min, Max: Integer): Integer;
var n: integer;
begin
Result:= -1;
if (Max=0)or(s='') then Exit;
if Max>Length(S) then Max:=Length(S);
if Min<=0 then Min:=1;
if s[Max]=' ' then begin
Result:= Max;
Exit;
end;
for n:=Max downto min do begin
if s[n]=' ' then begin
Result:= n;
Break;
end;
end;
end;

function GetTextWidth(aFont: TFont; Text: String): Integer;
var DC: HDC; aSize: TSize; OldObj: Longword; abc1, abc2: ABC;
begin
DC:= GetClientDC(0);
try
if Text='' then Exit;
OldObj:= SelectObject(DC, aFont.Handle);
GetTextExtentPoint32(DC, PChar(Text), Length(Text), aSize);
GetCharABCWidths(DC, Ord(Text[1]), Ord(Text[1]), abc1);
GetCharABCWidths(DC, Ord(Text[Length(text)]), Ord(Text[Length(text)]), abc2);
Result:= aSize.cx;
if (Length(Text)<>1)and(aFont.Style + [fsItalic]=aFont.Style) then begin
if abc1.abcA<0 then Result:= Result-abc1.abcA;
if abc2.abcC<0 then Result:= Result-abc2.abcC
end;
finally
SelectObject(DC, OldObj);
ReleaseClientDC(0, DC);
end;
end;

function GetTextHeight(aFont: TFont; Text: String): Integer;
var DC: HDC; aSize: TSize; OldObj: Longword;
begin
DC:= GetClientDC(0);
try
OldObj:= SelectObject(DC, aFont.Handle);
GetTextExtentPoint32(DC, PChar(Text), Length(Text), aSize);
Result:= aSize.cy;
finally
SelectObject(DC, OldObj);
ReleaseClientDC(0, DC);
end;
end;

function GetTextLen(aFont: TFont; Text: String; MaxWidth: Integer): Integer;
var DC: HDC; aSize: TSize; OutLen: Integer; OldObj: Longword;
begin
DC:= GetClientDC(0);
try
OldObj:= SelectObject(DC, aFont.Handle);
GetTextExtentExPoint(DC, PChar(Text), Length(Text), MaxWidth, OutLen, 0, aSize);
Result:= OutLen;
finally
SelectObject(DC, OldObj);
ReleaseClientDC(0, DC);
end;
end;

function TrimEx(S: String): String;
begin
if S <> '' then begin
while (Length(S)>0)and(S[1]=' ') do Delete(S, 1, 1);
while (Length(S)>0)and(S[length(S)]= ' ') do Delete(S, Length(S), 1);
end;
Result:= S;
end;

procedure DestroyRWlabel(var Lbl: TRedrawedlabel);
var n: Integer; r: TRect;
begin
for n:=0 to GetArrayLength(Lbl.Shadow)-1 do Lbl.Shadow[n].Free;
for n:=0 to GetArrayLength(Lbl.Parts)-1 do Lbl.Parts[n].Free;
SetArrayLength(lbl.Shadow, 0);
SetArrayLength(lbl.Parts, 0);
if Lbl.Base <> nil then begin
SetRect(r, Lbl.Base.Left, Lbl.base.Top, Lbl.base.left+Lbl.Base.Width, Lbl.Base.Top+Lbl.Base.Height);
InvalidateRect(Lbl.Base.Parent.Handle, r, true);
end;
Lbl.Base:= nil;
end;

procedure ShowRWLabel(var Lbl: TRedrawedlabel);
var n: Integer;
begin
if Lbl.Base.Enabled then for n:=0 to getArraylength(Lbl.Shadow)-1 do Lbl.Shadow[n].Show;
for n:=0 to getArraylength(Lbl.Parts)-1 do Lbl.Parts[n].Show;
end;

procedure HideRWLabel(var Lbl: TRedrawedlabel);
var n: Integer;
begin
if Lbl.Base.Enabled then for n:=0 to getArraylength(Lbl.Shadow)-1 do Lbl.Shadow[n].Hide;
for n:=0 to getArraylength(Lbl.Parts)-1 do Lbl.Parts[n].Hide;
end;

procedure CopyFont(InFnt: TFont; var OutFont: TFont);
begin
OutFont.Height:= InFnt.Height;
OutFont.Name:= InFnt.Name;
OutFont.Pitch:= InFnt.Pitch;
OutFont.Size:= InFnt.Size;
OutFont.Style:= InFnt.Style;
OutFont.PixelsPerInch:= InFnt.PixelsPerInch;
OutFont.Color:= InFnt.Color;
end;

function ReDrawText(var Lbl: Tlabel): TRedrawedLabel;
var s, b: string; i, k, l, newline, aLeft, aTop, aWidth, aHeight, Space, TW,x: Integer;
Flags: Dword; tp1, tp2, tp3, tp4, minlen, lens: Integer; tags, et, ev: string; aFont: TFont;
begin
DestroyRWlabel(Result);
Result.Base:= lbl; aFont:= TFont.Create;
ALeft:=Lbl.Left; ATop:= LBL.Top; AWidth:=0; s:= Lbl.Caption; Space:= GetTextWidth(Lbl.Font, ' ');
repeat
s:=TrimEx(s); k:=Pos('[', s); Flags:=0; tags:=''; lens:= Length(S);
CopyFont(lbl.Font, aFont);
if k=1 then try
repeat
if (s='')or(s[1]<>'[')or((s[1]='[')and(s[2]='/')) then break;
tp1:=2; while (tp1<lenS)and(s[tp1]<>']') do tp1:=tp1+1;
tp2:=2; while (tp2<tp1)and(s[tp2]<>'=') do tp2:=tp2+1;
et:= copy(s, 2, tp2-2);
ev:= copy(s, tp2+1, tp1-tp2-1);
case lowercase(et) of
'b' : aFont.Style:= aFont.Style + [fsBold];
'i' : aFont.Style:= aFont.Style + [fsItalic];
'u' : aFont.Style:= aFont.Style + [fsUnderline];
's' : aFont.Style:= aFont.Style + [fsStrikeOut];
'color': aFont.Color:= StrToInt(ev);
'min' : begin
if StrToInt(ev) >= Lbl.Width then minlen:= Lbl.Width else minlen:= StrToInt(ev);
Flags:= Flags or FS_MINIMIZE or FS_SOLID;
end;
'name' : aFont.Name:= ev;
'size' : aFont.Size:= StrToInt(ev);
'solid': Flags:= Flags or FS_SOLID;
end;
tags:= tags+copy(s, 1, tp1);
delete(s, 1, tp1);
until k=0;
finally
k:=Pos('[', s);
end;
aHeight:=GetTextHeight(aFont, s)+2;
aWidth:=(Lbl.Left+Lbl.Width)-ALeft;
newline:= Pos(#13#10, S);
i:= Pos('%n', S);
if (i<>0)and((i<newline)or(newline=0)) then newline:= i;
if newline=1 then begin
aLeft:= Lbl.Left;
aTop:= ATop+AHeight;
Delete(S, 1, 2);
s:=tags+s;
Continue;
end;
l:= GetTextLen(aFont, s, aWidth);
while Pos(' ',Copy(s,1,l)) = 0 do begin
l:=l+1;
if l>=Length(s) then break;
end;
if (k<>0)and(l>k) then l:=k-1;
if k=0 then if lenS<=l then l:= lenS;
if (l>0)and(l<>(k-1))and(lenS>l)and(s[l]<>' ') then l:= FindSpace(s, 1, l);
if (l<k-1)and(Flags and FS_SOLID <> 0) then l:= k-1;
if ((newline-1)<l)and(newline<>0) then l:= newline-1;
b:= copy(s, 1, l);
Delete(s, 1, l);
try
repeat
if (s='')or(s[1]<>'[')or((s[1]='[')and(s[2]<>'/')) then Break;
tp2:=2; while s[tp2]<>']' do tp2:=tp2+1;
tp3:= pos('['+copy(s, 3, tp2-3), tags);
tp4:= tp3; while tags[tp4]<>']' do tp4:=tp4+1;
delete(tags, tp3, tp4-tp3+1);
delete(s, 1, tp2);
until k=0;
finally
if tags<>'' then s:=tags+s;
end;
if b<>'' then begin
b:= TrimEx(b); if Flags and FS_MINIMIZE <> 0 then b:= MinimizePathName(b, aFont, MinLen);
i:= GetArrayLength(Result.Parts); SetArrayLength(Result.Parts, i+1); SetArrayLength(Result.Shadow, i+1);
aWidth:= GetTextWidth(aFont, b);
if ((aLeft+aWidth)-(Lbl.Left+Lbl.Width)>=0) then begin
if Length(Lbl.Caption) <> Length(s+b+' ') then aTop:= aTop+aHeight;
aLeft:= Lbl.Left;
end;
if aHeight+aTop > Lbl.Top+Lbl.Height then aHeight:=aHeight-((aHeight+aTop)-(Lbl.Top+Lbl.Height));
Result.Parts[i]:= TLabel.Create(Lbl.Parent);
with Result.Parts[i] do begin
Autosize:= False; Font:= aFont;
SetBounds(aLeft,aTop,aWidth,aHeight);
Transparent:= True;
Parent:= Lbl.Parent;
Caption:= b;
Alignment:=Lbl.Alignment;
end;
if Lbl.Enabled then begin
Result.Shadow[i]:= TLabel.Create(Lbl.Parent);
with Result.Shadow[i] do begin
Autosize:= False; Font:= aFont;
SetBounds(aLeft,aTop+1,aWidth,aHeight);
Transparent:= True;
Parent:= Lbl.Parent;
Caption:= b;
Font.Color:=StrToIntDef(Lbl.Hint,$000000);
SendToBack;
Alignment:=Lbl.Alignment;
end;
end;
case Lbl.Alignment of
taLeftJustify:
begin
if Result.Parts[i].Width > Lbl.Width then begin
Result.Parts[i].Width:=Lbl.Width;
if Lbl.Enabled then Result.Shadow[i].Width:=Result.Parts[i].Width;
end;
ALeft:= ALeft+AWidth+Space;
end;
taCenter:
begin
TW:=TW+aWidth+Space;
if Result.Parts[i].Width > Lbl.Width then begin
Result.Parts[i].Width:=Lbl.Width;
if Lbl.Enabled then Result.Shadow[i].Width:=Result.Parts[i].Width;
Result.Parts[i].Left:=Lbl.Left;
if Lbl.Enabled then Result.Shadow[i].Left:=Result.Parts[i].Left+1;
TW:=TW-aWidth;
aWidth:=Lbl.Width;
TW:=TW+aWidth;
end;
if aLeft = Lbl.Left then begin
TW:=TW-aWidth-Space;
while x > 0 do begin
Result.Parts[i-x].Left:=(Result.Parts[i-x].Left+(Lbl.Width/2))-(TW/2);
if Lbl.Enabled then Result.Shadow[i-x].Left:=Result.Parts[i-x].Left+1;
x:=x-1;
end;
TW:=aWidth+Space;
x:=1;
end else x:=x+1;
if Length(s)=0 then begin
x:=x-1;
while x >= 0 do begin
Result.Parts[i-x].Left:=(Result.Parts[i-x].Left+(Lbl.Width/2))-(TW/2);
if Lbl.Enabled then Result.Shadow[i-x].Left:=Result.Parts[i-x].Left+1;
x:=x-1;
end;
end;
ALeft:= ALeft+AWidth+Space;
end;
taRightJustify:
begin
TW:=TW+aWidth+Space;
if Result.Parts[i].Width > Lbl.Width then begin
Result.Parts[i].Width:=Lbl.Width;
if Lbl.Enabled then Result.Shadow[i].Width:=Result.Parts[i].Width;
Result.Parts[i].Left:=Lbl.Left;
if Lbl.Enabled then Result.Shadow[i].Left:=Result.Parts[i].Left+1;
TW:=TW-aWidth;
aWidth:=Lbl.Width;
TW:=TW+aWidth;
end;
if aLeft = Lbl.Left then begin
TW:=TW-aWidth-Space;
while x > 0 do begin
Result.Parts[i-x].Left:=(Lbl.Left+Lbl.Width)-TW;
if Lbl.Enabled then Result.Shadow[i-x].Left:=Result.Parts[i-x].Left+1;
TW:=TW-Result.Parts[i-x].Width-Space;
x:=x-1;
end;
TW:=aWidth+Space;
x:=1;
end else x:=x+1;
if Length(s)=0 then begin
x:=x-1;
while x >= 0 do begin
Result.Parts[i-x].Left:=(Lbl.Left+Lbl.Width)-TW;
if Lbl.Enabled then Result.Shadow[i-x].Left:=Result.Parts[i-x].Left+1;
TW:=TW-Result.Parts[i-x].Width-Space;
x:=x-1;
end;
end;
ALeft:= ALeft+AWidth+Space;
end;
end;
end;
if aHeight < 0 then begin
Lbl.Hide;
exit;
end;
until (Length(s)=0);
Lbl.Hide; aFont.Free;
end;

Okta_333
07-02-2015, 20:22
Никто не пользуется PrecompInside и SRepInside ?!!!

sergey3695
07-02-2015, 20:59
Okta_333, что это? Скрипты Inno Setup. Помощь и советы
http://krinkels.org/threads/precompinside.50/
http://krinkels.org/threads/srepinside.49/

Okta_333
07-02-2015, 21:04
sergey3695
А разве вопрос не по теме?
Я же до этого описывала ситуацию.

И всё равно не понимаю что я делаю не так.....

MogilShik2007
07-02-2015, 21:07
судя из примера должно работать, но увы...нет, для компонентов не подходит: »

Когда то давно, делал для себя репачок, цвет текста менял, все работает:
http://s57.radikal.ru/i155/1502/3c/c2a67edd072b.png

ЗЫ. с моим скриптом то, кто поможет? Смотрю уже 4 человека скачало и тишина)))

Dodakaedr
07-02-2015, 21:13
Когда то давно, делал для себя репачок, цвет текста менял, все работает: »
для компонент листа нет...

sergey3695
07-02-2015, 21:23
Okta_333, это не скрипты inno setup. пиши там куда ссылочки ведут.

MogilShik2007
07-02-2015, 22:55
для компонент листа нет... »

Для любой страницы, здесь - обсуждение (http://krinkels.org/threads/redrawtext.818/)

El Sanchez
08-02-2015, 16:19
но я немного не понял, где именно в коде это использовать »
теперь код не может понять индефикатор GWL_EXSTYLE »
теперь Handle не понимает. »
Farser21, для ленивых подробно:
#define A = (Defined UNICODE) ? "W" : "A"
const
GWL_EXSTYLE = (-20);
WS_EX_COMPOSITED = $02000000;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';

//////////////////////////
function InitializeWizard;
begin
with WizardForm.ComponentsList do
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
end;




© OSzone.net 2001-2012