Программа для племянниц: ABC, часть 2, выбор шрифта


Автор: Рэймонд Чен.
Оригинал статьи: A program for my nieces: The ABCs, part 2, choosing a font.

В свою программу ABC я добавил возможность, которую ни разу не использовал: выбор шрифта. Я добавил её на случай, если племянницам не понравится мой шрифт.

Вся работа выполняется внутри функции Choose­Font, надо только вызвать её.

#include <commdlg.h>

void ChangeFont(HWND hwnd)
{
  LOGFONT lf;
  GetObject(g_hfEdit, sizeof(lf), &lf);
  CHOOSEFONT cf = { sizeof(cf) };
  cf.hwndOwner = hwnd;
  cf.lpLogFont = &lf;
  cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
  if (ChooseFont(&cf)) {
    HFONT hfNew = CreateFontIndirect(&lf);
    if (hfNew) {
      DeleteObject(g_hfEdit);
      g_hfEdit = hfNew;
      SetWindowFont(g_hwndChild, g_hfEdit, TRUE);
    }
  }
}

Я инициализирую LOGFONT из текущего шрифта и передаю в диалог выбор шрифта, . Если пользователь выбирает шрифт, функция Choose­Font помещает результат в ту же самую переменную LOGFONT, и я использую её, чтобы создать новый шрифт и установить его для текстового поля.

Остальное просто вызов этой функции.

void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
  switch (id) {
  case 1:
    ChangeFont(hwnd);
    break;
 }
}
...
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);

Мы вызываем обработчик WM_COMMAND, который меняет шрифт по команде номер 1.

Привязываем команду к секретному сочетанию клавиш Ctrl+F.

// scratch.rc
1 ACCELERATORS
BEGIN
 "F", 1, VIRTKEY, NOINVERT, CONTROL
END

// scratch.cpp

...
    ShowWindow(hwnd, nShowCmd);

    HACCEL hacc = LoadAccelerators(hinst, MAKEINTRESOURCE(1));
    while (GetMessage(&msg, NULL, 0, 0)) {
      if (!TranslateAccelerator(hwnd, hacc, &msg)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    }
    DestroyAcceleratorTable(hacc);
...

Теперь можно менять шрифт на лету. Как я уже сказал, эта возможность была добавлена заранее, но оказалась невостребованной.

В следующий раз мы обсудим изменения, вызванные действительными проблемами использования программы.

Реклама
Запись опубликована в рубрике перевод, программирование с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s