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