这个问题很困扰。我知道使用 CWnd.SetFont(pFont),但现在问题如下对话框创建多个控件,而且数量不定,可能需要对每个控件设置不同的字体。如果每个控件字体都不一样,是否每个控件,每种字体,都要建立一个 CFont 成员变量?
加上需要设置1000种字体,要添加1000个成员变量啊?这个好像不太现实吧?如果多个控件共用一个 CFont ,这个似乎也不行,因为第一个控件 SetFont()后,第二个控件字体变量要改变字体大小或字体样式,要重新建立字体 CReateFont,而重新建立的字体,则第一个控件的字体就不起作用了,因为已经被第二个控件的字体覆盖了。界面一旦重绘,就发现字体不对了。这个问题如何解决????

解决方案 »

  1.   

    比如
    设置1000个控件,每个控件的字体都不一样,这时,需要建立1000个CFont吗?如果只用一个 CFont,各个控件,各种字体又如何共享?
      

  2.   

    BOOL OnInitdialog()
    {CDialog::OnInitDialog();
    //m_lsCtrl//控件列表
    CFont font = GetFont();//全设成和父窗口字体一样,控件这里用CWnd.要别的自己改
    for (int i = 0; i < 1000; i++)
    {
    CWnd* pWnd = new CWnd();
    pWnd->Create();
    pWnd.SetFont(font);
    m_lsCtrl.add(pWnd);
    }
    }
      

  3.   

    你本来就有1000种字体,所以创建1000次是肯定需要的。
    无非你是觉得1000个成员变量太多。其实你为什么要保存为成员变量呢?
    你完全可以一个成员变量也不要,在初始化对话框的函数里面:
    for (i = 0 i < 1000; ++i)
    {
    ::CreateFont
    ::SetFont
    }
    记得SetFont要用API,不要用CWnd的成员函数SetFont,创建字体也可以用API,如果非要用CFont的话,如下:
    SetFont(..., font.Detach());
    这是因为CFont是一个类,在析构的时候,会删除字体,调用Detach之后,就不会删除了。
      

  4.   


    m_font = new CFont;
    m_font->CreateFont(30, // nHeight 
    0, // nWidth 
    0, // nEscapement 
    0, // nOrientation 
    FW_BOLD, // nWeight 
    0, // bItalic 
    FALSE, // bUnderline 
    0, // cStrikeOut 
    ANSI_CHARSET, // nCharSet 
    OUT_DEFAULT_PRECIS, // nOutPrecision 
    CLIP_DEFAULT_PRECIS, // nClipPrecision 
    DEFAULT_QUALITY, // nQuality 
    DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
    _T("宋体")); m_List.SetFont(m_font);
      

  5.   


    谢谢,我要问的是:如果有 n 个控件需要设置不同的字体,我是否要创建 n 个m_font?
    如果这个 n 不是一个定数,那应该怎么办?
      

  6.   

    CTypeptrArray <CFont *>CArray<CFont>
      

  7.   


    谢谢,这样应该是没问题,但字体配置文件读取之后,还是要放到 n 个 CFont 中,才能设置控件字体。现在的问题是,我不希望创建那么多个 CFont对象,但如果只要一个CFont,字体对象就不能保存了。
      

  8.   

    谢谢yang79tao兄,使用 font.Detach();果然能保存字体句柄了。只是有个疑问?
    HFONT hFont=font.Detach(); //切断CFont 和 HFONT的关联,保存了句柄
    SetFont(hwnd, hFont); //设置字体之后,显然字体对象被保存了,但是否会产生资源泄露?这里的hFont没有被删除。
      

  9.   

    你可以参看WM_SETFONT的MSDN,看说明是要自己调用DeleteObject,那么你在程序退出的时候,同样一个for循环,然后:
    GetFont
    DeleteObject
      

  10.   

    你让每一个控件都有自己的dc,然后在cfont中不断改变字体,把改变的字体设置到控件dc里,这样控件在绘图的时候用的是自己的dc设置,而不是父窗口的dc了。
      

  11.   


    你本来就有1000种字体,所以创建1000次是肯定需要的
    局部变量创建后,在作用域离开后,释放对象,不过你可以new cfont
    然后用一个成员数组变量记录他
    最后退出识释放