1.划线
1.1使用sdk划线
void CDrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptori = point;
CView::OnLButtonDown(nFlags, point);
}
void CDrawDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
HDC Dcdraw= ::GetDC(this->m_hWnd);
::MoveToEx(Dcdraw, m_ptori.x, m_ptori.y, NULL);
::LineTo(Dcdraw, point.x, point.y);
::ReleaseDC(this->m_hWnd, Dcdraw);
CView::OnLButtonUp(nFlags, point);
}
1.2使用mfc划线
1.2.1 使用cdc类划线
CDC *dcdraw = GetDC();
dcdraw->MoveTo(m_ptori.x, m_ptori.y);
dcdraw->LineTo(point.x, point.y);
ReleaseDC(dcdraw);
1.2.2 使用CClientDC划线
CClientDC dcdraw(this);
dcdraw.MoveTo(m_ptori.x, m_ptori.y);
dcdraw.LineTo(point.x, point.y);
说明:CCobject->CDC->CClientDC,CClientDC在创建对象时就会调用GetDC,在对象析构的时候就会调用ReleaseDC,作图只能在客户区
1.2.3 使用CWindowDC划线
CWindowDC dcdraw(GetDesktopWindow());
dcdraw.MoveTo(m_ptori);
dcdraw.LineTo(point);
说明:CCobject->CDC-CWindowDC,CWindowDC在创建对象时就会调用GetDC,在对象析构的时候就会调用ReleaseDC
作图区域可以包含客户区以及非客户区(菜单栏,标题栏等)
注:可以通过设置指向不同窗体的DC的指针,在不同的窗体区域作图
如:GetDesktopWindow()在整个屏幕区域
GetParent()在当前窗体的父窗体
2.使用画笔
CPen pen(PS_SOLID, 1, RGB(255, 0, 255)); //使用RGB宏得到返回值类型是COLORREF
CClientDC dcdraw(this);
CPen *penold = dcdraw.SelectObject(&pen); //返回值是原先DC使用的画笔
dcdraw.MoveTo(m_ptori);
dcdraw.LineTo(point);
dcdraw.SelectObject(penold); //避免其他地方用到dc时画笔发生改变
3.使用画刷
3.1使用颜色画刷填充矩形区域
CBrush CBsh(RGB(255,0,0));
CClientDC dcdraw(this);
CBrush *coldbsh = dcdraw.SelectObject(&CBsh);
dcdraw.FillRect(CRect(m_ptori, point), &CBsh); //CRect可以用来替换要求类型是RECT,LPCRECT或LPRECT的参数
dcdraw.SelectObject(coldbsh);
3.2创建位图画刷
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //使用位图画刷必须初始化位图对象,位图对象初始化可以通过LoadBitmap(资源ID)来实现
//使用路径加载资源错误,需要查找原因
CBrush bsh(&bitmap);
CClientDC dcdraw(this);
CBrush *oldbsh = dcdraw.SelectObject(&bsh);
dcdraw.FillRect(CRect(m_ptori, point), &bsh);
dcdraw.SelectObject(oldbsh);
3.3创建透明画刷,绘制矩形
CClientDC dcdraw(this);
CBrush *bsh = CBrush::FromHandle((HBRUSH)::GetStockObject(NULL_BRUSH));
CBrush *oldbsh = dcdraw.SelectObject(bsh);
dcdraw.Rectangle(CRect(m_ptori, point));
dcdraw.SelectObject(oldbsh);
注
::GetStockObject(NULL_BRUSH)返回透明背景画刷句柄
CBrush::FromHandle使用CBrush类的静态成员函数将画刷句柄转换成画刷指针
4.关于C++中的静态成员
4.1静态数据成员需要在类外部进行初始化,类型 类名::数据成员名 = 赋值 //如int classname::varname=3; 不需要加static
4.2静态成员函数不能使用类内部非静态的数据成员
4.3静态成员初始化在类的构造函数之前完成
5.绘制扇形以及连续线段
5.1连续线段
添加WM_MOUSEMOVE消息响应,在判断接受到该消息时鼠标左键已经按下,进行划线操作
void CDrawDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
if(TRUE == m_Mouseflag) //记录鼠标左键按下标志位
{
CClientDC DCdraw(this);
DCdraw.MoveTo(m_ptori);
DCdraw.LineTo(point);
m_ptori = point;
}
CView::OnMouseMove(nFlags, point);
}
5.2绘制扇形
m_ptori = point; //左按下时键保存原点
CPen pen(PS_SOLID, 1, RGB(255,0, 0));
CClientDC DCdraw(this);
CPen *oldpen = DCdraw.SelectObject(&pen);
if (TRUE == m_mouseflag)
{
DCdraw.MoveTo(m_ptori); //每次绘制从原点到当前点
DCdraw.LineTo(point);
}
DCdraw.SelectObject(oldpen);