c++ - 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 个数据点的“平滑”线?
最后一件事,如果可以的话……我将以一种非常基本的方式进行讨论,因为我被使用“图形库”和对象的想法吓倒了。但我怀疑他们会让我的生活变得更轻松,同时提供无数的选项,这些选项会让我花很长时间才能弄清楚,我敢打赌,并实施?
非常感谢您的帮助和耐心。
解决方案
您应该始终在WM_PAINT
处理程序中完成所有绘图。这样,例如,当覆盖它的东西被移除时,窗口将正确重绘。
当您的图形数据发生变化时,调用InvalidateRect
以提示重绘。
要确定要重绘的内容,您需要将合适的变量传递给您的WM_PAINT
处理程序。MoveTo
从and LineTo
(or Polyline
or )开始,然后PolyPolyline
让它首先工作。然后,如果您认为需要平滑算法,您可以研究它们。
推荐阅读
- php - 如何在 laravel api 中获取多个图像?
- javascript - 返回数组中位于给定键中的最小元素
- javascript - 如何 getElementsByClassName 并应用另一个 getElementsByClassName
- java - 应用程序结束后内存映射文件不释放资源
- ios - 渐变视图未在模拟器上快速显示
- php - php数据库连接报错如何解决?
- javascript - 如何从 IONIC 启动时添加到应用程序的自定义文件中读取
- html - 我怎么能用标题修复这个 iframe 错误
- json - 如何格式化json输出
- angular - 从输入字段中获取值并传递到路由器链接