a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

詳解VC++中的字體的設置方法

2020-02-24 14:27:34
字體:
來源:轉載
供稿:網友

我們都知道程序員花了很多時間在計算機上編寫代碼,其實這是非常耗時的,但是在操作界面上設置他們喜歡的字體和顏色將大大提高他們編程的舒適性,下面武林技術頻道小編將給大家帶來詳解VC++中的字體的設置方法,一起來看看吧!
窗口都有2個和字體有關的函數:
CWnd::GetFont()和SetFont(CFont*, BOOL);
1)CFont* pFont = m_static.GetFont();

2)LOGFONT LogFont;
pFont->GetLogFont(&LogFont);

3)對LogFont直接操縱修改里面的字體選項
?
//如LogFont.lfUnderline = 1;設置下劃線
?LogFont.lfHeight=30;?????? //字體大小設置
?strcpy(LogFont.lfFaceName, "楷體_GB2312");? //字體設置

4)pFont->Detach();
第四步的目的是將pFont里裝有的HFONT解除關聯,否則pFont無法調用緊接的Create函數。

5)pFont->CreateFontIndirect(&LogFont);
m_static.SetFont(pFont);

6)pFont->Detach();
必須再一次解除在pFont里裝載的HFONT,原因是第5步已經將HFONT賦給了m_static。pFont的任務已完成,不應該持有HFONT資源,它也不能去銷毀HFONT,因為m_static在使用這個HFONT,所以必須是Detach()來解除關聯。

VC++中字體顏色的改變
在OnCtlColor函數中如下代碼:

?

?HBRUSH CDlg_SignIn::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
?HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
?// TODO:? Change any attributes of the DC here
?? if(nCtlColor == CTLCOLOR_STATIC)
?????? {
?????? if(pWnd->GetDlgCtrlID()== IDC_REGARD)
?????????? {
?????????????? pDC->SetTextColor(RGB(255,0,0));
?????????????? pDC->SetBkColor(RGB(251, 247, 200));//設置文本背景色
?????????????? pDC->SetBkMode(TRANSPARENT);//設置背景透明??????????????????
?????????? }
?????? }
?// TODO:? Return a different brush if the default is not desired
?return hbr;
}?


其他控件的宏定義為:
CTLCOLOR_BTN 按鈕控件
CTLCOLOR_DLG 對話框
CTLCOLOR_EDIT 編輯框
CTLCOLOR_LISTBOX 列表控件
CTLCOLOR_MSGBOX 消息控件
CTLCOLOR_SCROLLBAR 滾動條控件
CTLCOLOR_STATIC 靜態控件

VC中動態改變控件和對話框字體.
1
VC的對話框字體設置對所有控件都有效,你不能單獨地改變某個靜態文本的字體。對于你的問題,需要首先用CreateFont來建立一個字體對象,然后調用控件的SetFont,就可以了。

例子:
1、改靜態文體的ID,如:IDC_STATIC1
2、添加一個Edit控件,建立一個關聯的控件m_editControl。
3、在OnInitDialog中添加如下代碼:

?

?

?


CFont * f;
???? f = new CFont;
???? f->CreateFont(16, // nHeight
???? 0, // nWidth
???? 0, // nEscapement
???? 0, // nOrientation
???? FW_BOLD, // nWeight
???? TRUE, // bItalic
???? FALSE, // bUnderline
???? 0, // cStrikeOut
???? ANSI_CHARSET, // nCharSet
???? OUT_DEFAULT_PRECIS, // nOutPrecision
???? CLIP_DEFAULT_PRECIS, // nClipPrecision
???? DEFAULT_QUALITY, // nQuality
???? DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
???? _T("Arial")); // lpszFac???
???? GetDlgItem(IDC_STATIC1)->SetFont(f);
???? CWnd *cWnd = GetDlgItem(IDC_STATIC1);
???? cWnd->SetFont(&font);
???? cWnd->SetWindowTextW(L"設置需要的內容");


需要注意的是,這里我們使用的是CFont指針,而不是普通的CFont局部變量, 在非MFC程序,首先用CreateFont來建立一個字體句柄,然后再用SendMessage發給控件WM_SETFONT消息,將建立的字體句柄賦值過去,就可以了。?

?

2 但是整個對話框或窗口的字體的大小,使用對話框或窗口的SetFont()函數卻沒有任何的作用.可以在初始化時遍歷每個控件分別設置來處理,但這里說另一種使用回調函數的簡單方法:
:調用系統的API:::EnumChildWindows(). ,傳入回調函數和重新定義的字體.(第一個參數不用管啊,本來就有啊)

1)在文檔視圖結構中CMainFrame::OnCreate().中調用::EnumChildWindows(). 實現所有窗口和子窗口字體改變

2) 在對話框的OnInitDialog(). 中調用::EnumChildWindows(). 改變對話窗上的所有控件.
回調函數如下:

?

/ lParam is a pointer to CFont object
BOOL __stdcall SetChildFont(HWND hwnd, LPARAM lparam)
{
CFont *pFont = (CFont*)lparam;
CWnd *pWnd = CWnd::FromHandle(hwnd);
pWnd->SetFont(pFont);
return TRUE;
}


使用1:

?

?

?


BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)g_Font.GetFont());
return TRUE;? // return TRUE unless you set the focus to a control
? // EXCEPTION: OCX Property Pages should return FALSE
}


使用2:

?

?

?


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
?if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
?if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
?return -1;????? // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
?TRACE0("Failed to create status bar/n");
return -1;????? // fail to create
?}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)g_Font.GetFont());
return 0;
}
(很好用,不像mfc中的那個垃圾setfont(),設置了對話框的沒有一點反應!)


3 如何在mfc中實現,當系統的字體變大的時候,對話框上面的字體也相應的變大?

?

?

?


//IconFont
??? LOGFONT logFont;
??? int? size = sizeof(LOGFONT);
??? bool isGood = SystemParametersInfo(SPI_GETICONTITLELOGFONT,size,&logFont,0);
??? if(isGood == true)
{
?CFont * f;
f = new CFont;
const LOGFONT* pFont = new LOGFONT(logFont);
f->CreateFontIndirectW(pFont);
?//::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)f);
}
//other Font
NONCLIENTMETRICS ncm = new NONCLIENTMETRICS();???????????????
bool isGood = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), ref ncm, 0);
if (isGood == true)
{
LOGFONT logFont2;
//logFont2=ncm.lfntCaptionFont);//CaptionFont
?//logFont2 =ncm.lfntSMCaptionFont;//CaptionFont_Small
//logFont2 = ncm.lfntMenuFont;//MenuFont
//logFont2 = ncm.lfntStatusFont;//StatusFont
?logFont2 = ncm.lfntMessageFont;//MessageFont
CFont * f;
?f = new CFont;
const LOGFONT* pFont = new LOGFONT(logFont2);
?f->CreateFontIndirectW(pFont);
?//::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)f);
?}

以上就是關于詳解VC++中的字體的設置方法,相信這篇文章對于大家的編程之路有著很大的幫助,建議你好好收藏。

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美福利一区二区 | 国产精品久久久久久久久免费桃花 | 99精品一区二区三区 | 日韩一区电影 | 99国产视频| 国产成人亚洲欧 | 欧美日韩精品 | 九九色综合| 午夜视频在线播放 | 久久亚洲网 | 国产www | 国产黄av | 99久久99热这里只有精品 | 久久密 | 亚洲成人在线视频网站 | 国产久| 精品中文字幕一区二区三区 | 日本少妇毛茸茸高清 | 久久久久久久久久久久久久久久久久久久 | 农村少妇一级片 | 国产第3页 | 久久国产精品免费一区二区三区 | 国产高潮好爽受不了了夜色 | 激情com | 亚洲国产精品女人久久久 | 国产精久| 国产高清在线观看 | 亚洲一区久久 | 美女一区二区三区四区 | 一级a性色生活片久久毛片波多野 | 成人免费毛片高清视频 | 日韩在线资源 | 国产精品久久久久aaaa九色 | 欧美日韩视频在线 | 欧美电影一区 | 1区2区免费视频 | 国产精品久久久视频 | 日本青草视频 | 九九亚洲 | 婷婷在线视频 | 成人福利在线 |