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