图形的保存和重绘
首先建立画图的四个选项:点,线,矩形,椭圆的按钮,并添加成员变量,表示每个图形的种类;
其次添加m_drawtype,和cpoint记录用户选择的画图类型和点的坐标位置;
添加消息响应函数,BUTTONDOWN和BTUTTONUP;并在函数里面实现画图的函数;
void CGraphic1View::OnPoint() { // TODO: Add your command handler code here m_nDrawType=1; } void CGraphic1View::OnLine() { // TODO: Add your command handler code here m_nDrawType=2; } void CGraphic1View::OnRectangle() { // TODO: Add your command handler code here m_nDrawType=3; } void CGraphic1View::OnElipse() { // TODO: Add your command handler code here m_nDrawType=4; } void CGraphic1View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonDown(nFlags, point); m_point=point; } void CGraphic1View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//此处利用CBrush里面的静态创建Fromhandle()函数,通过一个dc句柄来创建一个画刷,dc句柄通过GetstockObject()获得,传递一个透明画刷,并强转成画刷格式; dc.SelectObject(pBrush); switch(m_nDrawType) { case 1: dc.SetPixel(point,RGB(0,1,0)); break; case 2: dc.MoveTo(m_point); dc.LineTo(point); break; case 3: dc.Rectangle(CRect(m_point,point)); break; case 4: dc.Ellipse(CRect(m_point,point)); break; default: break; } CView::OnLButtonUp(nFlags, point); }
此时可以画图,但是当窗口变化时,图像消失,因此,想到建立一个数据结构,保存用户画的图像特点,然后将其重画;因此插入一个普通类,保存图像数据;
class CGraphic { public: CGraphic(); CGraphic(UINT m_SaveDrawType,CPoint m_StartPoint,CPoint m_EndPoint);//重载一个初始化函数,方便用户对3个成员变量赋值 virtual ~CGraphic(); public: UINT m_SaveDrawType; CPoint m_StartPoint; CPoint m_EndPoint; };
关于图形坐标的轮换操作需要重新疏导,有点乱