现在的位置: 首页 > 综合 > 正文

窗口类–字体关系

2013年10月09日 ⁄ 综合 ⁄ 共 3220字 ⁄ 字号 评论关闭

每创建一个从CWnd继承来的窗口,该窗口都有默认字体的。

如果通过pWnd->GetFont();返回空值,代表该窗口使用系统字体。

下面贴段代码。

	//// CWnd -- pFtWnd is NULL
	//m_wnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,100,100), this, 0);
	//LOGFONT lfWnd;
	//CFont * pFtWnd = m_wnd.GetFont();
	////pFtWnd->GetLogFont(&lfWnd);

	//// CWnd(Test) -- WC_LISTVIEW -- pFtWndTest is ("微软雅黑")
	//              -- WC_TABCONTROL -- pFtWndTest is ("System")
	m_wndTest.Create(WC_TABCONTROL, NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,100,50), this, 0);
	LOGFONT lfWndTest;
	CFont * pFtWndTest = m_wndTest.GetFont();
	pFtWndTest->GetLogFont(&lfWndTest);

	int a = 20;

	// CEdit -- pFtEdit is NULL
	//m_edit.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,100,100), this, 0);
	//LOGFONT lfEdit;
	//CFont * pFtEdit = m_edit.GetFont();
	//pFtEdit->GetLogFont(&lfEdit);

	// CButton -- pFtBtn is NULL
	//CButton btn;
	//btn.Create(L"CButton", WS_CHILD|WS_VISIBLE, CRect(0,0,100,20), this, 0);
	//CFont * pFtBtn = btn.GetFont();
	//LOGFONT lfBtn;
	//pFtBtn->GetLogFont(&lfBtn);

	//========= Control ===========================//
	// CSliderCtrl -- pFtSliderCtrl is NULL
	//CSliderCtrl sliderCtrl;
	//sliderCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,200,100), this, 0);
	//CFont * pFtSliderCtrl = sliderCtrl.GetFont();
	//LOGFONT lfSliderCtrl;
	//pFtSliderCtrl->GetLogFont(&lfSliderCtrl);

	// CHeaderCtrl -- pFtHeaderCtrl is NULL
	//CHeaderCtrl headerCtrl;
	//headerCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,200,100), this, 0);
	//CFont * pFtHeaderCtrl = headerCtrl.GetFont();
	//LOGFONT lfHeaderCtrl;
	//pFtHeaderCtrl->GetLogFont(&lfHeaderCtrl);

	// CListCtrl -- 字体"微软雅黑"
	//m_listCtl.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT, CRect(0,0,300,50), this, 0);
	//CFont * pFtListCtrl = m_listCtl.GetFont();
	//LOGFONT lfListCtrl;
	//pFtListCtrl->GetLogFont(&lfListCtrl);

	//m_listCtl.InsertColumn(0,L"Student1",0,150);
	//m_listCtl.InsertColumn(1,L"Student2",0,150);

	//LOGFONT lf;
	//memset(&lf, 0, sizeof(LOGFONT));
	//::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
	//CFont ft;
	//ft.CreateFontIndirect(&lf);

	//m_listCtl.SetFont(&ft);

	// CTreeCtrl -- 字体"微软雅黑"
	//CTreeCtrl treeCtrl;
	//treeCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,200,100), this, 0);
	//CFont * pFtTreeCtrl = treeCtrl.GetFont();
	//LOGFONT lfTreeCtrl;
	//pFtTreeCtrl->GetLogFont(&lfTreeCtrl);

	// CTabCtrl -- 字体"System"
	//CTabCtrl tabCtrl;
	//tabCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,200,100), this, 0);
	//CFont * pFtTabCtrl = tabCtrl.GetFont();
	//LOGFONT lfTabCtrl;
	//pFtTabCtrl->GetLogFont(&lfTabCtrl);

	// CRichEditCtrl -- pFtRichEditCtrl is NULL
	//CRichEditCtrl richEditCtrl;
	//richEditCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,200,100), this, 0);
	//CFont * pFtRichEditCtrl = richEditCtrl.GetFont();
	//LOGFONT lfRichEditCtrl;
	//pFtRichEditCtrl->GetLogFont(&lfRichEditCtrl);

	//int a = 20;

通过LOGFONT lf3;
memset(&lf3, 0, sizeof(LOGFONT));
::GetObject((HFONT)GetStockObject(SYSTEM_FONT), sizeof(lf3), &lf3);

获取的是注册表中保存的字体值。MFC中的各种标准控件获取的默认字体都是不一样的,有的返回NULL,在WIN7下,有的返回微软雅黑,有的返回System。这是为什么呢??

又调试了一会,我用下面的API直接创建窗口。

我然后直接指定窗口类名,因为

#define WC_LISTVIEW "SysListView32"

#define WC_TREEVIEW "SysTreeView32"

这二个窗口类获取的默认字体为系统当前正在使用的字体

而#define WC_TABCONTROL "SysTabControl32"使用的字体是"System"

下面贴段直接调用API来获取逻辑字体LOGFONT。

BOOL CInfoPane::GetSysFont(LOGFONT &lf)
{
	memset(&lf, 0, sizeof(LOGFONT));

	HWND hWnd = ::CreateWindow(_T("SysListView32"), NULL, WS_CHILD|WS_VISIBLE,
		0,0,0,0, ::GetDesktopWindow(), NULL, AfxGetInstanceHandle(), 0);

	HFONT hFont = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0);

	::GetObject(hFont, sizeof(LOGFONT), &lf);
	::DestroyWindow(hWnd);

	return TRUE;
}

抱歉!评论已关闭.