MFC-获取HDC方法

 

获取HDC方法 

方法一:GetDC

在 WM_PAINT消息和ONPaint函数之外的获取方法

在桌面画一条直线

    HDC hdc=::GetDC(NULL);
    //参数:HWND hWnd  窗口句柄
    //            如果该值为NULL,GetDC则检索桌面DC
    //返回值:如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为Null
    BOOL b=::MoveToEx(hdc, 100, 100, NULL);//将当前绘图位置移动到指定点,同时获取之前位置的坐标
    /*
    参数1:HDC hdc  DC句柄
    参数2:int X   新位置的X坐标
    参数3:int Y   新位置的Y坐标
    参数4:LPPOINT lpPoint  一个指向POINT结构的指针,用来存放上一个点的位置
                                    若此参数为NULL,则不保存上一个点的位置    
    返回值:返回TRUE代表移动成功,FALSE代表失败
    */

    b=LineTo(hdc, 500, 300);//画直线
    /*
    从当前位置向目标点(参数2和参数3)画直线
    函数调用完毕,当前位置变成x,y
    参数1:HDC hdc  DC句柄
    参数2:int X   线段终点X坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
    参数3:int Y   线段终点Y坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
    返回值:返回TRUE代表移动成功,FALSE代表失败
    */


    int ii=::ReleaseDC(NULL,hdc);//释放DC句柄
    /*
    参数 1:HWND hWnd  窗口的句柄
    参数2:HDC hdc 指向要释放的设备上下文环境的句柄
    返回值:如果释放成功,则返回值为1;如果没有释放成功,则返回值为0
    */

 

在应用程序的主窗口画线

    HDC hDC = ::GetDC(m_hWnd);
    //m_hWnd是窗口句柄
    ::MoveToEx(hDC, 0, 0, NULL);
    LineTo(hDC, 200, 50);
    ::ReleaseDC(m_hWnd, hDC);

使用MFC CWnd类

    CDC* pDC = GetDC();
    CPoint point=pDC->MoveTo(0, 0);//将当前位置移动到 x 和 y(或 point)指定的点
    /*
    CPoint MoveTo(int x,int y);
    CPoint MoveTo(POINT point);
    返回值:作为 CPoint 对象的前一个位置的 x 坐标和 y 坐标
    */
    pDC->LineTo(200, 100);//从当前位置绘制一条直到(但不包括)x 和 y(或 point)指定的点的线条
    /*
    BOOL LineTo(int x,int y);
    BOOL LineTo(POINT point);
    返回值:如果绘制线条,则为非零;否则为 0
    
    */
    ReleaseDC(pDC);

CWindowDC

    CWindowDC dc(this); //获取DC
    /*
    参数:CWnd* pWnd   窗口句柄
    */
    CPen pen(PS_SOLID, 3, RGB(0, 0, 255));//画笔
    /*
    参数1:Int style  画笔的样式
            PS_SOLID 创建一个实线画笔
            PS_DASH 创建一个虚线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
            PS_DOT 创建一个点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
            PS_DASHDOT 创建一个点和虚线交替画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
            PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
            PS_NULL 创建一个空线画笔
            PS_INSIDEFRAME 创建一个内框线画笔,该画笔可以在WindowsGDI输出函数定义的矩形边界所生成的封闭形状的边框内绘制直线
            PS_GEOMETRIC 创建一个几何画笔
            PS_COSMETIC 创建一个装饰画笔
            PS_ALTERNATE 创建一个设置其他像素的画笔
            PS_USERSTYLE 创建一个使用由用户提供的风格矩阵的画笔
            PS_ENDCAP_ROUND 尾帽为圆形的
            PS_ENDCAP_SQUARE 尾帽为方形的
            PS_ENDCAP_FLAT 尾帽为平坦的
            PS_JOIN_BEVEL 成尖角连接
            PS_JOIN_MITET 通过setMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接
            PS_JOIN_ROUND 成圆角连接
    参数2:int width  画笔的宽度
    参数3:COLORREF color  画笔的颜色(颜色用RGB值来描述)
    */
    CPen* pOldPen = dc.SelectObject(&pen);//新对象替换先前的相同类型的旧对象
    /*
    对象可以是: CPen对象、CBrush对象、CFont对象、CBitmap对象、CRgn对象、CGdiObject对象
    参数:新对象指针
    返回值:旧对象的指针
    
    */
    dc.MoveTo(0, 0);
    dc.LineTo(200, 200);
    dc.SelectObject(pOldPen);
    ReleaseDC(&dc);
    //这段代码演示了如何在堆中创建指向CDC派生类的指针,
    //再利用该指针进行画图,最后请使用delete pDC; 释放指针

    CWindowDC* pDC;
    pDC = new CWindowDC(this);
    pDC->MoveTo(0, 0);
    pDC->LineTo(200, 250);
    delete pDC;

 

 

方法二:BeginPaint

LRESULT CGUIdlgDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: 在此添加专用代码和/或调用基类

    switch (message)
    {
    case WM_PAINT: //要求一个窗口重画自己
                
        PAINTSTRUCT ps;
        /*
        PAINTSTRUCT:窗口客户区信息的结构体
        typedef struct tagPAINTSTRUCT {
        HDC hdc;   //DC句柄
        BOOL fErase;  //如果为非零值则擦除背景,否则不擦除背景
        RECT rcRect; //要绘制的矩形范围,该矩形单位相对于客户区左上角
        BOOL fRestore; //是否需要还原
        BOOL fIncUpdate;
        BYTE rgbReserved[32];
        } PAINTSTRUCT, *PPAINTSTRUCT;
        后面三个参数都是系统预留的,编程一般用不到

        */

        TCHAR t[] = _T("WM_PAINT消息");
        HDC hDC = ::BeginPaint(m_hWnd,&ps);
        ::TextOut(hDC, 150, 100, t, _tcslen(t));//将一个字符串写到指定位置
        /*
        参数1:HDC hdc DC句柄
        参数2:int nXStart  字符串的开始位置 x坐标
        参数3:int nYStart  字符串的开始位置 y坐标
        参数4:LPCTSTR lpString   字符串
        参数5:int cbString    字符串中字符的个数
        
        */
        ::EndPaint(m_hWnd, &ps);
                
        break;

    }

    return CDialogEx::WindowProc(message, wParam, lParam);
}

 

 

 

方法三:CreateCompatibleDC

 

看:https://www.cnblogs.com/liming19680104/p/17338155.html

 

 

 

 

 

 

 

 

 

 

posted @ 2023-04-08 09:39  天子骄龙  阅读(539)  评论(0编辑  收藏  举报