font gui w windows

Odpowiedz Nowy wątek
2020-06-27 23:13

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0

Jak wyciągnąć aktualną nazwę podstawowego fonta gui w windows, czyli tego z okien dialogowych, oznaczanego symbolicznie 'MS shell Dlg'?

1.LOGFONT z GetObject nie działa - podaje nadal face name = 'MS shell Dlg'.

  1. OUTLINETextMetrics - to samo...

  2. SystemParametersInfo - chyba też nie ma tam tego:
    https://docs.microsoft.com/en[...]winuser-systemparametersinfoa

  3. GetSystemMetrics... też nie ma.
    https://docs.microsoft.com/en[...]r/nf-winuser-getsystemmetrics

Kiedyś to znalazłem, ale zapomniałem jaka to funkcja była.

Pozostało 580 znaków

2020-06-29 21:37
Moderator Kariera

Rejestracja: 2 lata temu

Ostatnio: 55 sekund temu

Lokalizacja: Poznań

0

Albo niech @Stefan_3N gdzieś wrzuci i udostępni link do swojego EXE. Wtedy będzie pewność, że mamy takie same warunki do prowadzenia eksperymentu, a ewentualne różnice zależą od wersji systemu a nie od inaczej napisanego kodu.


Naczelny forumowy hejter Apple

That game of life is hard to play, I'm gonna lose it anyway
The losing card I'll someday lay, So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2020-06-29 21:37

Pozostało 580 znaków

2020-06-29 22:09

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0
  TEXTMETRIC tm;
   LOGFONT lf;

   TClientDC dc(HWindow);
   if( !rFont ) // rFont = new TFont((HFONT)Parent->HandleMessage(WM_GETFONT));
    {
      TFont *f = new TFont((HFONT)Parent->HandleMessage(WM_GETFONT)); // font z dialogu, czyli 'MS Shell Dlg'

//      dc.SelectObject(*f);
      f->GetObject(lf);
      delete f;

      lf.lfHeight = -MulDiv(9, GetDeviceCaps(dc, LOGPIXELSY), 72); // powiększam sobie z 8 na 9, lub 10...

      lf.lfWidth = 0; // szer. standardowa 

      strcpy(lf.lfFaceName, "Segoe UI"); // albo 'Tahoma' -> z tym jest ok, tyle że nie znamy poprawnej nazwy!

      rFont = new TFont(&lf);
    }

   dc.SelectObject(*rFont); // to jest konieczne do uzyskania textMetrics
   dc.GetTextMetrics( tm );

//   OUTLINETEXTMETRIC *po = (OUTLINETEXTMETRIC*)Buf;
//   dc.GetOutlineTextMetrics(1000, *po); tu są nadal bzdury...

   if( !BoldFont ) // wersja pogrubiona
    {
      rFont->GetObject(lf);

//    
      lf.lfWeight = FW_SEMIBOLD; // = 600; bold=700
      lf.lfWidth = 0; // szerokość domyśla 

  //    strcpy(lf.lfFaceName, "Tahoma"); z tym będzie ok.

      BoldFont = new TFont(&lf); // tworzy font, ale to jest do dupy...
    }

Pozostało 580 znaków

2020-06-29 22:22

Rejestracja: 1 rok temu

Ostatnio: 1 minuta temu

1

Powinieneś odczytać font z kontrolki, a nie z dialogu.
Wykonaj ten kod (on jest w WINAPI, ale jak wkleisz wprost gdzieś w Twój program, to też powinien się wykonać. hInstance, to globalna HINSTANCE)

HWND test=CreateWindow("SysTreeView32","",WS_POPUP, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); //tworzysz kontrolkę tylko po to, żeby z niej odczytać krój
HFONT hFont=(HFONT)SendMessage(test, WM_GETFONT, 0, 0);
if(hFont){
    LOGFONT lf;
    GetObject(hFont, sizeof(lf), &lf);
    MessageBox(NULL, lf.lfFaceName, "", MB_OK);
}
DestroyWindow(test);

edytowany 1x, ostatnio: Stefan_3N, 2020-06-29 22:22

Pozostało 580 znaków

2020-06-29 22:33

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0

Tak też nie działa.

font = HandleMessage(WM_GETFONT); // z samej kontrolki w dialogu

i tu mam: font = 0, czyli nie ma go wcale!

To musi być kontrolka, która używa kroju, np. ListView (tam krój jest wykorzystywany do wypisywania nagłówków lub podpisów pod ikonami). - Stefan_3N 2020-06-29 22:35
Jeśli nie masz takiej kontrolki w dialogu, to ją utwórz "w locie" i potem usuń. Sprawdzałem na ListView i TreeView, obie zwracają co trzeba. - Stefan_3N 2020-06-29 22:38
całe okienko/dialog jest tworzony za pomocą CreateDialog; na podstawie wzorca z resurców: .rc, ja tu nic nie tworzę w kodzie - to się samo robi, znaczy system tworzy te kontrolki! - bonifacy 2020-06-29 23:01
:-) No fajnie. System tworzy, a Ty nie możesz? Dwa rozwiązania. Dodaj do zasobów taką kontrolkę, odczytaj krój i potem ją ukryj. Ale to bez sensu. Wykonaj po prostu ten kod, który Ci podałem gdzieś przy starcie programu (w jakimś SetupWindow, czy co tam masz w tej bibliotece). Wykonaj ten kod, zapamiętaj krój globalnie i zamknij ten temat :-). Po co masz to robić w każdym dialogu? - Stefan_3N 2020-06-29 23:07
Przypatrz się dobrze tej bibliotece, w której to piszesz. Z pewnością masz tam do kontrolek kilka konstruktorów. Masz konstruktory do tworzenia z zasobów i masz do tworzenia bez zasobów, więc jak chcesz, to możesz ten mój kod przerobić na taki "biblioteczny". Będzie to coś takiego TListView* test=new TListView(PARENT, ID, X, Y, W, H), albo coś podobnego. I do tak utworzonej kontrolki wyślij komunikat WM_GETFONT, a potem odczytaj tę strukturę. - Stefan_3N 2020-06-29 23:16

Pozostało 580 znaków

2020-06-29 23:28

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0

Być może ta metoda działa w oknie, do którego jawnie tworzono font + SetFont,
co znaczy że gdzieś w kodzie było użyte jawnie: fontName = Segoe UI i + CreateFont.

Zatem w dialogach to raczej nie zadziała.

Uff. Ale jesteś uparty :-). Odpowiedz mi tylko - czy wkleiłeś dokładnie ten mój kod w swój kod (np. po twoim wierszu LOGFONT lf, a przed TClientDC? Wkleiłeś i spróbowałeś to skompilować? Jakieś błędy kompilacji? Jakie? - Stefan_3N 2020-06-29 23:33

Pozostało 580 znaków

2020-06-29 23:42

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

1

chyba znalazłem poprawne rozwiązanie - bez zbędnych akrobacji.
https://docs.microsoft.com/en[...]ngdi/nf-wingdi-getstockobject

"It is not recommended that you employ this method to obtain the current font used by dialogs and windows. Instead, use the SystemParametersInfo function with the SPI_GETNONCLIENTMETRICS parameter to retrieve the current font. SystemParametersInfo will take into account the current theme and provides font information for captions, menus, and message dialogs."

Pozostało 580 znaków

2020-06-30 02:21

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0

To jednak jest bzdura z tym Segoe.

Czcionka w dialogach - etykiety, napisy na przyciskach, itp.,
to nie jest wcale Segoe, ani Tahoma...

nie wiem co to jest - jest trochę inna... chyba Microsoft Sans Serif.

Czy chcesz to nadal zrobić? czy tylko dzielisz się wrażeniami? - Stefan_3N 2020-06-30 02:49
Co tu jest robienia? Nie można wyciągnąć tego fonta, więc pozostaje to zakodować na beton: Sans Serif tyle. - bonifacy 2020-06-30 21:03
Oczywiście, że można, bo robię to na co dzień. Twój problem, że nie słuchasz. - Stefan_3N 2020-06-30 21:05

Pozostało 580 znaków

2020-06-30 22:35

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

0

A jednak: tam jest faktycznie "Microsoft Sans Serif", a nie żadne Segoe!

przykład:


     lf.lfHeight = MulDiv(-9, GetDeviceCaps(dc, LOGPIXELSY), 72);
     strcpy(lf.lfFaceName, "MS Shell Dlg"); // domyślny font dla dialogów!

     lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
     lf.lfQuality = PROOF_QUALITY;
//     lf.lfPitchAndFamily = FF_SWISS;
    }

   helvFont = CreateFontIndirect(&lf);

// pobieramy parametry tej czcionki
   dc.SelectObject(helvFont);
   TEXTMETRIC tm;
   dc.GetTextMetrics(tm);

// a teraz wyciskamy z tego faktyczną nazwę czcionki:
   OUTLINETEXTMETRIC *po = (OUTLINETEXTMETRIC*)buf;
   dc.GetOutlineTextMetrics(1024, *po); 

i tam to widać...

Napiszę po raz ostatni - zrób to nie dla dialogu, ale dla ListView. Jeśli nie potrafisz stworzyć takiej kontrolki (bo przecież jak napisałeś kontrolki tworzy system), to najpierw dowiedz się jak "ręcznie" stworzyć kontrolkę, potem ją stwórz i odczytaj jaki ma font. To tyle w tym temacie. - Stefan_3N 2020-06-30 22:47
Zależy w czym to utworzysz: jeśli w dialogu, wtedy będzie tam Microsoft Sans Serif, nie Segoe - sam sprawdź to sobie. Segoe wygląda inaczej - znacznie gorzej, zwłaszcza dla większych rozmiarów: 10, 12... - bonifacy 2020-06-30 23:00
Sprawdziłem :-). Powiększyłem na pół ekranu i porównałem z wikpedią. Kontrolki nie musisz tworzyć w dialogu. Utwórz ją przy starcie programu (kontrolka nie musi mieć stylu WS_CHILD, możesz dać WS_POPUP), odczytaj krój, zapamiętaj, usuń tę kontrolkę, a potem wykorzystaj zapamiętaną nazwę. To na razie. - Stefan_3N 2020-06-30 23:04
Bzdury opowiadasz. Kontrolka przejmuje font z okna, w którym go tworzysz... - bonifacy 2020-06-30 23:40

Pozostało 580 znaków

2020-07-01 02:28

Rejestracja: 1 miesiąc temu

Ostatnio: 12 godzin temu

1

drobna uwaga: font 'Microsoft Sans Serif' jest zrypany.

https://ibb.co/GT77jRr

litera ł ma błędną szerokość dla rozmiaru: 13 i 19 (pikseli), co tam zaznaczyłem.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0