每创建一个从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;
}