使用CFontDialog常用对话框的正确方法是什么?

时间:2017-02-26 01:52:51

标签: mfc

我最近更改了MFC应用程序的窗口范围和视图端口之间的关系,从那时起,每次我更改应用程序字体大小时,即使我选择了最小的字体,所选字体也会变得超级巨大大小

(编辑:我注意到CFontDialog::GetSize()返回的大小是对话框中所选大小的十倍。这是一种通常的行为吗?如果不是什么可以使对话返回这样的值?虽然我不是当然,但似乎这个尺寸的倍增似乎是我的问题。如果确实存在问题,我如何让CFontDialog::GetSize()返回实际选定的尺寸?)

我做错了什么?使用CFontDialog的正确方法是什么?

接下来显示的是字体更改代码的片段:

CClientDC dc(pView);
pView->OnPrepareDC(&dc)

pLastFont = pLastText->GetFont();
oldColor = pLastText->GetColor();

LOGFONT logFont = (LOGFONT) (*pLastFont);
CFontDialog fontDialog(&logFont);

CSize szPrevSize;

//Some missing codes
MyFigure *pMyFigure;

if(dynamic_cast<MyTextFigure*>(pMyFigure) != NULL)
{
    if(dynamic_cast<MyTextBoxFigure*>(pLastText) != NULL)
    {
        MyTextBoxFigure *pTextBox = dynamic_cast<MyTextBoxFigure*>(pLastText);
        szPrevSize = pTextBox->GetTextSize();
    }
}
else if(dynamic_cast<MyTableFigure*>(pMyFigure) != NULL)
{
    MyTableFigure *pTableFigure = dynamic_cast<MyTableFigure*>(pMyFigure);
    TCell *pCell = (TCell *)*pTableFigure;
    szPrevSize = pCell->GetTextSize();
}

    fontDialog.m_cf.rgbColors = (COLORREF) oldColor;
if (fontDialog.DoModal() == IDOK)
{

      fontDialog.GetCurrentFont(&logFont);
      MyFont newFont = (MyFont) logFont;
      MyColor newColor = (MyColor) fontDialog.GetColor();
      pMyFigure->SetFont(newFont, &dc);
      pMyFigure->SetColor(newColor);

}

请注意MyFontLOGFONT结构的包装器,并且有一个运算符可以转换为LOGFONT。另请注意,MyFigure类具有MyFont数据成员,该成员由成员函数SetFont设置。

以下代码显示了如何设置视口和窗口范围之间的关系。

void CDisplayView::OnInitialUpdate()
{

    CRect rcClient;
    GetClientRect(&rcClient);
    CClientDC dc(this);

    dc.SetMapMode(MM_ISOTROPIC);

    CSize szWindow(m_pAppDoc->GetZoomRatio() * SCALE_RATIO * dc.GetDeviceCaps(HORZRES),m_pAppDoc->GetZoomRatio() * SCALE_RATIO * dc.GetDeviceCaps(VERTRES));
    CSize szViewport(dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES));

    dc.SetWindowExt(szWindow);
    dc.SetViewportExt(szViewport);

    dc.DPtoLP(&rcClient);


    //And so on
}

ZoomRatio为1,SCALE_RATIO为1.2

赋值运算符是:

MyFont& MyFont::operator=(const MyFont& font)
{
   if (this != &font)
   {
      m_logFont = font.m_logFont;
   }

   return *this;
}

P.S。 代码摘要是:

LOGFONT OldlogFont ;
LOGFONT newLogFont;

COLLORREF OldColorref;
COLORREF newColorref;

CFontDialog fontDialog(&OldlogFont);
fontDialog.m_cf.rgbColors = oldColorref;

if (fontDialog.DoModal() == IDOK)
{
  fontDialog.GetCurrentFont(&OldlogFont);
  newLogFont = OldlogFont;
  newColorref = fontDialog.GetColor();
}

这里的重点是LOGFONT结构。 使用旧的logfont获取用户选择的值,然后将其分配给新的logfont。

出于调试目的,我检索了所选字体的大小,并惊讶地发现它是我在申请CFontDialog后使用的大小的十倍,即

LOGFONT OldlogFont ;
LOGFONT newLogFont;

COLLORREF OldColorref;
COLORREF newColorref;

CFontDialog fontDialog(&OldlogFont);
fontDialog.m_cf.rgbColors = oldColorref;

if (fontDialog.DoModal() == IDOK)
{
  fontDialog.GetCurrentFont(&OldlogFont);
  newLogFont = OldlogFont;
  newColorref = fontDialog.GetColor();

   int iFontSize = fontDialog.GetSize();
   //when I selected a font size of 10 from the dialog, what I get   here in my code is 100.
}

1 个答案:

答案 0 :(得分:0)

我就是这样做的:

void CExportSettingsDlg::OnBtnSelectFont()
{
    CClientDC   dc(this);

    m_plfCurrentFont->lfHeight =
        -MulDiv(m_plfCurrentFont->lfHeight, dc.GetDeviceCaps(LOGPIXELSY), 72);

    CMyFontDialog   dlgFont( m_plfCurrentFont );

    dlgFont.m_cf.Flags |= CF_NOSCRIPTSEL;
    dlgFont.m_cf.rgbColors = m_crCurrentFontColour;

    if( dlgFont.DoModal() == IDOK)
    {
        m_plfCurrentFont->lfHeight = -(dlgFont.GetSize()/10);

        // We must retrieve the font colour into the correct variable.
        // The logfont is already correct because we passed in the
        // logfont pointer into the font dialogue.
        switch( m_iFontType )
        {
        case FONT_TITLE:
            m_sSettings.crTitleFontColour = dlgFont.GetColor();
            break;
        case FONT_HEADING:
            m_sSettings.crHeadingFontColour = dlgFont.GetColor();
            break;
        case FONT_GENERAL:
            m_sSettings.crGeneralFontColour = dlgFont.GetColor();
            break;
        case FONT_EVENT:
            m_sSettings.crEventFontColour = dlgFont.GetColor();
            break;
        case FONT_NOTES:
            m_sSettings.crNotesFontColour = dlgFont.GetColor();
            break;
        }

        // Update display
        SetSampleFont();

        // Html Preview
        UpdatePreviewHtml();
    }
}

如果它没有回答你的问题,我将删除答案。请注意我是如何在代码开头设置字体大小的。

如果您在GetSize的MSDN上阅读,请说明:

  

字体的大小,以十分之一为单位