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中完成。

一次性拷贝到屏幕:使用BitBltStretchBlt将内存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编程必学的重要部分,可以绘制许多图形,多去试试吧

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐