2016-10-03 136 views
1

我需要找到什麼是Font.ColorFont.Size和Inno Setup的WizardForm.CaptionFont.Name得到它(這是一個字符串)採用區點GetTextExtentPoint32找出Inno Setup的WizardForm標題字體大小,字體名稱和字體顏色和中心WizardForm標題

請讓我知道如何找到WizardForm的上述屬性。 (不是系統字體屬性)。我想根據我使用的.cjstyles皮膚獲取WizardForm的當前字體信息。

我也知道如何在知道那些字體信息後使用Pascal腳本將嚮導窗口標題居中。

在此先感謝。

+0

我不明白你需要什麼。你可以解釋嗎? –

+0

由於Windows不支持居中字幕,我想根據當前的字體名稱和大小來計算WizardForm.Caption中的空格寬度,並在我希望的字幕前自動添加空格以居中。 :-( – Blueeyes789

回答

2

我不認爲這是可能的。

窗口標題是由ISSkin DLL定製繪製的。所以Windows不知道字體大小,因此你不能使用Windows API。

而ISSkin不會導出任何函數來檢索此信息。

+0

好的,我無法獲得沒有皮膚的WizardForm.Caption字體信息嗎? – Blueeyes789

+0

@Martin在安裝時獲取字體(默認爲Tahoma)+ GetWindowsText()並使用WinAPI函數計算寬度? – Slappy

+0

@Slappy你的意思是計算沒有皮膚的標題的範圍? –

1

WizardForm的窗口標題屬性由ISSkin.DLL根據您的視覺樣式皮膚內部加載。所以,如果有任何系統韻律的窗口標題用戶在控​​制面板中的高級外觀設置等配置:

窗口標題 - 字體名稱Segoe UI和字體大小10

所有這些將被ISSKin.DLL覆蓋當加載指定的視覺樣式時,因爲它們的.INI文件具有不同的字體和字體大小配置,這些配置由功能LoadSkin加載,如下所示。

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); 

.ini文件你提供在這裏對皮膚是如何從像存儲在皮膚文件Bitmpas資源加載幾乎所有信息。


但是,您可以使用兩個不同的選項將WizardForm標題居中。

使用資源黑客:

利用資源黑客,可以非常容易地設置皮膚的窗口標題(標題)符合中心。

1.使用Resource Hacker打開您的視覺樣式皮膚(.cjstyles或.msstyles)文件並查找名爲TEXTFILE的資源組。

2.展開並根據ISSkin.dll默認的顏色方案找到.INI文件。在大多數情況下,如果您的系統字體大小爲100%(默認),則應該是正常配色方案。因此,在具有在其名稱師範大學字的.ini文件,單擊像圖所示:

例如,如果你的皮膚文件名是Elegance.cjstyles,在.ini與普通色彩方案文件,應該像NORMALELEGANCE_INI或東西,包括字NORMAL

3.Open內部文本編輯器這個.ini文件帶有資源黑客並找到行Window.Caption如下所示的一樣:

enter image description here

4.And確保其ContentAlignment設爲Center。如果它不是默認值,請將其更改爲Center

現在,在由ISSkin.DLL加載皮膚後,嚮導的窗口標題應該居中。

注意:此居中不準確,因爲居中之間完成標題左和最小化按鈕之間,所以標題可能仍然靠近左側即使這樣居中後。


使用Pascal腳本[編號]部分:

您可以通過添加空格到它的前排中央WizardForm標題(但不推薦)。

A碼這樣的意願。做你需要的。

[Code] 
Type 
    TSize = Record 
    cx, cy: Integer; 
end; 

function GetTextExtentPoint32(hdc: THandle; s: string; c: Integer; var Size: TSize): Boolean; 
    external '[email protected] stdcall'; 
function GetDC(hWnd: THandle): THandle; 
    external '[email protected] stdcall'; 
function SelectObject(hdc: THandle; hgdiobj: THandle): THandle; 
    external '[email protected] stdcall'; 

function AlignStringToCenter(S: String; const FontName: String; const MaxWidth, FontSize: Integer): String; 
var 
    SWidth, SX, NSWidth: Integer; 
    SFont, SHandle: THandle; 
    StringModifier: TNewStaticText; 
    StringDimensions: TSize; 
    SHandleEx: TForm; 
begin 
    if S = '' then 
    RaiseException('The specified Caption is an empty String') 
    else begin 
    Try 
     SHandleEx := TForm.Create(nil); 
     StringModifier := TNewStaticText.Create(SHandleEx); 
     StringModifier.Font.Name := FontName; 
     StringModifier.Font.Size := FontSize; 
     StringModifier.Parent := SHandleEx; 
     SX := 0; 
     StringModifier.Caption := S; 
     SHandle := GetDC(StringModifier.Handle); 
     SFont := SelectObject(SHandle, StringModifier.Font.Handle); 
     GetTextExtentPoint32(SHandle, StringModifier.Caption, Length(StringModifier.Caption), StringDimensions); 
     SelectObject(SHandle, SFont); 
     SWidth := StringDimensions.cx; 
     Repeat 
     Insert(' ', S, SX); 
     StringModifier.Caption := S; 
     Result := S; 
     SHandle := GetDC(StringModifier.Handle); 
     SFont := SelectObject(SHandle, StringModifier.Font.Handle); 
     GetTextExtentPoint32(SHandle, StringModifier.Caption, Length(StringModifier.Caption), StringDimensions); 
     SelectObject(SHandle, SFont); 
     NSWidth := StringDimensions.cx; 
     SX := SX + 1; 
     Until (NSWidth - SWidth) >= (MaxWidth - NSWidth); 
    Finally 
     StringModifier.Caption := ''; 
     StringModifier.Free; 
     SHandleEx.Free; 
     SHandleEx.Close; 
    end; 
    end; 
end; 

上面的代碼中加入不斷空格前面要居中,直到它在你給出的最大字符串寬度正確居中,並輸出修改後的字符串添加空格的字符串。

注意:MaxWidth參數在這裏應該是您想要居中字符串的寬度。一個比你在這裏指定的寬度更高的字符串不能居中。使用上述功能,視覺樣式皮膚不需要將嚮導窗口標題居中。

用法:

如果要使用此功能中心向導窗口標題,這樣使用它:

如果不使用視覺樣式皮膚:

[Code] 
Const 
    SM_CYSIZEFRAME = 33; 
    SM_CXSMICON = 49; 

function GetSystemMetrics(nIndex : Integer): Integer; 
    external '[email protected] stdcall'; 

procedure InitializeWizard; 
begin 
    { MaxWidth = WizardForm.Width - 2 * (WizardForm.FrameWidth + WizardForm.SmallIconWidth + WizardForm.CaptionLeft + WizardForm.CaptionRight) } 
    WizardForm.Caption := AlignStringToCenter(WizardForm.Caption, 'Segoe UI', WizardForm.Width - (2 * (GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXSMICON) + 10 + 10)), 9); 
end; 

如果您使用視覺樣式皮膚:

[Code] 
Const 
    SM_CYSIZEFRAME = 33; 
    SM_CXSMICON = 49; 

function GetSystemMetrics(nIndex : Integer): Integer; 
    external '[email protected] stdcall'; 

procedure InitializeWizard; 
begin 
    { MaxWidth = WizardForm.Width - 2 * (WizardForm.FrameWidth + WizardForm.SmallIconWidth + WizardForm.CaptionLeft + WizardForm.CaptionRight) } 
    WizardForm.Caption := AlignStringToCenter('Setup - {#MyAppName}', 'Window Title Font Name of your Visual Styles Skin', WizardForm.Width - (2 * (GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXSMICON) + 10 + 10)), Window Title Font Size of your Visual Styles Skin); 
end; 

中心的嚮導窗口標題:

enter image description here

然而,圍繞嚮導窗口標題使用上述功能(通過添加空格盜號的)導致在Windows任務欄工具提示使用下列不良影響:

enter image description here

注:WizardForm。如果使用視覺樣式皮膚,則CaptionLeft和CaptionRight應隨視覺樣式皮膚的左標題頁邊距的大小而變化。

+0

工作得很好!謝謝!但我仍然不知道如何以編程方式獲取嚮導標題字體大小和名稱。 :-( – Blueeyes789

+0

現在,您可以像上面所說的那樣將WizardForm的窗口標題居中,然後您應該嘗試使用[資源黑客命令行](http://www.angusj.com/)獲取視覺樣式皮膚信息,例如窗口標題字體信息resourcehacker /)通過Pascal Script。試試更多!;-) – GTAVLover

相關問題