You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32 API绘制多条直线异常:仅显示第一条线的问题求助

问题分析与修复方案

核心问题

  1. WM_PAINT绘制上下文错误:原代码中每次调用DrawLine都执行BeginPaint,但未配对调用EndPaint。在Win32的WM_PAINT消息周期内,多次调用BeginPaint会导致后续调用无法获取有效绘制上下文,系统会认为绘制区域已处理完毕,后续的SetPixel操作无法生效。
  2. Bresenham算法局限性:原算法仅处理了x坐标递增(dx ≥ 0)的直线,当直线从右到左(x1 < x0)时,dx为负,循环条件i <= dx不成立,直线无法绘制。

修复后的代码

1. 修正直线绘制函数(DrawLine)

将绘制上下文(HDC)作为参数传入,移除内部的BeginPaint/EndPaint调用,并完善算法处理x递减的场景:

void DrawLine(HDC hdc, int x0, int y0, int x1, int y1) {
    int d, dx, dy, x, y, yi, xi;

    dx = x1 - x0;
    dy = y1 - y0;
    yi = 1;
    xi = 1;

    // 处理x坐标递减的情况
    if (dx < 0) {
        xi = -1;
        dx = -dx;
    }
    // 处理y坐标递减的情况
    if (dy < 0) {
        yi = -1;
        dy = -dy;
    }

    d = 2 * dy - dx;
    x = x0;
    y = y0;

    for (int i = 0; i <= dx; i++) {
        SetPixel(hdc, x, y, RGB(0, 0, 0));
        if (d > 0) {
            y += yi;
            d += 2 * (dy - dx);
        } else {
            d += 2 * dy;
        }
        x += xi;
    }
}

2. 修正三角形绘制函数(DrawTriangle)

同样改为接收HDC参数,传递给直线绘制函数:

void DrawTriangle(HDC hdc, int x0, int y0, int x1, int y1, int x2, int y2){
    DrawLine(hdc, x0, y0, x1, y1);
    DrawLine(hdc, x1, y1, x2, y2);
    DrawLine(hdc, x2, y2, x0, y0);
}

3. 修正WM_PAINT消息处理

在WM_PAINT中仅执行一次BeginPaint和EndPaint,将HDC传递给三角形绘制函数:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch(msg) {
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hwnd, &ps);
                DrawTriangle(hdc, 40, 30, 60, 20, 100, 80);
                EndPaint(hwnd, &ps);
            }
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

修复说明

  • 绘制上下文管理:在WM_PAINT消息中,BeginPaint和EndPaint必须配对使用,用于标记窗口绘制区域的更新状态。将HDC传递给绘制函数,确保整个绘制流程在同一个有效上下文内完成。
  • 算法完整性:新增x坐标递减的处理逻辑,通过调整xi的符号,保证无论直线方向如何,循环都能正确执行并绘制所有像素点。

内容的提问来源于stack exchange,提问作者Mason Cooreman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:35:32