MFC编写一个绘图程序

要求:
1. 画三角形、四边形、圆形、五边形,在窗口中自由移动,碰到窗口边缘会自动弹回(入射角度和折射角度一致)
2.通过菜单、Toolbar命令可以无限增加三角形、四边形、圆形、五边形
4.通过鼠标可以点中三角形、四边形、圆形、五边形,点中的图形可以停下运动,再点中图形可以继续运动
5.对选中的图形,可以设置填充颜色,线条宽度
6.Toolbar的图形按钮有相应的ToolTip
7.画三角形、四边形、圆形、五边形采用采用图形和位图两种方式实现。位图实现不设置填充颜色,线条宽度
8.采用面向对象编程(MFC)

第1个回答  2012-03-19
同样的,我们可以编写其他菜单项的处理函数代码,其代码如下:
//PS_DASH菜单项处理函数
void CDrawTestView::OnPenDash()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASH;
this->SetMenuItemCheck(0,0,7,1);
}
//PS_DOT菜单项处理函数
void CDrawTestView::OnPenDot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DOT;
this->SetMenuItemCheck(0,0,7,2);
}
//PS_DASHDOT菜单项处理函数
void CDrawTestView::OnPenDashdot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASHDOT;
this->SetMenuItemCheck(0,0,7,3);
}
//PS_DASHDOTDOT菜单项处理函数
void CDrawTestView::OnPenDashdotdot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASHDOTDOT;
this->SetMenuItemCheck(0,0,7,4);
}
//PS_NULL菜单项处理函数
void CDrawTestView::OnPenNull()
{
// TODO: Add your command handler code here
m_PenStyle = PS_NULL;
this->SetMenuItemCheck(0,0,7,5);
}
//PS_INSIDEFRAME菜单项处理函数
void CDrawTestView::OnPenInsideframe()
{
// TODO: Add your command handler code here
m_PenStyle = PS_INSIDEFRAME;
this->SetMenuItemCheck(0,0,7,6);
}
//宽度1菜单项处理函数
void CDrawTestView::OnPen1()
{
// TODO: Add your command handler code here
m_PenWidth = 1;
this->SetMenuItemCheck(0,1,4,0);
}
//宽度3菜单项处理函数
void CDrawTestView::OnPen3()
{
// TODO: Add your command handler code here
m_PenWidth = 3;
this->SetMenuItemCheck(0,1,4,1);
}
//宽度5菜单项处理函数
void CDrawTestView::OnPen5()
{
// TODO: Add your command handler code here
m_PenWidth = 5;
this->SetMenuItemCheck(0,1,4,2);
}
//宽度7菜单项处理函数
void CDrawTestView::OnPen7()
{
// TODO: Add your command handler code here
m_PenWidth = 7;
this->SetMenuItemCheck(0,1,4,3);
}
//画笔颜色下黑色菜单项处理函数
void CDrawTestView::OnPenBlack()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,0,0);
this->SetMenuItemCheck(0,2,4,0);
}

//画笔颜色下红色菜单项处理函数
void CDrawTestView::OnPenRed()
{
// TODO: Add your command handler code here
m_PenColor = RGB(255,0,0);
this->SetMenuItemCheck(0,2,4,1);
}
//画笔颜色下绿色菜单项处理函数
void CDrawTestView::OnPenGreen()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,255,0);
this->SetMenuItemCheck(0,2,4,2);
}
//画笔颜色下蓝色菜单项处理函数
void CDrawTestView::OnPenBlue()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,0,255);
this->SetMenuItemCheck(0,2,4,3);
}

//None菜单项处理函数
void CDrawTestView::OnBrushNone()
{
// TODO: Add your command handler code here
m_BrushStyle = -1;
this->SetMenuItemCheck(1,0,7,0);
}
//HS_BDIAGONAL菜单项处理函数
void CDrawTestView::OnBrushBdiagonal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_BDIAGONAL;
this->SetMenuItemCheck(1,0,7,1);
}

//HS_CROSS菜单项处理函数
void CDrawTestView::OnBrushCross()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_CROSS;
this->SetMenuItemCheck(1,0,7,2);
}
//HS_DIAGCROSS菜单项处理函数
void CDrawTestView::OnBrushDiagcross()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_DIAGCROSS;
this->SetMenuItemCheck(1,0,7,3);
}

//HS_FDIAGONAL菜单项处理函数
void CDrawTestView::OnBrushFdiagonal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_FDIAGONAL;
this->SetMenuItemCheck(1,0,7,4);
}
//HS_HORIZONTAL菜单项处理函数
void CDrawTestView::OnBrushHorizontal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_HORIZONTAL;
this->SetMenuItemCheck(1,0,7,5);
}

//HS_VERITICAL菜单项处理函数
void CDrawTestView::OnBrushVertical()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_VERTICAL;
this->SetMenuItemCheck(1,0,7,6);
}
//画刷颜色下白色菜单项处理函数
void CDrawTestView::OnBrushWhite()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(255,255,255);
this->SetMenuItemCheck(1,1,4,0);
}
//画刷颜色下红色菜单项处理函数
void CDrawTestView::OnBrushRed()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(255,0,0);
this->SetMenuItemCheck(1,1,4,1);
}
//画刷颜色下绿色菜单项处理函数
void CDrawTestView::OnBrushGreen()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(0,255,0);
this->SetMenuItemCheck(1,1,4,2);
}
//画刷颜色下蓝色菜单项处理函数
void CDrawTestView::OnBrushBlue()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(0,0,255);
this->SetMenuItemCheck(1,1,4,3);
}
我们在CDrawTestView类中再添加两个函数GetPen和GetBrush来获得自定义画笔和画刷指针,函数代码如下:
//获得自定义画笔指针
CPen* CDrawTestView::GetPen()
{
return new CPen(m_PenStyle,m_PenWidth,m_PenColor);
}
//获得自定义画刷指针
CBrush* CDrawTestView::GetBrush()
{
//判断是否是阴影线画刷
if (m_BrushStyle == -1)
//不是阴影线画刷
return new CBrush(m_BrushColor);
else
//是阴影线画刷
return new CBrush(m_BrushStyle,m_BrushColor);
}
编写这两个函数的好处在于:如果以后需要更改获得画笔或者画刷的方式(比如画笔改用第三个构造函数来构造),只需要修改这两个函数即可。如果在每个绘图函数菜单项的处理函数中写构造画笔和画刷的代码,一旦画笔和画刷的构造方式要发生改变,就必须逐个修改每个绘图函数菜单项的处理函数。
现在修改绘图函数菜单项的处理函数,调用GetPen和GetBrush函数获得画笔和画刷,然后选用画笔和画刷,并在函数的最后删除画笔和画刷。这是因为获得画笔和画刷的函数每次都是构造新的画笔和画刷,而它们将占用系统资源,所以在使用完毕后要进行删除。而LineTo等绘制线形图形的绘图函数不受画刷影响,所以在这些绘图函数的处理函数中不需要选用画刷。因为所有线形图形绘图函数菜单项的处理函数要添加的代码是相同的,同样所有区域图形绘图函数菜单项的处理函数要添加的代码也是相同的,所以这里只列出“LineTo”(绘制线形图形)菜单项和“Rectangle”(绘制区域图形)菜单项修改后的处理函数代码,读者只需按照相同方法修改其它处理函数即可。修改后的代码如下:
//LineTo菜单项处理函数
void CDrawTestView::OnDrawLineto()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CPen* pen = this->GetPen();
dc.SelectObject(pen);
dc.MoveTo(300,300);
dc.LineTo(400,400);
pen->DeleteObject();
}
//Rectangle菜单项处理函数
void CDrawTestView::OnDrawRectangle()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CPen* pen = this->GetPen();
CBrush* brush = this->GetBrush();
dc.SelectObject(pen);
dc.SelectObject(brush);
dc.Rectangle(450,100,650,250);
pen->DeleteObject();
brush->DeleteObject();
}
代码中粗体字部分是后添加的代码,修改原则是在获得设备环境对象之后,调用绘图函数之前,先获得画笔或画笔和画刷,然后让设备环境对象选用它们。最后在所有绘图函数执行完后,删除前面获得的画笔或画笔和画刷。
下面我们看一个例子,修改OnDraw函数,输入如下代码:
void CDrawTestView::OnDraw(CDC* pDC)
{
CDrawTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//构造要输出的文本字符串
CString s;
s = "DrawTest Function";
//构造文本要输出的矩形区域
CRect r;
r.left = 50;r.right =150;
r.top =10;r.bottom = 40;
//绘制矩形,以便确定输出的文本在矩形区域中的位置
pDC->Rectangle(r);
//水平,垂直方向都居中,单行显示,超出区域范围不剪切
pDC->DrawText(s,r,DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_NOCLIP);
//向下平移矩形区域
r.top = r.top + 50;r.bottom = r.bottom +50;
pDC->Rectangle(r);
//垂直方向居底,水平方向靠右,单行显示
pDC->DrawText(s,r,DT_BOTTOM|DT_RIGHT|DT_SINGLELINE);
//向下平移矩形区域
r.top = r.top + 50;r.bottom = r.bottom +50;
pDC->Rectangle(r);
//垂直方向居顶,水平方向靠左,超出矩形区域时,在单词之间换行
pDC->DrawText(s,r,DT_TOP|DT_LEFT|DT_WORDBREAK);
//向下平移矩形区域
r.top = r.top + 50;r.bottom = r.bottom +50;
pDC->Rectangle(r);
//垂直方向居中,水平方向靠左,单行显示,超出范围时用省略号取代字符串尾部字符
pDC->DrawText(s,r,
DT_VCENTER|DT_LEFT|DT_SINGLELINE|DT_END_ELLIPSIS);
}

怎么用MFC编一个绘制多边形的程序啊
绘制连接lpPoints指定点的一组线段(无填充)pDC->PolyLine(LPPOINT lpPoints ,int nCount);lpPoints 用于连接的POINT结构或CPoint对象的指针。nCount 数组中的点的数目。其值不小于2。使用当前画笔绘制由直线连接的包含两个以上顶点的多边形。(有填充)pDC-> Polygon(LPPOINT lpPoints ,int nCount);...

MFC中用CPen画图形的基本步骤
CPen m_pen;\/\/首先定义一个对象 CPen *oldPen;m_pen.CreatePen(PS_SOLID,2,RGB(192,192,192));\/\/创建一个画笔(这里是实线画笔)oldPen = pDC->SelectObject(&m_pen);\/\/将画笔对象选入DC,替换oldPen pDC->MoveTo(10,10);\/\/绘制操作 pDC->LineTo(20,20);pDC->SelectObject(oldPen);\/...

请教一下用mfc画图的例子。。比如画一条直线或者很简单的图形。。谢谢...
mfc 通常在 CView 里的 OnDraw 画图 CDC 有画图函数,例如直线,弧线,bitmap, 涂色...void CXxxView::OnDraw(CDC* pDC){ CPoint p0,p[10];CPen aPen[8];CPen* poldPen;\/\/定义各式各样线型和颜色,不定义则为 黑细实线。aPen[0].CreatePen(PS_SOLID ,1,COLORREF(0x0000ff)); aPe...

用MFC写一个界面,其中画一条会动的直线。
圆已存在的情况下,输入l回车后不要急于点下第一点,再输入tan回车,然后鼠标移动到圆旁边会出现捕捉到圆而且是切线的状态,这个时候点下鼠标左键。然后再用相对极坐标法输入直线的参数@l<d回车(l就是线的长度,d就是线的角度)。例如线长100,角度30度就输入@100<30后回车。

mfc创建画布,单击画布产生一个白色背景的小圆
以下代码演示了VC绘图的基本操作:CRect bk(50,50,500,400); \/\/画布区域设置 CClientDC dc(this); \/\/获取对话框DC CBrush gBrush(RGB(0, 255, 0)); \/\/创建绿色画刷 CBrush* pOldBrush=dc.SelectObject(&gBrush); \/\/选中画刷 dc.Rectangle(bk); \/\/绘画布 CBrush wBrush(RGB...

如何在MFC中画出规定大小的图框,并在上面实现显示功能
HDC hdc=::CreateDC("DISPLAY",0,0,0)\/\/创建整个屏幕DC 在这个DC上不仅能越过控件覆盖还能越过主窗口覆盖,如果你的程序不在前面但是调用了绘图语句就会把图绘到别的窗口上去了.至于它的坐标就得你自己计算了(如使用:ScreenToClient(),ClientToScreen()等函数)....

请问MFC 根据数据怎么在对话框上画曲线图。 要有坐标。 求大神帮忙,最...
在OnPaint()或者在OnDraw()画图都可以。下面是以一个数组里边的数据画图的例子 void CFftDlg::OnPaint(){ CPaintDC dc(this); \/\/ device context for painting \/\/ TODO: 在此处添加消息处理程序代码 CRect rect;int m_Low=0;int m_High=100;int m_Low1=-1;int m_High1=1;CString str;i...

关于MFC绘图!
1. 添加对按钮消息的处理函数,在 你想要的位置 画图标,同时记录这个位置;2. 添加对鼠标消息的处理函数,如果是左键单击是WM_LBUTTONDOWN,如果是双击是WM_LBUTTONDBCLK,右键单击是WM_RBUTTONDOWN。在里面可以获取到 鼠标点击时的位置,判断是否和某个 已知图标的位置一致,如果是则做相应的动作。...

我想在基于对话框的MFC程序中画图,画图程序可以不写在OnPaint函数中吗...
1.可以不在OnPaint中 2.其机制是:a.windows是多窗口的,你的程序不应该把图画到其它地方去,所以你要取得窗口的专门管绘图的一个句柄,叫做 HDC b.你用MFC,要取它的话用这句: CDC* pDC=this->GetDC(); (某窗口的DC,例如本窗口就是this)c.然后就可以向DC中画了,例如:pDC->LineTo(100,100...

怎么在mfc中画曲线
做一个CStatic派生控件的基本步骤:1)定义一个从CStatic派生的类。2)重载有关消息映射,WM_PAINT,WM_ERASEBKGND 3) 在OnPaint中绘图,在这里根据实际的需要做不同的计算,绘制。大致可分为以下几步,I布局计算,CStatic是整个绘图区,将这个区域划分为边缘空白,坐标轴区,曲线区等几个部分,需要算...

相似回答