BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; //устанавливаем позицию главного окна запомненную ранее, если это возможно if (m_OnGetInitialPos) { CPoint point; m_OnGetInitialPos(point); if (point.x != std::numeric_limits<int>::max() && point.y != std::numeric_limits<int>::max()) { cs.x = point.x; cs.y = point.y; } } //устанавливаем необходимый размер главного окна. Windows непонятным образо м масштабирует диалоги (непропорционально DPI), поэтому //для каждого DPI подгоняем размеры DPIAware dpia; switch(dpia.GetDPIX()) { case 72: cs.cx = dpia.ScaleX(965); break; default: case 96: cs.cx = dpia.ScaleX(730); //OK break; case 120: cs.cx = dpia.ScaleX(765); break; case 144: cs.cx = dpia.ScaleX(795); //OK break; case 192: cs.cx = dpia.ScaleX(730); break; } switch(dpia.GetDPIY()) { case 72: cs.cy = dpia.ScaleY(580); break; default: case 96: cs.cy = dpia.ScaleY(455); break; } cs.style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.dwExStyle |= WS_EX_CONTROLPARENT; cs.lpszClass = AfxRegisterWndClass(0); return TRUE; }
bool FNT_HELPERS_API CloneWndFont(CWnd* ip_wnd, CFont* op_newFnt, LONG height, bool bold /*= false*/) { if (!ip_wnd || !op_newFnt) return false; CFont* p_font = ip_wnd->GetFont(); if (!p_font) return false; if (op_newFnt->m_hObject) op_newFnt->DeleteObject(); // Create font for 96 DPI. LOGFONT lf; p_font->GetLogFont(&lf); // Set other LOGFONT values as appropriate. lf.lfHeight = -MulDiv(height, 96, 72); lf.lfWeight = bold ? FW_BOLD : FW_NORMAL; CFont tmpFont; VERIFY(tmpFont.CreateFontIndirect(&lf)); // Scale the tmHeight; create target font. TEXTMETRIC tm; CDC *pDC = ip_wnd->GetDC(); CFont* fontOld = pDC->SelectObject(&tmpFont); pDC->GetTextMetrics(&tm); pDC->SelectObject(fontOld); tmpFont.DeleteObject(); ip_wnd->ReleaseDC(pDC); DPIAware da; lf.lfHeight = da.ScaleY(tm.tmHeight); op_newFnt->CreateFontIndirect(&lf); return true; }