`
jgsj
  • 浏览: 960788 次
文章分类
社区版块
存档分类
最新评论

WTL在对话框工程中更改字体

 
阅读更多

这个工程的代码在这里呢。http://download.csdn.net/detail/jiangcaiyang123/3936311

一次编程中想更改对话框的字体,于是想想WTL可不可以做到呢?我当时尝试着使用标准的win32函数CreateFont来创建字体,并且返回字体的句柄。再在CStatic类里面调用SetFont()这个函数来使用字体。但是我没有成功。此外我还使用了LOGFONT结构体和CFont、CLogFont类,但是收效甚微。



看了网络上很多的帖子,发现这样使用CFont类的和CLogFont类的人对字体操作的都是基于单文档项目、多文档项目。我然后查找了一下CFont在WTL里面的指南(Reference)。里面说到CFont作用的范围是客户区。那么应该可以这么说,在一个对话框项目里单独使用CFont就没法奏效。


最后终于找到救星了。链接:http://www.codeproject.com/KB/wtl/wtlwindowfont.aspx


在这里,我知道了怎样修改对话框的字体了。虽然我看懂了这段代码,但是如果将其的思想运用在握的程序里还是不能获得圆满的结果。怎么办哪。没有办法,就直接拿来吧。我将它的代码修改了一下,写成了自己的类,并且使得功能更加强大。


下面是我自己参考他们写的代码:


// DialogItemFont.h 对话框项的字体


#ifndef _DIALOGITEMFONT_H_
#define _DIALOGITEMFONT_H_


#pragma warning( disable: 4996 )


class CDialogItemFont: public CFont// 对话框项的字体类
{
public:
	CDialogItemFont( void ): CFont( )					// 默认构造函数
	{
		m_bCreateComplete			= false;
	}
	CDialogItemFont( HFONT hFont ): CFont( hFont )		// 自定义构造函数
	{
		m_bCreateComplete			= false;
	}


	virtual ~CDialogItemFont( void )					// 将析构函数声明为虚的,子类可以自定义虚构函数
	{


	}


	bool Create( HWND hWnd, LPLOGFONT pFont )			// 创建字体
	{
		// 1、判断此句柄是否有效且是否是窗体
		ATLASSERT( hWnd != NULL );
		ATLASSERT( ::IsWindow( hWnd ) != FALSE );


		// 2、获取窗口正在使用的字体句柄
		HFONT hFont = (HFONT)::SendMessage( hWnd, WM_GETFONT, 0, 0 );


		// 3、得到了字体的句柄吗?
		if ( hFont == NULL )
		{
			hFont = (HFONT)::GetStockObject( SYSTEM_FONT );// 使用系统字体
		}


		LOGFONT lf;// 临时的字体结构体


		// 4、填充它
		if ( GetObject( hFont, sizeof( lf ), &lf ) == 0 ) return false;


		// 5、设置想要的字体
		if ( pFont != NULL )
		{
			if ( pFont->lfHeight != 0 )				lf.lfHeight			= pFont->lfHeight;
			if ( pFont->lfWidth != 0 )				lf.lfWidth			= pFont->lfWidth;
			if ( pFont->lfEscapement != 0 )			lf.lfEscapement		= pFont->lfEscapement;
			if ( pFont->lfOrientation != 0 )		lf.lfOrientation	= pFont->lfOrientation;
			if ( pFont->lfItalic != 0 )				lf.lfItalic			= pFont->lfItalic;
			if ( pFont->lfUnderline != 0 )			lf.lfUnderline		= pFont->lfUnderline;
			if ( pFont->lfStrikeOut != 0 )			lf.lfStrikeOut		= pFont->lfStrikeOut;
			if ( pFont->lfCharSet != 0 )			lf.lfCharSet		= pFont->lfCharSet;
			if ( pFont->lfOutPrecision != 0 )		lf.lfOutPrecision	= pFont->lfOutPrecision;
			if ( pFont->lfClipPrecision != 0 )		lf.lfClipPrecision	= pFont->lfClipPrecision;
			if ( pFont->lfQuality != 0 )			lf.lfQuality		= pFont->lfQuality;
			if ( pFont->lfPitchAndFamily != 0 )		lf.lfPitchAndFamily = pFont->lfPitchAndFamily;
			if ( pFont->lfFaceName != 0 )			wcscpy( lf.lfFaceName, pFont->lfFaceName );
		}


		// 6、创建CFont对象
		if ( CreateFontIndirect( &lf ) == 0 )
			return false;


		// 7、标记已经成功创建
		m_bCreateComplete = true;


		return true;
	}
	bool Apply( HWND hWnd, LPLOGFONT pFont, UINT nID )					// 应用与控件上
	{
		if ( !m_bCreateComplete ) Create( hWnd, pFont );


		CWindow wnd = ::GetDlgItem( hWnd, nID );
		ATLASSERT( wnd != NULL );// 判断是否传入了正确的ID号和窗体句柄
		wnd.SetFont( m_hFont, TRUE );// 设置字体


		return true;
	}
private:
	bool			m_bCreateComplete;					// 创建已经完成
};


#endif




调用的时候这样写:

LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	...(前略)


	LOGFONT myFont;									// 建立自己的字体对象
	ZeroMemory( &myFont, sizeof( LOGFONT ) );		// 重要:需将字体的结构清空
	myFont.lfHeight = 30;							// 填充字体的大小为30磅
	wcscpy( myFont.lfFaceName, L"黑体" );			// 字体名称为黑体


	m_TitleFont.Apply( this->m_hWnd, &myFont, IDC_PIXEL_AVAILABLE );


	// 初始化静态文本
	m_PixelAvailable.Attach( this->m_hWnd );
	m_PixelAvailable.SetDlgItemText( IDC_PIXEL_AVAILABLE, TEXT( "可用的分辨率" ) );
	
	return TRUE;
}


结果就是这样:


看来要了解ATL/WTL,需要了解比MFC更多的知识呢。
分享到:
评论

相关推荐

    改变MFC对话框背景色、控件内的字体

    改变MFC对话框背景色、控件内的字体颜色和背景色 设置 Dialog, Group Box, Static Text, Check Box, Edit Ctrl(disabled), Combo Box(disabled), Radio Button等背景色 编写WM_CTLCOLOR消息的映射函数OnCtlColor(CDC...

    AgileFontSet v2.0 迅捷字体设置程序

    在Windows中直接运行 AgileFontSet 便可启动窗口界面,启动后会显示系统字体和桌面图标间距的当前值,设置对话框简洁快捷、一目了然,普通用户也可快速方便地设置系统字体和桌面图标间距,并且可以立即生效。在窗口...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    在Window中,如果所有的界面操作都由用户代码来实现,那将是一个很浩大的工程。笔者曾经在DOS设计过窗口图形界面,代码上千行,但实现的界面还是很古板、难看,除了我那个对编程一窍不通的女友,没有一个人欣赏它L;...

    Visual C++ 编程资源大全(英文源码 表单)

    15.zip Costumizing CFileDialog 定制的CFileDialog(22KB)<END><br>16,16.zip Attaching Elements to Borders 一个可以在对话框中改变按纽位置、大小的容器(26KB)<END><br>17,17.zip Scrolling ...

    vc++ 应用源码包_1

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_2

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_3

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_6

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 应用源码包_5

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

    vc++ 开发实例源码包

    代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的...

Global site tag (gtag.js) - Google Analytics