窗口类--字体关系

来源:互联网 发布:北方菜谱软件下载 编辑:程序博客网 时间:2024/04/30 23:52


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