我们先看简单绘图:
对于一个单文档应用程序,我们先为其添加一个菜单:画图,然后为它添加4个菜单项:ID_DOT、IDM_LINE、IDM_RECTANGLE、IDM_ELLIPSE。
我们的目标,是当选中其中的一项时,能够在客户区中绘制相应的图形。
我们需要一个CPoint成员变量m_ptOrigin来记录鼠标按下去时的点,然后在鼠标抬起中响应:
先看线宽吧,这个说明白了其他是差不多的。
首先,建立一个对话框,在对话框上放一个静态文本光,命名为“线宽”,然后再放一个编辑框,将其ID改为IDC_LINE_WIDTH。然后我们为这个对话框建立一个从CDialog类派生出来的类CSettingDlg,并将编辑框与这个类的一个UINT型成员变量m_iLinewidth相关联。这样就能用它来记录我们设置的线宽了。然后在我们的view类里面也加上成员变量m_iLineWidth。最后增加一个“设置”菜单项,对其在它的消息响应函数中:
对于一个单文档应用程序,我们先为其添加一个菜单:画图,然后为它添加4个菜单项:ID_DOT、IDM_LINE、IDM_RECTANGLE、IDM_ELLIPSE。
我们的目标,是当选中其中的一项时,能够在客户区中绘制相应的图形。
首先,我们需要一个UINT类型的变量m_nDrawType来记录我们选择的是哪个类型。并在这4个菜单的响应函数中为其赋值:
void CCH_10_GranphicView::OnDot()
{
// TODO: Add your command handler code here
m_nDrawType = 1;
}
void CCH_10_GranphicView::OnLine()
{
// TODO: Add your command handler code here
m_nDrawType = 2;
}
void CCH_10_GranphicView::OnRectangle()
{
// TODO: Add your command handler code here
m_nDrawType = 3;
}
void CCH_10_GranphicView::OnEllipse()
{
// TODO: Add your command handler code here
m_nDrawType = 4;
}
其次,我们需要捕获鼠标按下和鼠标抬起的消息。这两个消息会告诉我们两个点,通过这两个点,我们可以构造直线、矩形、椭圆。
我们需要一个CPoint成员变量m_ptOrigin来记录鼠标按下去时的点,然后在鼠标抬起中响应:
void CCH_10_GranphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));//设置画笔颜色
dc.SelectObject(&pen);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//设置画刷为透明
dc.SelectObject(pBrush);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(m_ptOrigin,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point.x,point.y);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
下面我们实现一个功能:增加一个菜单,通过这个菜单,我们可以修改线的线的宽度、线型、颜色、字体等内容。
先看线宽吧,这个说明白了其他是差不多的。
首先,建立一个对话框,在对话框上放一个静态文本光,命名为“线宽”,然后再放一个编辑框,将其ID改为IDC_LINE_WIDTH。然后我们为这个对话框建立一个从CDialog类派生出来的类CSettingDlg,并将编辑框与这个类的一个UINT型成员变量m_iLinewidth相关联。这样就能用它来记录我们设置的线宽了。然后在我们的view类里面也加上成员变量m_iLineWidth。最后增加一个“设置”菜单项,对其在它的消息响应函数中:
void CCH_10_GranphicView::OnSetting()
{
// TODO: Add your command handler code here
CSettingDlg dlg;
dlg.m_iLinewidth = m_iLineWidth;//
if(IDOK == dlg.DoModal())
m_iLineWidth = dlg.m_iLinewidth;
}
而在OnLButtonUp中:
CPen pen(PS_SOLID,m_iLineWidth,RGB(255,0,0));//设置画笔颜色
可能有人会觉得奇怪if语句的作用是当点击OK以后