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更多的知识呢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值