Возникла потребность менять размер диалога (и контролов на нем) в зависимости от выбранного шрифта.
Положение и размер контролов задаются в 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 как это установлено в винде по умолчанию. Одновременно с этим в редакторе диалогов запустил тест диалога — и сразу видно моя кнопка — короче виндовой, а высота такая же.
В чем проблема? Какой шрифт использовать чтоб проверить правильность? или это не в шрифте дело?