mfc—改变控件的颜⾊、背景、字体以及画图 本周学习了孙鑫⽼师的第⼗课,本节课主要讲的是:画图以及改变控件的颜⾊、背景、字体、⼤⼩。
通过上⾯四个选项,设置我们画图的形状。下⾯三个选项,设置我们线条的⼤⼩、颜⾊和字体。
⾸先是选择颜⾊的窗⼝:
窗⼝mfc已经为我们写好了,我们只需要调⽤⼀下,在单⽂档的view类⾥⾯添加相应点击颜⾊菜单的函数:
dlg.m_cc.Flags |= CC_RGBINIT;//设置颜⾊对话框的初始颜⾊由⽤户指定
dlg.bResult = m_clr;//初始颜⾊
if (IDOK == dlg.DoModal())
{
m_clr = dlg.bResult;//保存⽤户选定的颜⾊
}
}
/*
CColorDialog 中有⼀个类型为CHOOSECOLOR的成员变量m_cc,我们可以通过改变他的值来设置颜⾊。*/
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HWND hInstance;
COLORREF rgbResult;
COLORREF *lpCustColors;
DWORD Flags;
LPARAM lCustData;
LPCCHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} CHOOSECOLOR, *LPCHOOSECOLOR;
rgbResult
/*
如果Flags设置了CC_RGBINIT标志,则rgbResult是创建对话框时最初选择的颜⾊。
如果指定的颜⾊值不在可⽤颜⾊中,系统将选择最接近的纯⾊。
如果rgbResult为零或未设置CC_RGBINIT,则最初选择的颜⾊为⿊⾊。
如果⽤户单击“确定”按钮,则rgbResult指定⽤户的颜⾊选择。
要创建COLORREF颜⾊值,请使⽤RGB宏。
*/
其次是字体类型和字体⼤⼩的选择:
这个窗⼝也由mfc给我写好了,我们只需要调⽤CFontDialog
if (IDOK == dlg.DoModal())
{
if (m_font.m_hObject)
{
m_font.DeleteObject();//如果已经创建,需要先切断该对象与之前的资源的连接
}
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);//创建⽤户选中的字体
m_strFontName = dlg.m_cf.lpLogFont->lfFaceName;//保存⽤户选择字体的名称
Invalidate();//重绘窗⼝
}
}
/*
msdn 中关于成员变量m_font的描述是:构造CFontDialog对象后,可以使⽤m_cf结构初始化对话框中控件的值或状态。 m_cf结构的类型为CHOOSEFONT。*/
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
COLORREF rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;
lpLogFont
/*
如果在Flags成员中设置CF_INITTOLOGFONTSTRUCT标志并初始化LOGFONT成员,
则ChooseFont函数会使⽤最接近的字体初始化对话框。
如果⽤户单击“确定”按钮,则ChooseFont将根据⽤户的选择设置LOGFONT结构的成员。
*/
发送重绘消息后,在ondraw函数中相应
void CGraphicView::OnDraw(CDC* pDC)
{
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CFont* pOldFont = pDC->SelectObject(&m_font);//将⽤户选择的字体添加到设备描述表中,并返回之前的字体
pDC->TextOut(0,0,m_strFontName);//打印字体名称
pDC->SelectObject(pOldFont);//
}
第三个是设置对话框,设置线型、线宽,另外还有⼀个⽰例,可以实时展⽰⽤户的选择样式。
当我们在编辑框⾥⾯输⼊内容时,编辑框会发送⼀个EN_CHANGE消息,我们需要相应这个消息就可以实时⽰例中改变线宽。线型的话,需要相应BN_CLICKED消息。
void CSettingDlg::OnEnChangeLineWidth()
{
Invalidate();
}
void CSettingDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知处理程序代码
Invalidate();
}
void CSettingDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知处理程序代码
Invalidate();
}
void CSettingDlg::OnBnClickedRadio3()
{
// TODO: 在此添加控件通知处理程序代码
Invalidate();
}
Invalidate()会向系统发送WM_PAINT消息,我们只需要相应该消息即可。
void CSettingDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
html radio点击变颜UpdateData(TRUE);//将控件的数据更新到与之关联的空间变量
CPen pen(m_nLineStyle, m_nLineWidth, m_clr);
dc.SelectObject(&pen);
CRect rect;
GetDlgItem(IDC_SIMPLE)->GetWindowRect(&rect);//得到⽰例的画图区域
ScreenToClient(&rect);
dc.MoveTo(rect.left+20, p + rect.Height() / 2);
dc.LineTo(rect.right-20, p + rect.Height() / 2);
// 不为绘图消息调⽤ CDialog::OnPaint()
}
最后画图的话,只需要在view类中实现⿏标点下和松开的⽅法:
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调⽤默认值
m_ptOrigin = point;//保存⿏标点下时的坐标
CView::OnLButtonDown(nFlags, point);
}
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调⽤默认值
CClientDC dc(this);
CPen pen(m_nLineStyle, m_nLineWidth > 0 ? m_nLineWidth : 1, m_clr);
dc.SelectObject(&pen);
CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//获得透明的画刷 dc.SelectObject(pBrush);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point, m_clr);
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin, point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin, point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
除此之外,孙⽼师还着重讲了关于改变控件颜⾊的⽅法。
⾸先我们需要相应WM_CTLCOLOR消息,添加函数OnCtlColor
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论