"AND" "OR"
Главная Информер Журнал Форум

Как вычислить высоту Edit Control, чтобы изменить его размер

Когда программа изменяет шрифт в окне редактирования, ей необходимо вычислить новую высоту окна редактирования, чтобы шрифт отобразился правильно. Если edit control содержит бордюр, то элемент управления должен автоматически добавить белое пространство, чтобы текст не наезжал на бордюр.

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

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

Пример кода

   void ResizeEdit(HWND hwndEdit, HFONT hNewFont)
   {
      HFONT       hSysFont,
                  hOldFont;
      HDC         hdc;
      TEXTMETRIC  tmNew,
                  tmSys;
      RECT        rc;
      int         nTemp;

      // Получаем DC для edit control.
      hdc = GetDC(hwndEdit);

      // Получаем метрики системного шрифта.
      hSysFont = GetStockObject(SYSTEM_FONT);
      hOldFont = SelectObject(hdc, hSysFont);
      GetTextMetrics(hdc, &tmSys);

      // Получаем метрики для нового шрифта.
      SelectObject(hdc, hNewFont);
      GetTextMetrics(hdc, &tmNew);

      // Возвращаем первоначальный шрифт в DC и освобождаем DC.
      SelectObject(hdc, hOldFont);
      DeleteObject(hSysFont);
      ReleaseDC(hwndEdit, hdc);

      // Вычисляем новую высоту для окошка редактирования.
      nTemp = tmNew.tmHeight + (min(tmNew.tmHeight, tmSys.tmHeight)/2) +
      (GetSystemMetrics(SM_CYEDGE) * 2);

      // Изменяем размер окна редактирования.
      GetWindowRect(hwndEdit, &rc);
      MapWindowPoints(HWND_DESKTOP, GetParent(hwndEdit), (LPPOINT)&rc, 2);
      MoveWindow( hwndEdit,
                  rc.left,
                  rc.top,
                  rc.right - rc.left,
                  nTemp,
                  TRUE);
   }