2016-10-03 8 views
1

Мне нужно найти то, что является Font.Color, Font.Size и Font.Name Набора Inno WizardForm.Caption, чтобы получить его (это строка) Степень точки с помощью GetTextExtentPoint32.Обнаружение установки Inno WizardForm Подпись Размер шрифта, имя шрифта и цвета шрифта и Центр WizardForm Заголовок

Пожалуйста, дайте мне знать, как я могу найти вышеуказанные свойства WizardForm. (Не системные свойства шрифта). Я хочу получить текущую информацию о шрифте WizardForm в соответствии с .cjstyles Skin, которую я использую.

И еще мне нравится знать, как центрировать заголовок окна мастера, используя скрипт Pascal, зная информацию о шрифтах.

Спасибо заранее.

+0

Я не понимаю, для чего вам это нужно. Вы можете объяснить? –

+0

Поскольку Windows не поддерживает центрирование Подписи, я хотел бы подсчитать ширину пробела в WizardForm.Caption в соответствии с текущим именем и размером шрифта и автоматически добавить пробелы перед моей желаемой надписью, чтобы центрировать ее. :-( – Blueeyes789

ответ

2

Я не думаю, что это возможно.

Название окна настраивается библиотекой ISSkin. Поэтому Windows не знает размер шрифта, поэтому вы не можете использовать Windows API.

И ISSkin не экспортирует никакой функции для извлечения этой информации.

+0

ОК, не могу ли я получить информацию о шрифте WizardForm.Caption без скина? – Blueeyes789

+0

@ Мартин о том, как получить шрифт в настройке (по умолчанию Tahoma) + GetWindowsText() и вычислить ширину с помощью функций WinAPI? – Slappy

+0

@Slappy Вы хотите рассчитать степень надписи без скина? –

1

Свойства заголовка окна WizardForm внутренне загружаются ISSkin.DLL в соответствии с вашим стилем визуальных стилей. Таким образом, если бы какой-либо системы Метрики для пользователя заголовков окон настраивается в дополнительных настройках в панели управления, как:

Window Title - название шрифта Segoe UI и размер шрифта 10

всех тех, кто будет переопределен ISSKin.DLL при загрузке указанного стиля Visual Style, поскольку он имеет разные шрифты и настройки размера шрифта в своих .INI-файлах, которые загружаются функцией LoadSkin, как показано ниже.

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

файл .ini вы предоставляете здесь есть практически вся информация о том, как кожа является загружен из ресурсов, таких как Bitmpas, хранящихся в файле скина.

Однако вы можете центрировать WizardForm Caption, используя два разных варианта.

Использование Хакер ресурсов:

Использование Хакер ресурсов, можно установить заголовок окна (Подпись) Выравнивание кожи Центру очень легко.

1.Откройте свою визуальную стильную шкуру (.cjstyles или .msstyles) с помощью Resource Hacker и найдите группу ресурсов с именем TEXTFILE.

2.Откройте его и найдите файл .INI в соответствии с тем, какая цветовая схема загружена по умолчанию ISSkin.dll. В большинстве ситуаций, и если размер вашего системного шрифта 100% (по умолчанию), это должна быть нормальная цветовая схема. Таким образом, нажмите на файле INI-который имеет слово NORMAL в его названии, как показано ниже:

Например, если ваша кожа Имя файла Elegance.cjstyles, файл .ini с нормальной цветовой гаммой должен быть как NORMALELEGANCE_INI или что-то в том числе слово NORMAL.

3.Open этот INI-файл во внутреннем текстовом редакторе поставляется с Hacker Resource и найдите строку Window.Caption, как показано ниже:

enter image description here

4.And убедитесь, что его ContentAlignment установлен в Center. Если это не по умолчанию, измените его на Center.

Теперь заголовок окна мастера должен быть центрирован после загрузки скина ISSkin.DLL.

ПРИМЕЧАНИЕ. Это центрирование неточно потому, что центрирование выполняется между клавишей слева и кнопкой уменьшения, поэтому заголовок может все еще находиться рядом с левой стороной даже после центрирования его таким образом.


Использование Pascal Script [код] Раздел:

Вы можете центрировать WizardForm Caption, добавляя пробелы в его передней (но не рекомендуется.)

Кодекс, как это будет. делай то, что тебе нужно.

[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; 

выше код продолжает добавлять пробела перед Струнными вы хотите быть в центре до тех пор, пока не будет должным образом сосредоточен в Max Струнного Ширине вы заданный, и выводит измененную строку с добавленными пробелами.

ПРИМЕЧАНИЕ: MaxWidth Параметр здесь должен быть шириной, по которой вы хотите центрировать строку. Строка, которая имеет более высокую ширину, чем вы здесь указываете, не может быть правильно центрирована. И визуальная стильная кожа не нужна, чтобы центрировать заголовок окна мастера, используя вышеуказанную функцию.

Использование:

Если вы хотите использовать эту функцию, чтобы центрировать Wizard Window Title, использовать его как:

Если вы не используете Visual Styles кожи:

[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; 

Centered Wizard Window Title:

enter image description here

Однако центрирование Мастер заголовок окна с помощью описанной выше функции (Взлом его путем добавления пробелов) вызывает следующий плохой эффект в панели задач Windows Подсказки:

enter image description here

ПРИМЕЧАНИЕ: WizardForm.CaptionLeft и CaptionRight должны варьироваться в зависимости от размера левой границы надписи для вашей визуальной стили, если вы используете визуальную стильную шкуру.

+0

Работает очень хорошо! Спасибо! Но я до сих пор не знаю, как программно получить размер шрифта и имена шрифта мастера. :-( – Blueeyes789

+0

Теперь вы можете центрировать Window Title of WizardForm, как указано выше. Затем вы должны попытаться получить информацию о Visual Styles Skin, такую ​​как информация о шрифте заголовка окна, используя [Resource Hacker commandline] (http://www.angusj.com/ resourcehacker /) через скрипт Pascal. Попробуйте больше! ;-) – GTAVLover