MapDialogRect для несистемных шрифтов
От: my_soul  
Дата: 29.05.07 13:04
Оценка:
Возникла потребность менять размер диалога (и контролов на нем) в зависимости от выбранного шрифта.
Положение и размер контролов задаются в dlu.
Для перевода dlu в pixels по мотивам виндового MapDialogRect была создана своя MapDialogRect:

bool MapDialogRect(CWnd* pWnd, CFont* pFont, LPRECT prc) throw()
{
  if( pWnd == 0 ||
      !::IsWindow(pWnd->GetSafeHwnd()) ||
      prc == 0
    )
  {
    ASSERT(0);
    return false;
  }

  TEXTMETRIC tm = {0};
  CDC* pDC      = pWnd->GetDC();

  if(pDC == NULL)
  {
    ASSERT(0);
    return false;
  }

  CFont* pOldFont = pDC->SelectObject(pFont);

  BOOL result = pDC->GetTextMetrics(&tm);

  pDC->SelectObject(pOldFont);
  pWnd->ReleaseDC(pDC);

  if(!result)
  {
    ASSERT(0);
    return false;
  }

  int baseunitX = tm.tmAveCharWidth ;
  int baseunitY = tm.tmHeight       ;

  prc->left   = MulDiv(prc->left  , baseunitX, 4);
  prc->right  = MulDiv(prc->right , baseunitX, 4);
  prc->top    = MulDiv(prc->top   , baseunitY, 8);
  prc->bottom = MulDiv(prc->bottom, baseunitY, 8);

  return true;
}

bool MapDialogRect(CWnd* pWnd, LPRECT prc) throw()
{
  if( pWnd == 0 ||
      !::IsWindow(pWnd->GetSafeHwnd())
    )
  {
    ASSERT(0);
    return false;
  }

  return MapDialogRect(pWnd, pWnd->GetFont(), prc);
}


Но вот беда.
Захотел я проверить, а правильно ли работает эта функция. Создал пустой диалог с одной кнопкой {0,0,60,16}, передал в ф-ию шрифт Tahoma 8pt как это установлено в винде по умолчанию. Одновременно с этим в редакторе диалогов запустил тест диалога — и сразу видно моя кнопка — короче виндовой, а высота такая же.
В чем проблема? Какой шрифт использовать чтоб проверить правильность? или это не в шрифте дело?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.