2015-01-27 11 views
2

Delphi XE7은 대도시 테마 응용 프로그램의 스타일을 편집하고 작성하는 데 사용할 수있는 "비트 맵 스타일 디자이너"도구 ('도구> 비트 맵 스타일 디자이너')를 제공합니다. 버튼, 체크 박스, 라벨의 그래픽과 색상이 바뀌면 작동하며 꽤 날아 보입니다. 그러나 어떻게 글꼴 설정을 변경할 수 있습니까? 더 정확하게 말하면 : 응용 프로그램에서 글꼴 설정을 적용하려면 어떻게해야합니까?비트 맵 스타일 디자이너에서 글꼴 변경

물론 사용자 정의 글꼴 스타일, 가족, 크기 등을 편집 할 수있는 글꼴 섹션이 있지만 그 설정은 아무런 영향을 미치지 않습니다. 하지만 컨트롤의 색상을 성공적으로 변경할 수 있습니다.

비트 맵 스타일 디자이너는 미리보기 모드도 지원합니다. 그러면 사용자 정의 컨트롤이있는 창이 표시됩니다. 심지어 거기에 사용자 지정 글꼴이 사용됩니다. 이 창에서는 ParentFont := True 또는 StyleElements := StyleElements + [seFont]과 같은 설정을 적용 할 수 없습니다.

하지만 사용자 지정 스타일을 적용하는 고유 한 응용 프로그램에서 이러한 속성을 변경할 수 있습니다. 불행히도 결과는 동일하게 유지됩니다.

안부

+0

그것은 당신의 질문에서 명확하지 않다 : 비트 맵 스타일 디자이너에서 글꼴 주소를 지정하거나 스타일이 포함 된 리소스를 만들어 해당 스타일 중 하나를 응용 프로그램 내의 컨트롤에 적용하려고 시도한 적이 있습니까? (예 : 일반 텍스트 편집기에서 해당 스타일을 편집 할 수있는 곳) – Alnitak

+0

MetropolisUIBlack.vsf 스타일을 수정하고 프로젝트 설정에서 정의한 후에 응용 프로그램을 다시 컴파일했습니다. 문제는 글꼴이 데모 양식에서도 고려되지 않는다는 것입니다. –

+0

스타일을 적용 했습니까? (재 컴파일은 스타일을 적용하지 않지만 생각할 수도 있습니다). .vsf 스타일의 다른 것이 나오는지 보려고 했습니까? (즉, 무시되는 폰트일까요? 아니면 스타일 파일의 다른 모든 것들도 무시되는 것입니까?) – Alnitak

답변

2

VCL 스타일 현재 읽기 및 사용자 정의 스타일, 색상에서 전체 글꼴 데이터를 적용하지 않습니다.

해킹을 통해 사용자 정의 스타일로 완전한 글꼴 정보에 액세스 할 수 있지만 수동으로 컨트롤에 글꼴을 적용하거나 ParentFont 양식 속성을 사용할 수 있습니다. 사용자 정의 스타일에 저장된 글꼴에 액세스 할 수 있습니다 코드를 다음과 같이

은 (XE4에서 테스트하지만, 기본적인 아이디어는 약간의 차이가있을 경우, 다른 델파이 버전에 적용 할 수 있습니다)

unit StyleFonts; 

interface 

uses 
    Winapi.Windows, 
    Winapi.Messages, 
    System.SysUtils, 
    System.Classes, 
    System.Types, 
    System.UITypes, 
    System.Zlib, 
    Vcl.Consts, 
    Vcl.Graphics, 
    Vcl.Controls, 
    Vcl.Forms, 
    Vcl.ImgList, 
    Vcl.GraphUtil, 
    Vcl.Styles, 
    Vcl.Themes; 

function GetStyleFont(Font: TStyleFont): TFont; 

implementation 

// use files from source\vcl 
{$I StyleUtils.inc} 
{$I StyleAPI.inc} 

var 
    SystemFont: TFont; 

procedure InitializeSystemFont; 
var 
    NonClientMetrics: TNonClientMetrics; 
begin 
    SystemFont := TFont.Create; 
    FillChar(NonClientMetrics, SizeOf(NonClientMetrics), 0); 
    // following function will fill up cbSize with correct size for XP system 
    NonClientMetrics.cbSize := TNonClientMetrics.SizeOf; 
    if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then 
    SystemFont.Handle := CreateFontIndirect(NonClientMetrics.lfMessageFont) 
end; 

type 
    TStyleHelper = class helper for TCustomStyle 
    public 
    function GetSource: TObject; { TseSkin } 
    end; 

function TStyleHelper.GetSource: TObject; 
begin 
    Result := Self.FSource; 
end; 

function GetStyleFont(Font: TStyleFont): TFont; 
var 
    LStyle: TCustomStyle; 
    FSource: TObject; 
    SeFont: TSeStyleFont; 
begin 
    if TStyleManager.IsCustomStyleActive then 
    begin 
     LStyle := TCustomStyle(TStyleManager.ActiveStyle); 
     FSource := LStyle.GetSource; 
     // case based on Vcl.Styles TCustomStyle.DoGetStyleFontColor 
     case Font of 
     sfButtonTextDisabled: Result := TSeStyle(FSource).Fonts[ktfButtonTextDisabled]; 
     sfButtonTextFocused: Result := TSeStyle(FSource).Fonts[ktfButtonTextFocused]; 
     sfButtonTextHot: Result := TSeStyle(FSource).Fonts[ktfButtonTextHot]; 
     sfButtonTextNormal: Result := TSeStyle(FSource).Fonts[ktfButtonTextNormal]; 
     sfButtonTextPressed: Result := TSeStyle(FSource).Fonts[ktfButtonTextPressed]; 
     sfCaptionTextInactive: Result := TSeStyle(FSource).Fonts[ktfCaptionTextInactive]; 
     sfCaptionTextNormal: Result := TSeStyle(FSource).Fonts[ktfCaptionTextNormal]; 
     sfCategoryPanelGroupHeaderHot: Result := TSeStyle(FSource).Fonts[ktfCategoryPanelGroupHeaderHot]; 
     sfCategoryPanelGroupHeaderNormal: Result := TSeStyle(FSource).Fonts[ktfCategoryPanelGroupHeaderNormal]; 
     sfCatgeoryButtonsCategoryNormal: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsCategoryNormal]; 
     sfCatgeoryButtonsCategorySelected: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsCategorySelected]; 
     sfCatgeoryButtonsHot: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsHot]; 
     sfCatgeoryButtonsNormal: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsNormal]; 
     sfCatgeoryButtonsSelected: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsSelected]; 
     sfCheckBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextDisabled]; 
     sfCheckBoxTextFocused: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextFocused]; 
     sfCheckBoxTextHot: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextHot]; 
     sfCheckBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextNormal]; 
     sfCheckBoxTextPressed: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextPressed]; 
     sfComboBoxItemDisabled: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemDisabled]; 
     sfComboBoxItemFocused: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemFocused]; 
     sfComboBoxItemHot: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemHot]; 
     sfComboBoxItemNormal: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemNormal]; 
     sfComboBoxItemSelected: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemSelected]; 
     sfEditBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextDisabled]; 
     sfEditBoxTextFocused: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextFocused]; 
     sfEditBoxTextHot: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextHot]; 
     sfEditBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextNormal]; 
     sfEditBoxTextSelected: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextSelected]; 
     sfGridItemFixedHot: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedHot]; 
     sfGridItemFixedNormal: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedNormal]; 
     sfGridItemFixedPressed: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedPressed]; 
     sfGridItemNormal: Result := TSeStyle(FSource).Fonts[ktfGridItemNormal]; 
     sfGridItemSelected: Result := TSeStyle(FSource).Fonts[ktfGridItemSelected]; 
     sfGroupBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfGroupBoxTextDisabled]; 
     sfGroupBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfGroupBoxTextNormal]; 
     sfHeaderSectionTextDisabled: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextDisabled]; 
     sfHeaderSectionTextHot: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextHot]; 
     sfHeaderSectionTextNormal: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextNormal]; 
     sfHeaderSectionTextPressed: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextPressed]; 
     sfListItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfListItemTextDisabled]; 
     sfListItemTextFocused: Result := TSeStyle(FSource).Fonts[ktfListItemTextFocused]; 
     sfListItemTextHot: Result := TSeStyle(FSource).Fonts[ktfListItemTextHot]; 
     sfListItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfListItemTextNormal]; 
     sfListItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfListItemTextSelected]; 
     sfMenuItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextDisabled]; 
     sfMenuItemTextHot: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextHot]; 
     sfMenuItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextNormal]; 
     sfMenuItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextSelected]; 
     sfPanelTextDisabled: Result := TSeStyle(FSource).Fonts[ktfPanelTextDisabled]; 
     sfPanelTextNormal: Result := TSeStyle(FSource).Fonts[ktfPanelTextNormal]; 
     sfPopupMenuItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextDisabled]; 
     sfPopupMenuItemTextHot: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextHot]; 
     sfPopupMenuItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextNormal]; 
     sfPopupMenuItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextSelected]; 
     sfRadioButtonTextDisabled: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextDisabled]; 
     sfRadioButtonTextFocused: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextFocused]; 
     sfRadioButtonTextHot: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextHot]; 
     sfRadioButtonTextNormal: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextNormal]; 
     sfRadioButtonTextPressed: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextPressed]; 
     sfSmCaptionTextInactive: Result := TSeStyle(FSource).Fonts[ktfSmCaptionTextInactive]; 
     sfSmCaptionTextNormal: Result := TSeStyle(FSource).Fonts[ktfSmCaptionTextNormal]; 
     sfStatusPanelTextDisabled: Result := TSeStyle(FSource).Fonts[ktfStatusPanelTextDisabled]; 
     sfStatusPanelTextNormal: Result := TSeStyle(FSource).Fonts[ktfStatusPanelTextNormal]; 
     sfTabTextActiveDisabled: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveDisabled]; 
     sfTabTextActiveHot: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveHot]; 
     sfTabTextActiveNormal: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveNormal]; 
     sfTabTextInactiveDisabled: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveDisabled]; 
     sfTabTextInactiveHot: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveHot]; 
     sfTabTextInactiveNormal: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveNormal]; 
     sfTextLabelDisabled: Result := TSeStyle(FSource).Fonts[ktfStaticTextDisabled]; 
     sfTextLabelFocused: Result := TSeStyle(FSource).Fonts[ktfStaticTextFocused]; 
     sfTextLabelHot: Result := TSeStyle(FSource).Fonts[ktfStaticTextHot]; 
     sfTextLabelNormal: Result := TSeStyle(FSource).Fonts[ktfStaticTextNormal]; 
     sfToolItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfToolItemTextDisabled]; 
     sfToolItemTextHot: Result := TSeStyle(FSource).Fonts[ktfToolItemTextHot]; 
     sfToolItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfToolItemTextNormal]; 
     sfToolItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfToolItemTextSelected]; 
     sfTreeItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextDisabled]; 
     sfTreeItemTextFocused: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextFocused]; 
     sfTreeItemTextHot: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextHot]; 
     sfTreeItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextNormal]; 
     sfTreeItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextSelected]; 
     sfWindowTextDisabled: Result := TSeStyle(FSource).Fonts[ktfWindowTextDisabled]; 
     sfWindowTextNormal: Result := TSeStyle(FSource).Fonts[ktfWindowTextNormal]; 
     else Result := SystemFont; 
     end; 
    end 
    else Result := SystemFont; 
end; 

initialization 

    InitializeSystemFont; 

finalization 

    SystemFont.Free; 

end. 
+0

답장을 보내 주셔서 감사합니다, Dalija. 실제로 이것은 MainForm에서 정의하고 응용 프로그램의 기본 글꼴과 같은 것을 구성하고'ParentFont' 속성을 활성화하여 각 하위 컨트롤을 스타일링함으로써 꽤 잘 작동합니다. 안타깝게도 앱의 컨텍스트 또는 응용 프로그램 메뉴 스타일을 쉽게 지정할 수있는 방법이 아닙니다. –

+1

'HintFont','IconFont','MenuFont','MessageFont' 및'CaptionFont' 속성을 사용하여 다른 응용 프로그램 글꼴 모양을 바꿀 수 있습니다. –

+0

고마워요! 이것은 내 TPopUpMenus에서 작동합니다. 아마도'Screen.MenuFont' 속성을 적용하려면 OwnerDraw : = True' 속성을 설정해야한다고 언급해야합니다. 글꼴 크기를 변경하면 MenuItems의 높이가 올바르게 파생되지 않습니다. 이 문제는 TMenuItem의 OnMeasureItem 이벤트를 사용하여 해결할 수 있습니다. –