|
如何更改对话框上的字体大小。。我好象在对话框的属性设置里没有看到关于字体的设置
对话框资源编辑中,对话框属性中有字体设置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 系统,从而以新字体在屏幕上绘制对话框。 |
|