2016-03-18 74 views
4

某些字體只有中等和粗體的重量。鑑於下面的代碼,我必須一起避免TFontDialog? 從對話框中選擇樣式中時,它會返回重量500套樣式BOLD。如果我保存此樣式並打開TFontDialog,則它現在被設置爲BOLD。如何使用TFontDialog設置中等重量的字體?

FW_THIN = 100; 
    {$EXTERNALSYM FW_EXTRALIGHT} 
    FW_EXTRALIGHT = 200; 
    {$EXTERNALSYM FW_LIGHT} 
    FW_LIGHT = 300; 
    {$EXTERNALSYM FW_NORMAL} 
    FW_NORMAL = 400; 
    {$EXTERNALSYM FW_MEDIUM} 
    FW_MEDIUM = 500; 
    {$EXTERNALSYM FW_SEMIBOLD} 
    FW_SEMIBOLD = 600; 
    {$EXTERNALSYM FW_BOLD} 
    FW_BOLD = 700; 
    {$EXTERNALSYM FW_EXTRABOLD} 
    FW_EXTRABOLD = 800; 
    {$EXTERNALSYM FW_HEAVY} 
    FW_HEAVY = 900; 

    {$EXTERNALSYM FW_REGULAR} 
    FW_REGULAR = FW_NORMAL; 

    procedure TFontDialog.UpdateFromLogFont(const LogFont: TLogFont); 
    var 
     Style: TFontStyles; 
    begin 
     with LogFont do 
     begin 
     Font.Name := LogFont.lfFaceName; 
     Font.Height := LogFont.lfHeight; 
     if FFontCharsetModified then 
      Font.Charset := TFontCharset(LogFont.lfCharSet); 
     Style := []; 
     with LogFont do 
     begin 
      if lfWeight > FW_REGULAR then Include(Style, fsBold); 
      if lfItalic <> 0 then Include(Style, fsItalic); 
      if lfUnderline <> 0 then Include(Style, fsUnderline); 
      if lfStrikeOut <> 0 then Include(Style, fsStrikeOut); 
     end; 
     Font.Style := Style; 
     end; 
    end; 
+0

根據該代碼,是的 - TFontDialog不會爲你工作,因爲任何字體加權> FW_REGULAR只是將'fsBold'加到'Font.Style'上,並且沒有考慮其他的字體權重。這意味着權重<= FW_REGULAR不會是粗體,並且> FW_REGULAR將是,沒有其他考慮。 –

+0

請注意,這是'TFontDialog'本身的限制,而不是底層的Win32'ChooseFont()'API。 VCL沒有字體的「中等」風格概念,字體不是粗體就是粗體。 –

回答

0

不幸的是,這TFontDialog可從VCL沒有這個一無所知,也沒有在Delphi中TFont。 VCL只承認粗體或不粗體,沒有中間的字體權重。你將不得不繞過這些,並實現你自己的對話框和字體對象來完成這些功能。

+1

你真的需要跳過TCanvas嗎?我希望你可以創建你的字體,將句柄分配給TFont,然後從那裏返回到VCL。做TFont或TCanvas「正常化」的字體適合VCL字體屬性或東西? –

+0

確實Rob,我希望能夠通過WinAPI獲得價值來設置Canvas.Font.Handle。之後,只要不改變'Font'屬性,該句柄將用於繪製。 – NGLN

+0

這是我期望聽到的,只是希望得到另一種解決方案。還沒有弄清楚如何填寫「字體樣式」選項。有時它會有更多的選擇,然後Font.Style允許。 –

相關問題