精品主页 | 软件下载 | 系统下载 | 精品导航| 精彩图片 | 转帖工具 | 版主申请 | 影视下载
发新话题
打印

在属性页中添加字体对话框

在属性页中添加字体对话框

  


                   mfc提供了三种属性页类:cfontproppage、ccolorproppage和cpictureproppage。但是,它们只能与ole automation一起使用。在本文中将介绍如何在属性对话框中添加字体属性页。


解决的办法是你自己建立字体属性页。为了让你能定制通用对话框的行为,sdk提供了这些对话框的对话框资源。“choose font”对话框是在include目录中的font.dlg文件中,相应的符号在dlgs.h文件中。使用这些文件作为出发点,我们可以为字体属性页建立资源,并且添加一个使用这些资源的cpropertypage继承类。下面的实现可能是有限的的,但也有一定的参考价值。如果你想增强它,可以查看mfc源程序目录中的cfontproppage源文件。


第一步:添加对话资源  你可以在devstudio中打开下面的rc文件devstudio,然后把对话框资源复制到你的主资源文件中,或者你也可以把该资源文件包含进去。


为了复制资源文件,请在devstudio中打开“fontpage.rc”文件,然后展开资源的outline。然后打开resourceview,以便对话框资源是可见的。最后,从fontpage.rc中拖动idd_fontpage资源到你的应用程序resourceview的资源中。


如果你想包含fontpage资源文件,只要把“fontpage.rc”和“fontpagerc.h”文件(在下面列出)到项目目录中的“res”目录中即可。然后在该目录中已有的“rc2”文件中添加下面这段。资源图像也列在下面。#include "fontpage.rc"





listing of fontpage.rc





/////////////////////////////////////////////////////////////////////////





// listing of fontpage.rc





//





#include "winresrc.h"





#include "fontpagerc.h"idd_fontpage dialog discardable





13, 54, 264, 133style ws_child | ws_caption | ws_sysmenucaption "font"





font 8, "helv"





begin





ltext "&font:",stc1,6,3,40,9





combobox idc_font,6,13,131,54,cbs_simple | cbs_autohscroll | </PRE>


<DL>


<DD>cbs_sort | cbs_disablenoscroll | ws_vscroll | ws_tabstop</PRE>


<DD>ltext "font st&yle:",stc2,153,3,44,9</PRE>


<DD>combobox idc_style,153,13,64,54,cbs_simple | cbs_disablenoscroll | </PRE>


<DD>ws_vscroll | ws_tabstop</PRE>


<DD>ltext "&size:",stc3,224,3,30,9</PRE>


<DD>combobox idc_fontsize,224,13,32,54,cbs_simple | </PRE>


<DD>cbs_disablenoscroll | ws_vscroll | ws_tabstop</PRE>


<DD>groupbox "effects",grp1,6,72,84,34,ws_group</PRE>


<DD>control "stri&keout",idc_strikeout,"button",bs_autocheckbox | </PRE>


<DD>ws_tabstop,10,82,49,10</PRE>


<DD>control "&underline",idc_underline,"button",bs_autocheckbox,10,</PRE>


<DD>94,51,10</PRE>


<DD>groupbox "sample",grp2,98,72,160,49,ws_group</PRE>


<DD>ctext "aabbyyzz",idc_sample,104,81,149,37,ss_noprefix</PRE>


<DD>end</PRE>


<DD>/////////////////////////////////////////////////////////////////////////





// listing of fontpagerc.h





/////////////////////////////////////////////////////////////////////////</PRE>


<DD>#define idc_strikeout 0x0410





#define idc_underline 0x0411





#define grp1 0x0430





#define grp2 0x0431





#define stc1 0x0440





#define stc2 0x0441





#define stc3 0x0442





#define idc_sample 0x0444





#define idc_font 0x0470





#define idc_style 0x0471





#define idc_fontsize 0x0472





#define idd_fontpage 1543</PRE>


<DD>/////////////////////////////////////////////////////////////////////////</PRE>


<DT> 














第二步:在你的项目中包含源文件 下面给出了头文件和实现文件。你只要简单的把它们包含到你的项目中, 并且使用cfontpage类就可以了。该类的实现是比较简单的。 cfontpage构造函数获取一指向logfont结构的指针。它使用该结构的信息来初始化 自己。如果logfont结构没有提供,则使用窗口的当前字体。 在oninitdialog()函数中,我们列出了所需字体和字体组合框。但是, 任何字体特性的改变,都要调用onselchange()函数来实现。所有的信息映射入口都 指向该函数。onselchange()函数更新内部信息,并且显示样本文本。</DT></DL>


fontpage.h


<DL>


<DD>#if !defined(afx_fontpage_h__de7edeb3_056d_11d1_82df_e2cdc9000000__included_)





#define afx_fontpage_h__de7edeb3_056d_11d1_82df_e2cdc9000000__included_</PRE>


<DD>#if _msc_ver &gt;= 1000





#pragma once





#endif // _msc_ver &gt;= 1000</PRE>


<DD>// fontpage.h : header file





//</PRE>


<DD>/////////////////////////////////////////////////////////////////////////////





// cfontpage dialog</PRE>


<DD>class cfontpage : public cpropertypage





{





    declare_dyncreate(cfontpage)</PRE>


<DD>// construction</PRE>


<DD>public:





    void getcurrentfont(lplogfont lplf);





    cfontpage(logfont* plogfont = null);





    ~cfontpage();</PRE>


<DD>// dialog data





//{{afx_data(cfontpage)





enum { idd = idd_fontpage };





cstatic        m_staticsample;





ccombobox        m_combostyle;





ccombobox        m_combosize;





ccombobox        m_combofont;</PRE>


<DD>bool        m_bstrikeout;





bool        m_bunderline;</PRE>


<DD>cstring        m_sfont;





cstring        m_ssize;





cstring        m_sstyle;





//}}afx_data</PRE>


<DD>// overrides





// classwizard generate virtual function overrides





//{{afx_virtual(cfontpage)





protected:





virtual void dodataexchange(cdataexchange* pdx); // ddx/ddv support





//}}afx_virtual</PRE>


<DD>// implementation





protected:





// generated message map functions





//{{afx_msg(cfontpage)





virtual bool oninitdialog();





afx_msg void onselchange();





//}}afx_msg</PRE>


<DD>declare_message_map()





private:





cfont m_fontsample;





int m_cypixelsperinch;





static int callback fontenumproc(enumlogfontex *lpelfe, newtextmetricex *lpntme,





                                 int fonttype, cfontpage* pfontpage );</PRE>


<DD>};</PRE>


<DD>//{{afx_insert_location}}</PRE>


<DD>// microsoft developer studio will insert additional declarations immediately





// before the previous line.</PRE>


<DD>#endif // !defined(afx_fontpage_h__de7edeb3_056d_11d1_82df_e2cdc9000000__included_)</PRE></DD></DL>


fontpage.cpp


<DL>


<DD>// fontpage.cpp : implementation file





//</PRE>


<DD>#include "stdafx.h"





#include "resource.h"





#include "fontpage.h"</PRE>


<DD>#ifdef _debug





#define new debug_new





#undef this_file





static char this_file[] = __file__;





#endif</PRE>


<DD>/////////////////////////////////////////////////////////////////////////////





// cfontpage property page</PRE>


<DD>implement_dyncreate(cfontpage, cpropertypage)</PRE>


<DD>cfontpage::cfontpage(logfont* plogfont /*= null*/) : cpropertypage(cfontpage::idd)





{





    //{{afx_data_init(cfontpage)





    //}}afx_data_init</PRE>


<DD>    logfont logfont;</PRE>


<DD>    cwindowdc dc(getdesktopwindow() );</PRE>


<DD>    m_cypixelsperinch = getdevicecaps(dc, logpixelsy);</PRE>


<DD>    if( plogfont == null )





    {





        cfont *pfont = dc.getcurrentfont();





        pfont-&gt;getlogfont( &logfont );





        plogfont = &logfont;





    }</PRE>


<DD>    m_fontsample.createfontindirect( plogfont );





    m_bstrikeout = plogfont-&gt;lfstrikeout;





    m_bunderline = plogfont-&gt;lfunderline;





    m_sfont = plogfont-&gt;lffacename;





    m_ssize.format( "%d", muldiv(plogfont-&gt;lfheight, 72, m_cypixelsperinch) );





    m_sstyle = _t("regular");</PRE>


<DD>    if( plogfont-&gt;lfweight &gt;= 700 && plogfont-&gt;lfitalic)





        m_sstyle = _t("bold italic");





    else if( plogfont-&gt;lfitalic )





        m_sstyle = _t("italic");





    else if ( plogfont-&gt;lfweight &gt;= 700 )





        m_sstyle = _t("bold");





}</PRE>


<DD>cfontpage::~cfontpage()





{





}</PRE>


<DD>void cfontpage::dodataexchange(cdataexchange* pdx)





{





    cpropertypage::dodataexchange(pdx);





    //{{afx_data_map(cfontpage)





    ddx_control(pdx, idc_sample, m_staticsample);





    ddx_control(pdx, idc_style, m_combostyle);





    ddx_control(pdx, idc_fontsize, m_combosize);





    ddx_control(pdx, idc_font, m_combofont);





    ddx_check(pdx, idc_strikeout, m_bstrikeout);





    ddx_check(pdx, idc_underline, m_bunderline);





    ddx_cbstring(pdx, idc_font, m_sfont);





    ddx_cbstring(pdx, idc_fontsize, m_ssize);





    ddv_maxchars(pdx, m_ssize, lf_facesize);





    ddx_cbstring(pdx, idc_style, m_sstyle);





    //}}afx_data_map





}</PRE>


<DD>begin_message_map(cfontpage, cpropertypage)





//{{afx_msg_map(cfontpage)





on_cbn_selchange(idc_font, onselchange)





on_cbn_selchange(idc_style, onselchange)





on_cbn_selchange(idc_fontsize, onselchange)





on_bn_clicked(idc_strikeout, onselchange)





on_bn_clicked(idc_underline, onselchange)





on_cbn_killfocus(idc_font, onselchange)





on_cbn_killfocus(idc_style, onselchange)





on_cbn_killfocus(idc_fontsize, onselchange)





//}}afx_msg_map





end_message_map()</PRE>


<DD>/////////////////////////////////////////////////////////////////////////////





// cfontpage message handlers</PRE>


<DD>bool cfontpage::oninitdialog()





{





    cpropertypage::oninitdialog();</PRE>


<DD>    cwindowdc dc(this);</PRE>


<DD>    logfont logfont;</PRE>


<DD>    logfont.lfcharset = default_charset;</PRE>


<DD>    logfont.lffacename[0] = '\0';</PRE>


<DD>    logfont.lfpitchandfamily = 0;</PRE>


<DD>    enumfontfamiliesex( dc.m_hdc, &logfont, (fontenumproc)fontenumproc, (lparam) this, 0 );</PRE>


<DD>    // fill size combobox with "common[/img]


<DD>    tchar* defaults[]={_t("8"),_t("9"),_t("10"),_t("11"),_t("12"),_t("14"),_t("16"),_t ("18"),





        _t("20"), _t("22"), _t("24"), _t("26"), _t("28"), _t("36"), _t("48") };</PRE>


<DD>    for (int i = 0; i &lt; (sizeof(defaults)/sizeof(defaults[0])); i  )





        m_combosize.addstring(defaults);</PRE>


<DD>    // fill style combobox with "common[/img]


<DD>    return true; // return true unless you set the focus to a control</PRE>


<DD>    // exception: ocx property pages should return false





}</PRE>


<DD>int callback cfontpage::fontenumproc(enumlogfontex *lpelfe, newtextmetricex *lpntme,





                    int fonttype, cfontpage* pfontpage )





{





    if( pfontpage-&gt;m_combofont.findstringexact( 0, (lpctstr)lpelfe-&gt;elffullname )==cb_err )





    {





        // add to list





        pfontpage-&gt;m_combofont.addstring( (lpctstr)lpelfe-&gt;elffullname );





    }</PRE>


<DD>    return 1;





}</PRE>


<DD>void cfontpage::onselchange()





{





    // the selection hasn't changed yet, so change it</PRE>


<DD>    if( ischild( getfocus() ) && getfocus()-&gt;getparent()-&gt;iskindof( runtime_class( ccombobox ) ) )





    {





        ccombobox *cb = (ccombobox *)getfocus()-&gt;getparent();</PRE>


<DD>        cstring stext;</PRE>


<DD>        if( cb-&gt;getcursel() != cb_err )





        {





            cb-&gt;getlbtext( cb-&gt;getcursel(), stext );





            cb-&gt;setwindowtext( stext );





        }





    }</PRE>


<DD>    updatedata(true);</PRE>


<DD>    logfont logfont;</PRE>


<DD>    m_fontsample.getlogfont( &logfont );





    logfont.lfstrikeout = m_bstrikeout;





    logfont.lfunderline = m_bunderline;





    memcpy( logfont.lffacename, m_sfont, lf_facesize );</PRE>


<DD>    logfont.lfheight = muldiv(atoi(m_ssize), m_cypixelsperinch, 72);</PRE>


<DD>    logfont.lfweight = 400;        //regular





    logfont.lfitalic = false;





    if( m_sstyle.find( _t("italic") ) != -1 )





        logfont.lfitalic = true;</PRE>


<DD>    if( m_sstyle.find( _t("bold") ) != -1 )





        logfont.lfweight = 700;</PRE>


<DD>    m_fontsample.deleteobject();





    m_fontsample.createfontindirect( &logfont );





    m_staticsample.setfont(&m_fontsample);





}</PRE>


<DD>void cfontpage::getcurrentfont(lplogfont lplf)





{





    m_fontsample.getlogfont( lplf );





}</PRE></DD></DL>

TOP

发新话题