【问题标题】:draw cartesian system using win32 api使用win32 api绘制笛卡尔系统
【发布时间】:2015-12-29 18:34:08
【问题描述】:

我正在尝试使用 win32 api 绘制正弦波。我做到了。

hDC = GetDC(hWnd);

while (TRUE)
{
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        DispatchMessage(&msg);
    }

    if (msg.message == WM_QUIT)
        break;

    wavefunc(hWnd, hDC);
}

void wavefunc(HWND hWnd, HDC hDC)
{
    double full = 2 * pi * _freq;
    static double _x = 0;
    short int _y = 0;

    short _y = (short)(sin(_x / _freq)*_amp) + 300;
    if (_x >= full)
        _x -= full;
    SetPixel(hDC, 600, _y, blue);
    ScrollWindow(hWnd, -1, 0, NULL, NULL);
    Sleep(_sTime);
    _x++;
}

现在我正在尝试弄清楚如何绘制笛卡尔系统。但是没有结果。

我有一个在每个 sin 值处滚动的窗口。

我尝试在 hdc 上画线。滚动窗口时,无法阻止 hdc 不滚动。

然后我从 Windows 创建另一个 hDc 但没有成功。 这该怎么做?问题是有窗口滚动但有一些点修复..

【问题讨论】:

  • Windows 会为您执行所有翻译,前提是您的视口设置正确(请参阅SetViewportExtExSetViewportOrgEx)。 Transformation of Coordinate Spaces 对此进行了详细解释。
  • 我不认为这是我想要的...我只想画两条固定线...
  • 这是最简单的部分:MoveToExLineTo。如果你想让你的生活变得比需要的更艰难,请自己计算从世界坐标到设备坐标的映射。或者让系统为您完成(如我之前的评论中所述)。
  • 我已经添加了这行:SelectObject(hDC, hBluePen); MoveToEx(hDC, 0, 0, NULL);静态 int x = 250;静态int y = 250; LineTo(hDC, x, y); x++;你++;。 ...问题是滚动窗口后,前线仍然存在...
  • 这是最好的效果...sinewave

标签: c++ winapi win32gui


【解决方案1】:

这样做的方法是一次绘制所有内容:清除窗口,绘制网格,然后在网格上绘制整个波形(不仅仅是下一个点)。要使波形滚动,您需要使用不同的波形偏移量不断重绘。

为避免闪烁,您可能需要进行一些双缓冲。

典型的 WinAPI 程序在处理 WM_PAINT 命令时绘制窗口。 WM_PAINT 消息在任何或所有窗口无效并需要重新绘制时生成。每次滚动窗口时,您都会创建一个无效区域,但由于您忽略了 WM_PAINT 消息,因此没有任何反应。

【讨论】:

  • 部分有效。由于速度非常快,图像是间歇性的
  • 这就是我写的原因:“为了避免闪烁,您可能 [原文如此] 需要做一些双缓冲。”
【解决方案2】:

下面是我将如何为 sin() 函数设置动画:

创建位图(窗口大小)并在其上绘制静态部分(轴、标题、标签等)。

创建另一个位图(sin() 的高度和窗口的宽度 + sin() 周期的宽度),并在其上绘制 sin()。

在 wavefunc() 中,获取精确时间并计算 sin 位图的偏移量。

使用 BitBlt() 函数首先将静态部分 blit 到窗口的 DC,然后使用 TransparentBlt() 绘制 sin,从预先计算的偏移量开始。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多