如何才能设置对话框字体

winne_ll 2003-04-03 11:10:20
当前系统使用的宋体,我想通过程序动态改变整个对话框的字体。比如改成“黑体”,不能通过对一个个控件SetFont().就象操作系统的字体设置一样。
...全文
3645 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fingerfox 2003-04-03
  • 打赏
  • 举报
回复
学习!
winne_ll 2003-04-03
  • 打赏
  • 举报
回复
不要光说不练,去试一试发现是有些问题。
小元宝 2003-04-03
  • 打赏
  • 举报
回复
改变对话框中的字体
问题
  有的程序员希望能够改变对话框中的字体,以适应用户的喜好,希望对话框中所有的控制(编辑框、静态文本域、按钮以及组合框)都以选中的字体显示,而不论对话框初始定义的是什么字体。如何使用 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 系统,从而以新字体在屏幕上绘制对话框。
pcman1990 2003-04-03
  • 打赏
  • 举报
回复
如果要在程序中动态改,代码如下:
假设已经得到或者创建好了你要设置的font是CFont *pFont,在OnInitDialog()中:

SetFont(pFont);
CWnd *pw = GetWindow(GW_CHILD);
while(pw != NULL)
{
pw->SetFont(pFont);
pw = pw->GetWindow(GW_HWNDNEXT);
};
winne_ll 2003-04-03
  • 打赏
  • 举报
回复
写程序改字体
xt_jat 2003-04-03
  • 打赏
  • 举报
回复
你在对话框中的OninitDlg中
用EnumChildWindows 

在它的回调函数中 给每个子窗口发放WM_SETFONT消息
pcman1990 2003-04-03
  • 打赏
  • 举报
回复
资源编辑中打开对话框模板->按Alt+Enter->Font...
小元宝 2003-04-03
  • 打赏
  • 举报
回复
下面的代码可能对你有帮助:
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);
}


pcman1990 2003-04-03
  • 打赏
  • 举报
回复
对话框资源编辑中,对话框属性中有字体设置

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧