2016-10-03 3 views
1

은 내가 Font.Color, Font.Size 및 Inno Setup으로 WizardForm.CaptionFont.Name 손쉽게 찾을 필요 얻기 위해 사용하는 넓이 포인트 (그것은 문자열입니다) GetTextExtentPoint32.찾는 이노 설정 WizardForm 자막 글꼴 크기, 글꼴 이름 및 글꼴 색상 및 센터는 WizardForm 캡션

WizardForm의 위 속성을 어떻게 찾을 수 있는지 알려주십시오. (시스템 글꼴 속성 아님). 내가 사용하고있는 .cjstyles 스킨에 따라 WizardForm의 현재 글꼴 정보를 얻고 싶습니다.

그리고 글꼴 정보를 알고 난 후 파스칼 스크립트를 사용하여 마법사 창 제목을 가운데에 배치하는 방법을 알고 싶습니다.

미리 감사드립니다.

+0

나는 이것을 위해 무엇이 필요한지 이해하지 못합니다. 설명 할 수 있니? –

+0

Windows는 자막 중심 지정을 지원하지 않기 때문에 현재의 글꼴 이름과 크기에 따라 WizardForm.Caption에서 공간의 너비를 계산하고 원하는 자막 앞에 공백을 자동으로 추가하여 가운데에 배치하려고합니다. :-( – Blueeyes789

답변

2

나는 이것이 가능하지 않다고 생각합니다.

창 제목은 ISSkin DLL에 의해 사용자 지정됩니다. 그래서 Windows는 글꼴 크기를 알지 못하므로 Windows API를 사용할 수 없습니다.

ISSkin은이 정보를 검색하는 기능을 내 보내지 않습니다.

+0

OK, 스킨없이 WizardForm.Caption 글꼴 정보를 얻을 수 없습니까? – Blueeyes789

+0

@Martin 설치시 글꼴을 가져 오는 것은 무엇입니까 (기본값은 Tahoma) + GetWindowsText() 및 WinAPI 함수로 너비 계산 하시겠습니까? – Slappy

+0

@Slappy –

1

WizardForm의 창 제목 속성은 Visual Styles Skin에 따라 ISSkin.DLL에 의해 내부적으로로드됩니다. 사람들이 ISSKin.DLL에 의해 무시되는 모든 글꼴 이름 Segoe UI 및 글꼴 크기 10

-

창 제목 : 창 제목 사용자에 대한 모든 시스템 메트릭이 있다면 그래서, 같은 제어판에서 고급 모양 설정 구성 지정된 비주얼 스타일을로드 할 때 .INI 파일에 다른 글꼴 및 글꼴 크기 구성이 있으므로 아래에 표시된 것처럼 LoadSkin 함수에 의해로드됩니다.

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

.INI은 여기에서 제공하는 스킨은 스킨 파일에 저장 Bitmpas 같은 자원에서로드하는 것입니다 방법에 대한 거의 모든 정보를 가지고있는 파일.


그러나 두 가지 옵션을 사용하여 WizardForm Caption을 가운데에 배치 할 수 있습니다.

리소스 해커 사용 : 리소스 해커를 사용

을 매우 쉽게 센터로 피부의 창 제목 (캡션) 정렬을 설정할 수 있습니다.

1. 리소스 해커를 사용하여 Visual Styles Skin (.cjstyles 또는 .msstyles) 파일을 열고 TEXTFILE이라는 리소스 그룹을 찾습니다.

2. 확장 및 ISSkin.dll에서 기본적으로로드되는 색 구성표에 따라 .INI 파일을 찾습니다. 대부분의 상황에서 시스템 글꼴 크기가 100 % (기본값)이면 일반 색 구성표 여야합니다.

예를 들어, 당신의 피부 파일 이름이 Elegance.cjstyles 경우, .INI 정상 색상으로 파일을 포함 NORMALELEGANCE_INI 또는 무언가 같이해야한다 : 아래 그림 같은 이름에 NORMAL 단어를 가지고있는 .INI 파일을 클릭 단어 NORMAL.

3.Open 내부 텍스트 편집기에서이 .INI 파일은 리소스 해커와 함께 제공 라인 Window.Caption을 찾을 등은 다음과 같습니다 :

enter image description here

4.And 것은 그 ContentAlignment로 설정되어 있는지 확인 Center. 기본적으로 없으면 Center으로 변경하십시오.

이제 마법사의 창 제목은 스킨이 ISSkin.DLL에 의해로드 된 후 가운데에 위치해야합니다.

참고 : 센터링이 캡션 왼쪽과 최소화 단추 사이에서 이루어지기 때문에이 센터링은 정확하지 않으므로 캡션은 이런 식으로 센터링 한 후에도 여전히 왼쪽 근처에있을 수 있습니다.


사용 파스칼 스크립트 [코드] 제 :.

당신은 전면에 공백을 추가하여 WizardForm 캡션을 중심으로 (그러나 권장하지 않습니다.) 수있는이 뜻을 같이

강령 당신이 필요로하는 것을하십시오. 코드 위

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

비주얼 스타일 스킨을 사용하는 경우 :

,961,933,210

중심 마법사 윈도우 제목 :

: 기능 이상 사용 마법사 윈도우 제목 (공간을 추가하여 해킹)을 중심 그러나

enter image description here

는 윈도우 표시 줄 툴팁 다음 악영향을 야기

enter image description here

참고 : WizardForm.비주얼 스타일 스킨을 사용하는 경우 CaptionLeft 및 CaptionRight는 비주얼 스타일 스킨의 왼쪽 캡션 여백의 크기에 따라 달라집니다.

+0

매우 잘 작동합니다! 고맙습니다! 그러나 나는 프로그래밍 방식으로 마법사 캡션 ​​글꼴 크기 및 이름을 얻는 방법을 여전히 모른다. :-( – Blueeyes789

+0

위와 같이 WizardForm의 창 제목을 가운데로 맞출 수 있습니다. 그런 다음 [Resource Hacker commandline] (http://www.angusj.com/)을 사용하여 창 제목 글꼴 정보와 같은 비주얼 스타일 스킨 정보를 가져와야합니다. resourcehacker /)를 사용해보십시오. – GTAVLover