使用 win32 绘制笛卡尔系统 api
draw cartesian system using win32 api
我正在尝试使用 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++;
}
现在我正在研究如何绘制笛卡尔坐标系。但是没有结果。
我有一个 window 在每个 sin 值处滚动。
我尝试在 hdc 上画线。当 window 滚动时,无法阻止 hdc 不滚动。
然后我从 windows 创建了另一个 hDc 但没有成功。
这该怎么做?问题是 window 滚动但有一些点修复..
这样做的方法是一次绘制所有内容:清除 window,绘制网格,然后在网格上绘制整个波形(不仅仅是下一个点)。要使波形滚动,您可以使用不同的波形偏移量重新绘制。
为避免闪烁,您可能需要做一些 double-buffering。
典型的 WinAPI 程序在处理 WM_PAINT
命令时绘制 window。 WM_PAINT
消息在任何或所有 window 无效且需要重新绘制时生成。每次滚动 window,您都会创建一个无效区域,但由于您忽略了 WM_PAINT
消息,所以什么也没有发生。
下面是我如何为 sin() 函数设置动画:
创建位图(window 的大小)并在其上绘制静态部分(轴、标题、标签等)。
创建另一个位图(你的 sin() 的高度和你的 window 的宽度 + 在你的比例下 sin() 周期的宽度),并在其上绘制 sin()。
在 wavefunc() 中,获取精确时间并计算 sin 位图的偏移量。
使用 BitBlt() 函数首先将静态部分 blit 到你的 window 的 DC,然后使用 TransparentBlt() 绘制罪恶,从 pre-calculated 偏移量开始。
我正在尝试使用 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++;
}
现在我正在研究如何绘制笛卡尔坐标系。但是没有结果。
我有一个 window 在每个 sin 值处滚动。
我尝试在 hdc 上画线。当 window 滚动时,无法阻止 hdc 不滚动。
然后我从 windows 创建了另一个 hDc 但没有成功。 这该怎么做?问题是 window 滚动但有一些点修复..
这样做的方法是一次绘制所有内容:清除 window,绘制网格,然后在网格上绘制整个波形(不仅仅是下一个点)。要使波形滚动,您可以使用不同的波形偏移量重新绘制。
为避免闪烁,您可能需要做一些 double-buffering。
典型的 WinAPI 程序在处理 WM_PAINT
命令时绘制 window。 WM_PAINT
消息在任何或所有 window 无效且需要重新绘制时生成。每次滚动 window,您都会创建一个无效区域,但由于您忽略了 WM_PAINT
消息,所以什么也没有发生。
下面是我如何为 sin() 函数设置动画:
创建位图(window 的大小)并在其上绘制静态部分(轴、标题、标签等)。
创建另一个位图(你的 sin() 的高度和你的 window 的宽度 + 在你的比例下 sin() 周期的宽度),并在其上绘制 sin()。
在 wavefunc() 中,获取精确时间并计算 sin 位图的偏移量。
使用 BitBlt() 函数首先将静态部分 blit 到你的 window 的 DC,然后使用 TransparentBlt() 绘制罪恶,从 pre-calculated 偏移量开始。