几何尺寸与公差论坛

 找回密码
 注册
查看: 3841|回复: 0

【转帖】如何更改对话框上的字体大小。。我好象在对话框的属性设置里没有看到关于字

[复制链接]
发表于 2008-7-7 10:47:03 | 显示全部楼层 |阅读模式
如何更改对话框上的字体大小。。我好象在对话框的属性设置里没有看到关于字体的设置
对话框资源编辑中,对话框属性中有字体设置Top

2 楼chb2000()回复于 2003-04-03 11:45:41 得分 98

下面的代码可能对你有帮助:   
  NONCLIENTMETRICS   info;   
  info.cbSize   =   sizeof(NONCLIENTMETRICS);   
  ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,   sizeof(NONCLIENTMETRICS),   &info,   0);   
  if(m_font.CreateFontIndirect(&(info.lfMenuFont))   ==   TRUE)   
  {   
  FARPROC   proc   =   MakeProcInstance((FARPROC)   SetFontProc,   AfxGetInstanceHandle());   
  EnumChildWindows(m_hWnd,   (WNDENUMPROC)proc,   (LPARAM)m_font.m_hObject);   
  FreeProcInstance(proc);   
  }   
   
   
  Top


3 楼pcman1990(pcman)回复于 2003-04-03 11:48:12 得分 0

资源编辑中打开对话框模板->按Alt+Enter->Font...Top

4 楼xt_jat(桑巴)回复于 2003-04-03 11:49:50 得分 0

你在对话框中的OninitDlg中   
  用EnumChildWindows    
   
  在它的回调函数中 给每个子窗口发放WM_SETFONT消息Top


5 楼winne_ll(feiyang)回复于 2003-04-03 11:50:44 得分 0

写程序改字体Top

6 楼pcman1990(pcman)回复于 2003-04-03 11:52:17 得分 2

如果要在程序中动态改,代码如下:   
  假设已经得到或者创建好了你要设置的font是CFont   *pFont,在OnInitDialog()中:   
   
  SetFont(pFont);   
  CWnd   *pw   =   GetWindow(GW_CHILD);   
  while(pw   !=   NULL)   
  {   
  pw->SetFont(pFont);   
  pw   =   pw->GetWindow(GW_HWNDNEXT);   
  };   
  Top


7 楼chb2000()回复于 2003-04-03 11:57:11 得分 0

改变对话框中的字体      
  问题     
    有的程序员希望能够改变对话框中的字体,以适应用户的喜好,希望对话框中所有的控制(编辑框、静态文本域、按钮以及组合框)都以选中的字体显示,而不论对话框初始定义的是什么字体。如何使用   Windows   9x   API   函数来完成此目标呢?     
   
  方法     
    对于大多数程序员,首先想到的是在手册中查找一个函数来设置对话框中的字体,当他发现方法   SetFont   清楚地记录在基类库的文档中时,可以想象他会多么激动。但是,当他高兴地在初始化函数中调用   SetFont   并发现没有任何效果时,也可以想象他是多么震惊!     
    MFC   使用自己的方法来设置对话框中的字体,即使用资源语句   FONT   说明的字体,或者使用   Windows   中缺省的系统字体来定义所有的控制,所有的控制也都是使用这种字体。那么如何超越   MFC   的这些限制,从   而使得控制使用用户自己的字体呢?答案在于协调使用几个不同的   Windows   9x   API   函数。     
    在本节中,首先介绍如何通过显示通用字体对话框来创建字体,此通用对话框提供使用   GDI   函数创建   字体所需要的信息。接着,将介绍如何使用函数   EnumChildWindows   来遍历对话框中的所有控制。最后,   将介绍如何使用函数   SendMessage   来改变窗口显示所用的字体。     
   
  步骤     
    按照下列步骤实现一个例子程序。运行此例子程序,从菜单   Fonts   中选择菜单项   Change   Current   Font,通用字体对话框将显示出来,选择字体名、风格(规则的、粗体的、斜体的)和字号,点击按钮   OK,   选择菜单   Fonts,从下拉菜单中选择菜单项   Display   Dialog,弹出的对话框将以选中的字体显示。     
    实现例子程序的具体步骤如下:     
    1.在   Visual   C++   中,利用   AppWizard   创建新的项目文件,并命名此项目文件为   LD51.MAK.     
    2.选择应用程序对象的头文件   LD51.H,在头文件中添加下列行(暗红色部分):     
   
  class   CLd1App   :   public   CWinApp     
  {     
  private:     
  CFont   *   current_font;     
  public:     
  CLd1App();     
  virtual   ~CLd1App();     
  CFont   *   GetCurrentFont(void)   {return   current_font;};     
  //   Overrides     
    3.进入   AppStudio,在菜单   IDR_MAINFRAME   中添加新的菜单   Fonts.添加新的菜单项   Change   Current   Font   和   Display   Dialog,标识符分别为   ID_CHANGE_FONT   和   ID_FONT_DLG。     
    4.启动   ClassWizard.从下拉列表中选择对象   CLd51App,从对象列表中选择   ID_CHANGE_FONT,选择消息   ON_COMMAND,点击按钮   Add   Function,新方法命名为   OnChangeFont。在此方法中添加下   列代码:     
  void   CLd51App::OnChangeFont()     
  {     
  CFont   *   pFont=current_font;     
   
  LOGFONT   lf;     
  memset(&lf,0,sizeof(lf));     
   
  if(pFont)     
  pFont->GetObject(sizeof(LOGFONT),&lf);     
   
  CFontDialog   dlg(&lf,CF_SCREENFONTS│CF_INITTOLOGFONTSTRUCT);     
  if(dlg.DoModal()!=IDOK)     
  return;     
   
  CFont   *   tempFont=new   CFont;     
  if(!tempFont->CreateFontIndirect(&lf))     
  {     
  delete   tempFont;     
  MessageBox(NULL,"Unable   to   create   font   !",     
  "Error",MB_OK│MB_ICONSTOP);     
  return;     
  }     
  if(current_font)     
  delete   current_font;     
  current_font=tempFont;     
  }     
    5.在   ClassWizard   中,从下拉列表中再次选择对象   CLd51App,从对象列表选择   ID_FONT_DLG,从消息列表中选择   COMMAND,点击按钮   Add   Function,方法命名为   OnFontDlg。在此方法中添加下列代码。     
  void   CLd51App::OnFontDlg()     
  {     
  CFontDlg   dlg;     
  dlg.DoModal();     
  }     
    6.在   CLd51App   的源文件(LD51.CPP)的顶部添加如下列行,要添加的行用暗红色表示:     
  #include   "ld1View.h"     
   
  #include   "FontDlg.h"     
   
  #ifdef   _DEBUG     
  #define   new   DEBUG_NEW     
  #undef   THIS_FILE     
  static   char   THIS_FILE[]   =   __FILE__;     
  #endif     
   
  ///////////////////////////////////////////////////////     
  //   CLd1App     
   
  BEGIN_MESSAGE_MAP(CLd1App,   CWinApp)     
  //{{AFX_MSG_MAP(CLd1App)     
  ON_COMMAND(ID_APP_ABOUT,   OnAppAbout)     
  ON_COMMAND(ID_CHANGE_FONT,   OnChangeFont)     
  ON_COMMAND(ID_FONT_DLG,   OnFontDlg)     
  //}}AFX_MSG_MAP     
  //   Standard   file   based   document   commands     
  ON_COMMAND(ID_FILE_NEW,   CWinApp::OnFileNew)     
  ON_COMMAND(ID_FILE_OPEN,   CWinApp::OnFileOpen)     
  END_MESSAGE_MAP()     
   
  ///////////////////////////////////////////////////////     
  //   CLd1App   construction     
  CLd1App::CLd1App()     
  {     
  current_font=NULL;     
  }     
   
  CLd1App::~CLd1App()     
  {     
  if(current_font)     
  delete   current_font;     
  }     
    7.进入   AppStudio   并创建新的对话框。在对话框中添加任意的域。进入   ClassWizard,为刚创建的对话框生成新的对话框类,并命名此类为   CFontDlg。     
    8.在   ClassWizard   中,从下拉列表中选择对象   CFontDlg,从对象列表中选择   CFontDlg,从消息列表中选择   WM_INITDIALOG,点击按钮   Add   Function,在CFontDlg   的方法   OnInitDialog   中添加下列代码:     
  BOOL   CFontDlg::OnInitDialog()     
  {     
  CDialog::OnInitDialog();     
   
  CenterWindow();     
   
  CLd51App   *   app=(CLd51App   *)AfxGetApp();     
  CFont   *   font=app->GetCurrentFont();     
   
  if(font==NULL)     
  return   TRUE;     
   
  FARPROC   proc=MakeProcInstance((FARPROC)SetFontProc,     
  AfxGetInstanceHandle());     
   
  EnumChildWindows(m_hWnd,(WNDENUMPROC)proc,     
  (LPARAM)font->m_hObject);     
   
  FreeProcInstance(proc);     
   
  return   TRUE;   //   return   TRUE   unless   you   set   the   focus   to   a   control     
  }     
    9.在   CFontDlg   的方法 OnInitDialog   前添加下列函数。     
  BOOL   CALLBACK   SetFontProc(HWND   hWnd,LPARAM   lParam)     
  {     
  HFONT   font=(HFONT)lParam;     
   
  SendMessage(hWnd,WM_SETFONT,(WPARAM)font,     
  (LPARAM)MAKELONG((WORD)TRUE,0));     
   
  return   TRUE;     
  }     
    10.编译并运行此例子程序。     
   
  用法     
    当用户选择菜单项   Change   Current   Font   时,例子程序将显示出一个包含当前选中字体(如果有的话)的字体对话框,当用户从字体对话框中选择字体后,当前选中的字体就被用来创建新的   CFont   对象。   这都是在成员函数   CLd51App::OnChangeFont   中实现的。     
    当用户选择菜单项   Display   时,例子程序将创建类   CFontDlg   的新实例。此对象从应用程序对象中   获得当前的字体,接着调用函数   EnumChildWindows   来以当前的字体修改每个控制,函数EnumChildWindows   遍历给定父窗口的每个子窗口。在本节的例子程序中,父窗口是对话框,所有的子窗口是对话框中的控制。   函数   EnumChildWindows   的参数有窗口句柄(指定要遍历的父窗口)、回调函数以及要传送给回调函数的   参数。在本节的例子程序中,传送给回调函数的参数是字体句柄。     
    当每个窗口传送给回调函数(SetFontProc)时,就调用   SendMessage   将字体句柄传送给子窗口。在此调用中,命令是   WM_SETFONT,传送的信息是字体句柄和标志(指定控制应该立即重绘)。     
    当以指定的字体更新了所有的控制后,函数将控制交回   Windows   系统,从而以新字体在屏幕上绘制对话框。   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-27 00:28 , Processed in 0.038756 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表