MFC: динамически изменять размер шрифта управления? - PullRequest
5 голосов
/ 01 октября 2011

У меня есть класс CListCtrl, для которого я хотел бы легко изменить размер шрифта.Я переклассифицировал CListCtrl как MyListControl.Я могу успешно установить шрифт, используя этот код в обработчике события PreSubclassWindow:

void MyListControl::PreSubclassWindow()
{
    CListCtrl::PreSubclassWindow();

    // from http://support.microsoft.com/kb/85518
    LOGFONT lf;                        // Used to create the CFont.

    memset(&lf, 0, sizeof(LOGFONT));   // Clear out structure.
    lf.lfHeight = 20;                  // Request a 20-pixel-high font
    strcpy(lf.lfFaceName, "Arial");    //    with face name "Arial".
    font_.CreateFontIndirect(&lf);    // Create the font.
    // Use the font to paint a control.
    SetFont(&font_);
}

Это работает.Тем не менее, я хотел бы создать метод SetFontSize (int size), который просто изменит существующий размер шрифта (оставив лицо и другие характеристики как есть).Поэтому я считаю, что этот метод должен был бы получить существующий шрифт, а затем изменить размер шрифта, но мои попытки сделать это потерпели неудачу (это убивает мою программу):

void MyListControl::SetFontSize(int pixelHeight)
{
    LOGFONT lf;                        // Used to create the CFont.

    CFont *currentFont = GetFont();
    currentFont->GetLogFont(&lf);
    LOGFONT lfNew = lf;
    lfNew.lfHeight = pixelHeight;                  // Request a 20-pixel-high font
    font_.CreateFontIndirect(&lf);    // Create the font.

    // Use the font to paint a control.
    SetFont(&font_);

}

Как мне создать этот метод?1007 *

1 Ответ

4 голосов
/ 01 октября 2011

Я нашел рабочее решение. Я открыт для предложений по улучшению:

void MyListControl::SetFontSize(int pixelHeight)
{
    // from http://support.microsoft.com/kb/85518
    LOGFONT lf;                        // Used to create the CFont.

    CFont *currentFont = GetFont();
    currentFont->GetLogFont(&lf);
    lf.lfHeight = pixelHeight;
    font_.DeleteObject();
    font_.CreateFontIndirect(&lf);    // Create the font.

    // Use the font to paint a control.
    SetFont(&font_);
}

Два ключа, чтобы заставить это работать:

  1. Удаление копии LOGFONT, lfNew.
  2. Вызов font_.DeleteObject(); перед созданием нового шрифта. Видимо, уже не может быть существующего объекта шрифта. Есть некоторый ASSERT в коде MFC, который проверяет существующий указатель. Именно этот ASSERT и стал причиной сбоя моего кода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...