C++ 笔记005 HDC+CDC+CClientDC+CWindowDC+CPen+CBrush

一平台SDK的 HDC dc=::GetDC(HWND hWnd); 参数传入MFC内部维护的一个HWND类型的内部成员 m_hWnd

     HDC hdc = ::GetDC( m_hWnd );

     获取到hdc后把hdc移动 MoveToEx( HDC dc, int dcTargetX, int dcTargetY, LPPOINT oldPoint)  到一个指定的点(dcTargetX,dcTargetY),同时还可以获取hdc移动前的位置oldPoint,它是一个输出参数 oldPoint->x,oldPoint->x 默认 0。

     画直线 LineTo(dc,targetX,targety) //从DC的oldPoint点开始画一条线到目标点(targetX,targety) ,绘制完成更新DC的oldPoint为当前目标点。

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if(isLButtonDown) //如果左键按下
    { 
    HDC dc = ::GetDC(m_hWnd);//获取dc                    //xxxxView.h中声明的 private: CPoint m_m_CPoint;成员变量
    ::MoveToEx(dc, m_CPoint.x, m_CPoint.y, nullptr);    //移动dc
    LineTo(dc, point.x, point.y);                       //画线 dc 从(m_CPoint.x, m_CPoint.y)----> (point.x, point.y)
    m_CPoint = point;                                   //更新m_CPoint的坐标为当前鼠标的坐标点,因为画的是一条连续多段线
    ::ReleaseDC(m_hWnd, dc); //释放dc
    }
    CView::OnMouseMove(nFlags, point);
    
}

CDC 它是MFC提供的一个封装了所有绘图相关的类, 它提供了很多成员函数,包括LineTo() MoveTo()等函数, 其内部也维护了一个数据成员保存了一个 m_hDC句柄

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CDC *pDc = GetDC();    //获取dc
        pDc->MoveTo(m_CPoint); //移动dc
        pDc->LineTo(point);    //画线
        m_CPoint = point;     //更新m_CPoint的坐标为当前鼠标的坐标点
        ReleaseDC(pDc);//释放dc
    }
    CView::OnMouseMove(nFlags, point);

}

CClientDC继承自CDC, 构造器中调用了GetDC(),析构中调用了ReleaseDC(),因此在使用它时,无需显示调用这两个函数,同样它需要CWnd类型的参数,View继承了CWND因此

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CClientDC dc(this);    //指View类对象自己,CClientDC构造器中调用了GetDC(),无需显式地调用GetDC了.这里只是把线画在了View区(白色区域),如果要画在客户区上则GetParent(),此时线可以画工具栏上了
        //但是菜单栏上画线还不能画出来
        dc.MoveTo(m_CPoint); //移动dc
        dc.LineTo(point);    //画线
        m_CPoint = point;     //更新m_CPoint的坐标为当前鼠标的坐标点
        //析构的时候ReleaseDC,因此不需要显示调用释放DC的函数
    }
    CView::OnMouseMove(nFlags, point);
}
//View类只有客户区,没有非客户区,但是框架窗口分客户区和非客户区

CWindowDC 继承自CDC类 可以访问屏幕区和非屏幕区了.同样它在构造和析构中调用了获取DC和释放DC的函数.它可以在客户区和非客户区绘制图形

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CWindowDC dc(GetParent());//可以在菜单栏\标题栏上画了
//CWindowDC dc(GetDesktopWindow());//此时线可以画到当前应用程序的窗口之外了
dc.MoveTo(m_CPoint); //移动dc dc.LineTo(point); //画线 m_CPoint = point; //更新m_CPoint的坐标为当前鼠标的坐标点 //析构的时候ReleaseDC,因此不需要显示调用释放DC的函数 } CView::OnMouseMove(nFlags, point); }

//DC结束 以上画的线都是黑色的,线型也很单一

五 使用画笔CPen(int nPenStyle,int nWidth, COLORREF crColor)

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CPen pen(PS_SOLID,2,RGB(255,0,0));    //创建画笔对象,红色笔 画实线 线粗2像素,如果绘制PS_DASH或PS_DOT或 PS_DASHDOT,笔粗细<=1,否则不会有效果
        CClientDC dc(this);                   //获取DC
        CPen* oldPen = dc.SelectObject(&pen); //把pen选择到设备描述表,同时保存原来的画笔
        dc.MoveTo(m_CPoint); //移动dc
        dc.LineTo(point);    //画线
        m_CPoint = point;     //更新m_CPoint的坐标为当前鼠标的坐标点
        dc.SelectObject(oldPen); //选择回设备描述表
    }
    CView::OnMouseMove(nFlags, point);
}

六 使用CBursh画图

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CBrush brush(RGB(26,102,179));//创建画笔对象,红色笔 画实线 线粗2像素,如果绘制PS_DASH或PS_DOT或 PS_DASHDOT,笔粗细<=1,否则不会有效果
        CClientDC dc(this);           //获取DC
        dc.FillRect(CRect(m_CPoint,point),&brush); //填充,不需要把之前的对象保存到设备选择表
    }
    CView::OnMouseMove(nFlags, point);
}

用画刷,把一张位图作为背景图

void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
    if (isLButtonDown) //如果左键按下
    {
        CBitmap bmp;                  //不能直接初始化,一般需要初始化函数
        bmp.LoadBitmapW(IDB_BITMAP1); //需要 #include "resource.h"
        CBrush brush(&bmp);            //创建背景图画刷
        CClientDC dc(this);            //获取DC
        dc.FillRect(CRect(m_CPoint, point), &brush); //填充,不需要把之前的对象保存到设备选择表
    }
    CView::OnMouseMove(nFlags, point);
}

使用dc.Rectangle(CRect(m_CPoint, point))绘制的矩形框,它内部带有一把白色的画刷,后面画的会把前面画的遮挡住

要实现线框模式:

//dc.SetROP2(); 是绘画模式设置,比如翻转笔跟背景色等

猜你喜欢

转载自www.cnblogs.com/zhou8744/p/10415884.html