Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GDI Win32绘图图形 在我的小的、小的和简陋的C++ Win32 GUI应用程序中,我得到了一个能够绘制网格的点:_C++_Winapi_Plot_Gdi - Fatal编程技术网

GDI Win32绘图图形 在我的小的、小的和简陋的C++ Win32 GUI应用程序中,我得到了一个能够绘制网格的点:

GDI Win32绘图图形 在我的小的、小的和简陋的C++ Win32 GUI应用程序中,我得到了一个能够绘制网格的点:,c++,winapi,plot,gdi,C++,Winapi,Plot,Gdi,这是为了显示光谱数据,即从我的设备返回的36个(浮动)测量点。我还得给轴贴上标签。。。这是我迄今为止绘制网格的代码: case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); FillRect(hdc, &ps.rcPaint, HBRUSH (COLOR_WINDOW + 1)); bool Retour; pen = (HPEN)GetS

这是为了显示光谱数据,即从我的设备返回的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);
case WM_PAINT:
{
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hWnd和ps);
FillRect(hdc和ps.rcPaint、HBRUSH(颜色窗口+1));
布尔雷图尔;
pen=(HPEN)GetStockObject(透明);
选择对象(hdc、笔);
Brosse=CreateSolidBrush(RGB(240240240));
选择对象(hdc、Brosse);
Retour=LineTo(hdc,100500)*/
Retour=矩形(hdc,350150750375);

对于(int i=380;i您应该始终在
WM_PAINT
处理程序中绘制所有图形。这样,例如,当移除覆盖窗口的内容时,窗口将正确地重新绘制

当图形数据更改时,调用以提示重新绘制


要确定要重新绘制的内容,您需要将适当的变量传递给
WM_PAINT
处理程序。从
MoveTo
LineTo
(或
Polyline
polylylyline
开始)然后,如果您认为需要,您可以研究平滑算法。

您应该将所有自定义绘制代码放置在窗口的WM_绘制处理程序中,是的。如果您愿意,您可以调用单独的函数来绘制图形。将从
开始绘制(…)获得的HDC传递给它
和光谱数据。但是,该函数需要从WM_PAINT处理程序调用

如果您在WM_PAINT中处理绘制,那么要在数据更改时更新图形,您将在窗口上调用
InvalidateStribute(…)
InvalidateStribute
本质上告诉Windows“此窗口已更改,需要重新绘制”。它将驱动对绘制处理程序的调用

您将遇到的一个问题是图形将闪烁。它可能不太明显。这可能不会打扰您,但问题是在每次调用WM_PAINT handler时,您都会在屏幕设备上下文中擦除图形;这种擦除将是可见的。解决此问题的方法是“双缓冲区”图形:创建一个屏幕外位图,在数据更改时绘制到其中,并在WM_paint中将屏幕外位图绘制到屏幕上。如果您需要多个图形或只是向代码添加一些模块化功能,您还可以将图形设为一个单独的子窗口来管理屏幕外位图等


至于你是否有一个更容易的时间使用图形库……可能,但更重要的是:使用Win32 API比使用更高级的GUI库更容易。如果只关心Windows,请考虑.NETFraseWinFrm或WPF。否则,考虑QT.

谢谢宝贵的和详细的建议。SH我可以使用.NET,但是我使用了一个SDK DLL,它使用了太复杂的调用,使我“将它们”移植到C或VB中。我尝试过QT,并且更喜欢在QT中工作,但是我受到QLoover对象和我的解决DLL功能的限制,这些功能我只在MS C++中使用(使用LoadLibrary)。我意识到我会看到一个“闪烁”。当图形“无效”时,我的计划是让逻辑“在闪烁效应下”工作,然后,如果它真的困扰我,我将研究“双缓冲”技术:-)你能通过.Net中的“P/Invoking”调用DLL吗?也就是说,我不明白为什么不能。但是,在“学习如何有效地与设备接口”方面我选择了C++路由,因为设备制造商提供的示例应用程序是用C++编写的。但是由于我对C++的了解不多,所以使用P/INVIKE是有意义的,我同意100%。Windows窗体是托管的(和CRAPTTAST)。包装本机Windows控件。它不是本机代码的替换策略。更不用说WPF了,WPF发明了自己的UI堆栈并只提供托管API。这不是任何替换策略,除非您的目标是完全锁定供应商。另一方面,WinUI包含Win的标准UI实现dows 10,用本机代码编写,带有本机API。现在这是本机代码的真正替代策略。“平滑”是锦上添花。我保证我会坚持从WM_PAINT内部绘制。最初,没有数据可绘制,所以我必须使用某种“标志”要控制执行哪些代码:空图形单独还是图形加上设备数据的“行”?因此,我想我需要从测量按钮“事件”内部设置此标志,以便在获得数据后,调用InvalidateBullet()使图形“更新”使用设备数据,同时设置相应的标志?这是一个好方法吗?听起来很合理,是的。出于“开发”的目的,我决定使用“虚拟”数据。因此,当应用程序启动时,它应该有一些数据“可供咀嚼”.我们看看这会把我引向何方?谢谢你的帮助。你不需要用标志来区分“数据可用”和“无数据可用”。只需将数据存储在容器中即可。大小为0的容器表示没有数据。
SelectObject
转移资源的所有权。选择到设备上下文中的资源由DC所有,而以前选择到DC中的对象现在由您负责。因此,在删除对象时删除对象总是错误的仍然被选入DC。这里最常见的模式是:
1
选择对象进入DC,
2
使用对象,
3
选择对象退出(通过选择上一个对象进入)DC,
4
清理您的资源。同时确保阅读。与此问题完全无关,您可能希望看到。它不涉及编写任何代码,但会使您的下一个屏幕截图看起来明显不同。