MFC(三)(作图)
MFC中作图主要有两种方式:
其一,直接调用API,如下:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// this->MessageBox("鼠标左键被按下了。");
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//所有从cwnd类继承过来的子类都有这个窗口句柄m_hWnd
HDC hdc;
//调用全局的MFC 的API函数前面加::表示是全局的而不是类自己的
hdc=::GetDC(m_hWnd);
//将当前鼠标位置移动到之前的位置
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
CView::OnLButtonUp(nFlags, point);
}
其二:用MFC给我们封装好的CDC类(MFC将所有作图有关的功能封装在CDC类中,就如所有与窗口有关的函数都封装在Cwnd类中一样),实例如下:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// this->MessageBox("鼠标左键被按下了。");
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *cdc;
//注意此处的getDC函数不加::表明调用的是Cwnd类封装的GetDC函数
cdc=GetDC();
cdc->MoveTo(m_ptOrigin);
cdc->LineTo(point);
ReleaseDC(cdc);
CView::OnLButtonUp(nFlags, point);
}
第三种方式,用CClient对象进行画图(其为CDC类的子类),如下:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//其中CClientDC类的构造函数传递的是窗口类句柄Cwnd而不是窗口类对象Hwnd
CClientDC client(this);
client.MoveTo(m_ptOrigin);
client.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
第四种方式CWindowDC,如果初始化的是Frame类的窗口句柄则可以把图形画在整个窗口,包括客户区和非客户区:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//CWindowDC dc(this);
//在View类中获取父窗口Frame类的的窗口对象
CWindowDC dc(GetParent());
//获取桌面窗口的窗口对象,可以将图画到桌面
//CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
改变画笔颜色、样式、宽度等各项属性画图:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPen pen(PS_DOT,3,RGB(255,0,0));
CClientDC dc(this);
//将创建的画笔对象传到设备环境,并返回之前的画笔对象
CPen *oldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(oldPen);
CView::OnLButtonUp(nFlags, point);
}
改变画刷去填充:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CBrush brush(HS_CROSS,RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
位图画刷:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
透明的画刷:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//其中GetStockObject()函数是取得一个透明的画刷的句柄,且必须进行强制类型转换,因为取得的是一个CObject类型的句柄。然后用FromHandle函数将画刷句柄转化为画刷对象
//FromHandle是CBrush类的静态方法
CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CClientDC dc(this);
CBrush *oldBrush=dc.SelectObject(brush);
//画矩形
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(oldBrush);
CView::OnLButtonUp(nFlags, point);
}
设置绘图模式,就要是设置绘图的前景色和屏幕已有的颜色的混合模式来调整画笔的颜色:
dc.SetROP2(R2_XORPEN);