C++ WINDOW HDC大全
hdc是什么
HDC是Windows图形设备接口(GDI)中的句柄,指向操作系统维护的绘图环境数据结构。它封装了设备的绘制属性(如分辨率、调色板等),提供与设备无关的图形接口,支持屏幕、打印机、内存位图等多种输出目标。
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
//可以在这里绘图
EndPaint(hwnd,&ps);
笔与刷
1 SelectObject和DeleteObject
调用SelectObject选入新对象(画笔、笔刷、字体···),同时必须保存原对象,并在绘图完成后恢复原对象(防止绘图属性(颜色、线型、字体···)泄漏到其他绘图操作中)
自定义对象(如CreatePen创建的画笔)需通过DeleteObject释放,避免内存泄漏。
2 画笔pen
用于绘制图形的轮廓(如线条、边框)
//创建蓝色虚线画笔(宽度为1像素)
HPEN bluePen=CreatePen(PS_DASHDOT,1,RGB(0,0,255));
//创建红色实心画笔(宽度为2像素)
HPEN redPen=CreatePen(PS_SOLID,2,RGB(255,0,0));
//将新画笔其选入HDC,使其成为当前画笔,并保留原画笔
HPEN oldPen=(HPEN)SelectObject(hdc,redPen);
//恢复原画笔,并释放资源
SelectObject(oldPen);
DeleteObject(redPen);
3 笔刷brush
用于填充图形的颜色
HBRUSH hCustomBrush = CreateSolidBrush(RGB(255, 0, 0)); // 创建红色笔刷
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hCustomBrush);
Ellipse(hdc, 100, 100, 300, 300); // 绘制椭圆并填充红色
SelectObject(hdc, hOldBrush);
DeleteObject(hCustomBrush); // 释放自定义笔刷资源
ReleaseDC(hWnd, hdc);
绘图函数
Rectangle(hdc, left, top, right, bottom);//矩形
TextOut(hdc, x, y, text, textLength);//文字
Polygon(hdc, points, count);//多边型
Arc(hdc, left, top, right, bottom, xStart, yStart, xEnd, yEnd);//圆弧
PolyBezier(hdc, points, count);//赛贝尔曲线
。。。
双缓冲技术
作用
单缓冲直接在屏幕DC上绘制,如果绘图过程较复杂(如绘制大量图形或动画),用户会看到背景擦除→部分绘制→完整绘制的中间过程,导致视觉上的闪烁,这时需要用双缓冲来消除闪烁。
那为什么双缓冲可以消除闪烁呢?因为双缓冲由于内存操作对用户不可见,最终用户只看到完整的绘图结果,从而消除闪烁。
操作
创建内存DC:在内存中创建一个与屏幕兼容的设备上下文(DC)。
在内存DC上绘制:有绘图操作(如矩形、文本、位图)先在内存DC中完成。
一次性拷贝到屏幕:使用BitBlt或StretchBlt将内存DC的内容快速拷贝到屏幕DC。
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps); // 屏幕DC
// 1. 获取客户区大小
RECT rect;
GetClientRect(hWnd, &rect);
// 2. 创建内存DC和兼容位图
HDC hMemDC = CreateCompatibleDC(hdc); // 内存DC
HBITMAP hMemBitmap = CreateCompatibleBitmap(hdc, rect.right, rect.bottom); // 兼容位图
SelectObject(hMemDC, hMemBitmap); // 将位图选入内存DC
// 3. 在内存DC上绘制(背景+内容)
FillRect(hMemDC, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH)); // 填充白色背景
// 绘制示例图形
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255));
SelectObject(hMemDC, hPen);
SelectObject(hMemDC, hBrush);
Rectangle(hMemDC, 50, 50, 200, 200); // 矩形
Ellipse(hMemDC, 250, 50, 400, 200); // 椭圆
// 4. 将内存DC拷贝到屏幕DC
BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
// 5. 释放资源
DeleteObject(hPen);
DeleteObject(hBrush);
DeleteObject(hMemBitmap);
DeleteDC(hMemDC);
EndPaint(hWnd, &ps);
break;
}
结语
WINDOW HDC是c++window编程必学的重要部分,可以绘制许多图形,多去试试吧
更多推荐


所有评论(0)