Która czcionka jest domyślna dla kontrolek MFC Dialog?

Poniższy obrazek (powiększony, więc lepiej zobaczyć różnice) pokazuje różnice czcionek pomiędzy dynamicznie utworzonymi kontrolkami edycji (dwa górne przykłady) i kontrolkami edycji utworzonymi z edytora dialogowego (dolny przykład). Jak Mogę sprawić, by czcionka dynamicznie tworzonych kontrolek CEdit wyglądała jak domyślna (poniższy przykład)?

Tutaj wpisz opis obrazka

Stworzyłem kontrolki CEdit jak poniżej:

obj->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
              WS_CHILD | WS_VISIBLE | WS_TABSTOP,
              rect.left, rect.top, rect.Width(), rect.Height(),
              GetSafeHwnd(), reinterpret_cast<HMENU>(mId));

obj->SetFont(&mFont); // mFont was created in the Dialog Constructor
                      // with mFont.CreatePointFont(80, _T("MS Shell Dlg"));

Dzięki za pomoc!

Author: Cody Gray, 2011-05-19

1 answers

Pierwszym przykładem jest użycie czcionki systemowej (SYSTEM_FONT), pobranej z GetStockObject function , która jest czcionką bitmapową, która nie była używana od czasów Windows 3. Więcej informacji można znaleźć na Blog Raymonda Chena oraz Blog Michaela Kaplana .

Drugi przykład to użycie czcionki "MS Shell Dlg" , tak jak prosiłeś. To rzeczywiście mapuje do czcionki o nazwie "Microsoft Sans Serif" lub "MS Sans Serif", czcionki UI z powrotem w dni Windows 95 i 98. Jest to również znane jako DEFAULT_GUI_FONT, która rzeczywiście była dla niego dokładną nazwą, ale niestety, nie jest już dokładna.

Począwszy od Windows 2000 (i kontynuowane w XP), Tahoma była używana jako domyślna czcionka interfejsu użytkownika. To jest to, co widzisz w trzecim przykładzie: Tahoma 8 pkt. Niestety, nawet na tych systemach operacyjnych, "MS Shell Dlg" nie zwraca Tahoma--nadal zwraca MS Sans Serif, dlatego wygląda to źle.

Więc możesz po prostu określ Tahoma jako czcionkę GUI, ale to nie byłoby poprawne, ponieważ złamałaby się ona w starszych wersjach systemu operacyjnego, gdzie Tahoma nie jest zainstalowana lub obsługiwana, lub w obcych wersjach językowych systemu operacyjnego, gdzie inna czcionka jest używana z konieczności. Zamiast tego powinieneś podać flagę DS_SHELLFONT, o której mówi Raymond tutaj.

I wszystko było dobrze i dobrze, dopóki nie wyszedł Windows Vista. A w Windows Vista uprawnienia, które są w Microsofcie zdecydowały Tahoma była trochę za długa, a Windows miał być za kolejną aktualizacją czcionek UI. Opracowali własną specjalną czcionkę o nazwie Segoe UI , rzekomo zaprojektowaną dla optymalnej czytelności na ekranie. I w specjalnym skrócie, zdecydowali, że domyślny rozmiar powinien teraz wynosić 9 pt , zamiast 8 pt, jak było używane przez każdą poprzednią wersję systemu operacyjnego, niezależnie od twarzy czcionki. A Ty byś prawdopodobnie pomyślał, że albo " MS Shell Dlg", "MS Shell Dlg2" lub DS_SHELLFONT (lub wszystkie trzy) dadzą ci nową czcionkę Segoe UI, ale się mylisz.

Uh oh. Teraz sprawy się komplikują... Vista nie tylko używa innej czcionki niż XP, która nie jest łatwo dostępna z uniwersalnym identyfikatorem, ale także używa innego rozmiaru , zmieniając sposób, w jaki twoje okno dialogowe będzie wyglądać na tych systemach, jeśli w ogóle możesz je wyświetlić. W wielu, wielu miejscach, zespół powłoki Windows wydaje się po prostu punt wyzwanie--Tahoma 8 pt jest używana wszędzie , nawet z włączonym motywem Aero, kiedy ma używać Segoe UI 9 pt. Ten rodzaj rzeczy naprawdę sprawia, że interfejs wygląda niepolerowany, a to było przedmiotem wielu nitpickingu we wczesnych dniach Visty. Wydaje się, że większość ludzi o tym zapomniała, ale interfejs użytkownika nie zaczął wyglądać mniej rozproszony i niespójny.

I nie jesteś zespołem powłoki Windows: nie można uciec z tego we własnej aplikacji. W systemie Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System operacyjny Windows Vista System Operacyjny]}

  • użyj Segoe UI, nowej czcionki systemowej Windows Vista.
  • Szanuj ustawienia użytkownika, zawsze odwołując się do czcionek systemowych, rozmiarów i kolorów za pomocą interfejsów API motywów Windows. Nie używaj stałych wartości dla czcionek, rozmiarów ani kolorów.
Szczerze mówiąc, nie słyszałem jeszcze dobrego rozwiązania tego problemu. I podejrzewam że zanim to zrobię, nikt już nie będzie musiał obsługiwać systemu Windows XP (chociaż większość ludzi nie ma całkiem tam } Jeszcze). Ale oto, co robię: wyodrębniam domyślną czcionkę systemową w czasie wykonywania za pomocą SystemParametersInfo function . Na szczęście czcionka okna komunikatów systemowych (lfMessageFont) jest prawidłową czcionką i rozmiarem, niezależnie od bieżącej wersji systemu Windows i wybranego motywu użytkownika.

Mój kod do inicjalizacji okien lub okien dialogowych generalnie wygląda mniej więcej tak ({[9] } jest funkcją pomocniczą, którą napisałem; implementacja jest oczywista):

// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);

// If we're compiling with the Vista SDK or later, the NONCLIENTMETRICS struct
// will be the wrong size for previous versions, so we need to adjust it.
#if(_MSC_VER >= 1500 && WINVER >= 0x0600)
if (!SystemInfo::IsVistaOrLater())
{
    // In versions of Windows prior to Vista, the iPaddedBorderWidth member
    // is not present, so we need to subtract its size from cbSize.
    ncm.cbSize -= sizeof(ncm.iPaddedBorderWidth);
}
#endif

SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
HFONT hDlgFont = CreateFontIndirect(&(ncm.lfMessageFont));

// Set the dialog to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessage(hWnd, WM_SETFONT, (WPARAM)hDlgFont, MAKELPARAM(FALSE, 0));
[14]} lub jeszcze łatwiej w MFC, dzięki poręcznej metodzie SendMessageToDescendants
(m_DlgFont jest obiektem CFont zdefiniowanym dla klasy):
// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
LOGFONT lfDlgFont = ncm.lfMessageFont;
m_DlgFont.CreateFontIndirect(&lfDlgFont);

// Set the dialog and all its controls to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessageToDescendants(WM_SETFONT, (WPARAM)m_DlgFont.m_hFont, MAKELPARAM(FALSE, 0), TRUE);

Jeśli nie używasz MFC, polecam zaimplementowanie własnej rekurencyjnej wersji SendMessageToDescendants. To sprawia, że kod inicjalizacji lot jest prostszy.

 91
Author: Cody Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-02 06:47:00