如何制作屏幕缓冲区 c++
How can i make a screen buffer c++
我希望能够将所有文本,线条,三角形和其他内容绘制到屏幕上,然后清除屏幕并绘制新内容,但是此方法使屏幕闪烁,并且所有绘图不会同时出现。
我的想法是绘制到某种缓冲区,然后将该缓冲区绘制到屏幕上并清除缓冲区,然后重复。这样屏幕就不会闪烁,所有屏幕将同时绘制。
我正在使用Windows.h,Visual Studio。
#include <Windows.h>
#include <iostream>
using namespace std;
struct vec2d
{
int x, y;
};
void Line(HDC dc, vec2d a, vec2d b)
{
MoveToEx(dc, a.x, a.y, NULL);
LineTo(dc, b.x, b.y);
}
vec2d GetMousePos(HWND console)
{
vec2d out;
POINT p;
GetCursorPos(&p);
out.x = p.x; out.y = p.y;
return out;
}
int main()
{
HWND console = GetConsoleWindow();
HDC dc = GetDC(console);
SelectObject(dc, CreatePen(PS_SOLID, 1, RGB(255, 255, 255)));
while (1)
{
//BitBlt(dc, 0, 0, 1000, 1000, 0, 0, 0, BLACKNESS); Flickering is much much bigger, because its faster
system("cls");
Line(dc, { 0, 0 }, GetMousePos(console));
}
}
提前谢谢,马克。
我认为您对控制台窗口的控制不如对自己的HWND
的控制。我能够通过用InvalidateRect()
替换system("cls");
来消除代码中的闪烁。
RECT client;
GetClientRect(console, &client);
while (1)
{
InvalidateRect(console, &client, TRUE);
Line(dc, console, { 0, 0 }, GetMousePos(console));
}
(您可以通过仅使绘制前一条线的区域无效来改善这一点。
此外,您可以进行的另一个更改(与闪烁无关(是添加:
ScreenToClient(console, &p);
在你打电话后GetMousePos()
GetCursorPos(&p);
.这会将指针坐标映射到窗口而不是屏幕。
有关创建自己的窗口的进一步阅读:创建窗口。不像使用控制台窗口那么简单,但您可以更好地控制。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 为什么缓冲区的内容在读取空 rdbuf 时被删除?