我正在尝试使用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但没有成功。 这该怎么做?问题是有窗口滚动,但有一些点修复..
答案 0 :(得分:2)
这样做的方法是一次性绘制所有内容:清除窗口,绘制网格,然后在网格上绘制整个波形(不仅仅是下一个点)。要使波形滚动,请使用不同的波形偏移重新绘制。
为避免闪烁,您可能需要进行一些双缓冲。
典型的WinAPI程序在处理WM_PAINT
命令时绘制窗口。当任何或所有窗口无效并需要重新绘制时,会生成WM_PAINT
消息。每次滚动窗口时,您都会创建一个无效区域,但由于您忽略了WM_PAINT
消息,因此没有任何反应。
答案 1 :(得分:2)
以下是我为sin()函数设置动画的方法:
创建一个位图(窗口大小)并在其上绘制静态部分(轴,标题,标签等)。
创建另一个位图(sin()的高度和窗口的宽度+ sin()在你的尺度上的周期的宽度),并在其上绘制sin()。
在wavefunc()中,获取精确的时间并计算sin位图的偏移量。
使用BitBlt()函数首先将静态部分blit到窗口的DC上,然后使用TransparentBlt()从预先计算的偏移量开始绘制sin。