首页 > 解决方案 > GDI Win32 绘图图

问题描述

在我的小而简陋的 c++ Win32 GUI 应用程序中,我能够绘制一个网格:

在此处输入图像描述

这是为了准备显示光谱数据,即从我的设备返回的 36 个(浮动)测量点。我仍然需要标记轴...这是我到目前为止绘制网格的代码:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);    

    FillRect(hdc, &ps.rcPaint, HBRUSH (COLOR_WINDOW + 1));  

    bool Retour;
    
    pen = (HPEN)GetStockObject(TRANSPARENT);
    SelectObject(hdc, pen);

    Brosse = CreateSolidBrush(RGB(240, 240, 240));
    SelectObject(hdc, Brosse);

    Retour = LineTo(hdc, 100, 500);*/

    Retour = Rectangle(hdc, 350, 150, 750, 375);

    for (int i = 380; i <= 730; i=i+10) {   // 36 vertical lines
        MoveToEx(hdc, i, 175, NULL);
        LineTo(hdc, i, 350);
    }
    for (int i = 175; i <= 350; i = i + 17) {
        MoveToEx(hdc, 375, i, NULL);
        LineTo(hdc, 730, i);
    }

    DeleteObject(pen);
    DeleteObject(Brosse);

    EndPaint(hWnd, &ps);

如您所见,我找到了在 WM_PAINT 过程中绘制网格的代码。将代码放在那里以试验 GDI 指令是有意义的,但也因为网格需要在启动时作为界面的一部分可见。

我的问题是,当按下“测量样本”按钮后,我可以访问数据时,我应该如何“更新”图表?我收集到在网格上绘制的代码不一定需要位于 WM_PAINT 过程中,是吗?根据我有限的理解,只要我能得到一个设备上下文句柄(hDC),我应该可以去吧?我只需要绘制一条从左到右连接 36 个数据点的“线”。不确定我应该为此目的使用简单的 MOVE_TO 和 LINE_TO 吗?我认为有一种方法可以绘制一条穿过所有 36 个数据点的“平滑”线?

最后一件事,如果可以的话……我将以一种非常基本的方式进行讨论,因为我被使用“图形库”和对象的想法吓倒了。但我怀疑他们会让我的生活变得更轻松,同时提供无数的选项,这些选项会让我花很长时间才能弄清楚,我敢打赌,并实施?

非常感谢您的帮助和耐心。

标签: c++winapiplotgdi

解决方案


您应该始终在WM_PAINT处理程序中完成所有绘图。这样,例如,当覆盖它的东西被移除时,窗口将正确重绘。

当您的图形数据发生变化时,调用InvalidateRect以提示重绘。

要确定要重绘的内容,您需要将合适的变量传递给您的WM_PAINT处理程序。MoveTo从and LineTo(or Polylineor )开始,然后PolyPolyline让它首先工作。然后,如果您认为需要平滑算法,您可以研究它们。


推荐阅读