前面几节讲述了VC在Win32编成中,对动态库和文件的使用技术,从这章开始我们讲述VC在Win32中的界面技术。
下面通过改变对话框中静态标签中字体,颜色,背景的例子,来说明如何使用字体对话框和颜色对话框。
我们先看一下例子的效果:
字体对话框:
颜色对话框:
字体对话框是利用MFC中CFontDialog,颜色对话框是利用MFC中CColorDialog;关键代码如下:
1.对话框OnInitDialog()函数中初始化静态标签的字体,字体颜色,字体背景
BOOL CFontColorDlgDemoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); ... // TODO: 初期化をここに追加します。 CFont *pFont = GetFont();//获取当前窗口的字体 pFont->GetLogFont(&m_fnt);//保存字体信息到变量m_fnt m_fntColor = GetSysColor(COLOR_MENUTEXT);//获取当前窗口字体颜色 m_clrInit = RGB(255, 0, 0);//初始化背景颜色 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 }
2.对话框OnPain()函数中创建字体
void CFontColorDlgDemoDlg::OnPaint() { ... CFont font; font.CreateFontIndirect(&m_fnt);//用从字体对话框中获取的字体信息m_fnt来创建字体 GetDlgItem(IDC_STATIC)->SetFont(&font);//设置静态标签中的字体 }
3.按钮控件Font的响应函数OnBnClickedBtnfont()中弹出字体对话框,保存选择的字体,字体颜色
void CFontColorDlgDemoDlg::OnBnClickedBtnfont() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 CFontDialog fntDlg(&m_fnt);//初始化字体对话框中的字体 fntDlg.m_cf.rgbColors = m_fntColor;//初始化字体对话框中的字体颜色 int nRet = fntDlg.DoModal(); if(nRet == IDOK) { fntDlg.GetCurrentFont(&m_fnt);//保存字体对话框中选择的字体 m_fntColor = fntDlg.GetColor();//保存字体对话框中选择的字体颜色 } }
4.按钮控件Color的响应函数OnBnClickedBtncolor()中弹出颜色对话框,保存选择的颜色
void CFontColorDlgDemoDlg::OnBnClickedBtncolor() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 CColorDialog colorDlg(m_clrInit, CC_FULLOPEN);//初始化颜色对话框 int nRet = colorDlg.DoModal(); if(nRet == IDOK) { m_clrInit = colorDlg.GetColor();//保存颜色对话框中选择的颜色 } }
5.添加消息WM_CTLCOLOR的响应函数,然后更新静态标签中字体的颜色和背景
HBRUSH CFontColorDlgDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: ここで DC の属性を変更してください。 if(nCtlColor == CTLCOLOR_STATIC)//判断是否静态标签类型 { switch(pWnd->GetDlgCtrlID())//判断是否为目标控件 { case IDC_STATIC: //设置字体颜色 pDC->SetTextColor(m_fntColor); //设置字体背景 pDC->SetBkColor(m_clrInit); break; } } // TODO: 既定値を使用したくない場合は別のブラシを返します。 return hbr; }