Конференция "WinAPI" » Получить параметры установленных в системе шрифтов
 
  • Rouse_ © (19.01.16 22:00) [0]
    Ребят, пардон, чтой-то я пробуксовываю малехо или уже подзабыл.
    Вот в системе есть шрифт назначенный меню (имя/размер) окну, заголовку.
    В ХР это все было настраиваемое даже, в отличие от семерки и выше (где все захардкоренно на Темах).
    Но вот забыл - а как получить параметры шрифта для каждого элемента?

    Вот так, к примеру под восьмеркой, вытаскивается что-то не то:
    procedure TFontManager.LoadSystemFont;
    var
     ncm: TNonClientMetrics;
    begin
     ncm.cbSize := TNonClientMetrics.SizeOf;
     SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @ncm, 0);
     FFontNames[fmsSystem] := PChar(@ncm.lfMessageFont.lfFaceName[0]);
     FFontSizes[fmsSystem] := ncm.lfMessageFont.lfHeight;
    end;



    В частности я назначаю шрифт связанный с иконками 15 размер и жирный, и в проводнике все становится таким шрифтом, а как мне вытащить этот параметр в свое приложение?
    Пните плз в правильную сторону.
  • Eraser © (20.01.16 02:17) [1]

    > Rouse_ ©   (19.01.16 22:00) 


    > В ХР это все было настраиваемое даже, в отличие от семерки
    > и выше (где все захардкоренно на Темах).

    настраиваемо даже в десятке ) просто запрятали со знанием дела
    https://dl.dropboxusercontent.com/u/26403307/2016-01-20_2-13-56.png


    > Но вот забыл - а как получить параметры шрифта для каждого
    > элемента?

    первое что попалось - через wmi
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa394121(v=vs.85).aspx

    может как-то еще можно.
  • Rouse_ © (20.01.16 09:25) [2]
    "Minimum supported client - Windows Vista", мне бы начиная с ХР - блин ну точно должна же быть Апишка :)
  • Игорь Шевченко © (20.01.16 10:54) [3]
    "Minimum supported client - Windows Vista"

    Это они сейчас пишут, потому что XP не поддерживают. А функциональность может и в win2k быть
  • Rouse_ © (20.01.16 12:36) [4]
    Да Игорь, я в курсе, но я чуть уточню цитированием: "
    В частности я назначаю шрифт связанный с иконками 15 размер и жирный, и в проводнике все становится таким шрифтом, а как мне вытащить этот параметр в свое приложение? "
  • NoUser © (20.01.16 13:18) [5]
    HKCU\Control Panel\Desktop\WindowMetrics\ nnnFont's


    правда, в каком оно там формате не знаю.
  • Игорь Шевченко © (20.01.16 13:31) [6]
    Rouse_ ©   (20.01.16 12:36) [4]

    https://technet.microsoft.com/en-us/library/cc951790.aspx

    Мне конечно не нравится идея с реестром, но функции не увидел.
  • NoUser © (20.01.16 13:58) [7]
    хм, походу
    tagLOGFONTW

  • Dmk © (22.01.16 20:09) [8]
  • Dmk © (22.01.16 20:26) [9]
    По крайней мере такой код работает:
     lpNCM: TNonClientMetrics;
     lpWriteToWinIni: dword;
     lpS: string;

    begin
     lpWriteToWinIni := 0; //в WinIni не пишем
     FillChar(lpNCM, SizeOf(lpNCM), 0);
     lpNCM.cbSize := SizeOf(lpNCM);
     if not SystemParametersInfo(SPI_GETNONCLIENTMETRICS, lpNCM.cbSize, @lpNCM, lpWriteToWinIni) then RaiseLastOSError;
     lpS := Array2String(lpNCM.lfMenuFont.lfFaceName);
     MessageBox(Handle, PChar(lpS), 'Menu font', MB_OK or MB_ICONINFORMATION);

  • Rouse_ © (23.01.16 17:21) [10]

    > Dmk ©   (22.01.16 20:26) [9]

    Ну это то что я в самом начале показал, а вот предыдущая ссылка интересная, поразбираюсь - спасибо.
  • Dimka Maslov © (25.01.16 12:48) [11]
    function GetFontFunc(Shift: Integer): HFONT;
    var
     NCM: TNonClientMetrics;
     LF: PLogFont;
    begin
     NCM.cbSize := SizeOf(NCM);
     if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NCM, 0) then begin
       LF := IncPtr(@NCM, Shift);
       LF.lfCharSet := DefaultCharset;
       Result := CreateFontIndirect(LF^);
     end else begin
       Result := GetStockObject(SYSTEM_FONT);
     end;
    end;

    function SmallCaptionFont: HFONT;
    var
     NCM: TNonClientMetrics;
    begin
     Result := GetFontFunc(Integer(LONG_PTR(@NCM.lfSmCaptionFont)-LONG_PTR(@NCM)));
    end;

    function CaptionFont: HFONT;
    var
     NCM: TNonClientMetrics;
    begin
     Result := GetFontFunc(Integer(LONG_PTR(@NCM.lfCaptionFont)-LONG_PTR(@NCM)));
    end;

    function MenuFont: HFONT;
    var
     NCM: TNonClientMetrics;
    begin
     Result := GetFontFunc(Integer(LONG_PTR(@NCM.lfMenuFont)-LONG_PTR(@NCM)));
    end;

    function MessageFont: HFONT;
    var
     NCM: TNonClientMetrics;
    begin
     Result := GetFontFunc(Integer(LONG_PTR(@NCM.lfMessageFont)-LONG_PTR(@NCM)));
    end;

    function StatusFont: HFONT;
    var
     NCM: TNonClientMetrics;
    begin
     Result := GetFontFunc(Integer(LONG_PTR(@NCM.lfStatusFont)-LONG_PTR(@NCM)));
    end;


    Давным давно написал такое и до сих пор всё работает. Даже на восьмёрке и десятке (проверил лично только что). Надо только потом назначить Handle объекту TFont и получить данные из него.
  • Дмитрий К © (25.01.16 14:04) [12]

    > шрифт связанный с иконками

    SPI_GETICONTITLELOGFONT
  • Rouse_ © (25.01.16 17:11) [13]

    > Дмитрий К ©   (25.01.16 14:04) [12]
    >
    > > шрифт связанный с иконками
    >
    > SPI_GETICONTITLELOGFONT

    О как, проверю, вроде оно, видать пропустил...
 
Конференция "WinAPI" » Получить параметры установленных в системе шрифтов
Есть новые Нет новых   [134427   +34][b:0][p:0.001]