在 windows.h 的WM_PAINT中启用输出缓冲
Enabling output buffering in windows.h's WM_PAINT
编辑:我知道这是绘制正方形的最慢方法,但我确实需要单独设置像素以用于单独的目的。
我很确定我要做的是创建一个帧缓冲区。我有以下代码:
... /* Other Unrelated (<- I promise) Code */
switch(message)
{
/* Window is being created*/
case WM_CREATE:
return 0;
break;
/* Window is closing*/
case WM_CLOSE:
PostQuitMessage(0);
return 0;
break;
/* Window needs update*/
case WM_PAINT:
hDC = BeginPaint(hwnd,&paintStruct);
/* Draw a Red Square pixel by pixel*/
for (int x=100;x<300;x++) {
for (int y = 300;y>100;y--) {
SetPixel(hDC, x, y, 0x000000FF);
}
}
EndPaint(hwnd, &paintStruct);
return 0;
break;
default:
break;
}
... /* Other Unrelated (<- I promise) Code*/
期望的结果
一个红色方块,不显示正在绘制的每个像素,而只是即时绘制一个红色方块。为了分解它,我希望内存在将其释放到视频内存之前填满,而不是 1 个到视频内存(我希望我在这里使用正确的词......
问题所在
与所需结果相反,在设置每个像素时,我从左右快速绘制了正方形。
我在寻找什么
一个命令,用于启用输出缓冲到我的窗口,或者一个存储像素然后一次绘制它们的功能,或任何其他可以让我获得所需结果的方法。
提前谢谢你。我认为说我只用C++语言编程了 5 天会有所帮助,任何分解或直接回答将不胜感激。
您需要创建一个内存HDC和一个位图,选择位图到内存中,在内存上绘制,然后将内存DCBitBlt
到最终HDC
。例:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HDC memdc = CreateCompatibleDC(hdc);
HBITMAP bitmap = CreateCompatibleBitmap(hdc, 300, 300);
HBITMAP oldbmp = (HBITMAP)SelectObject(memdc, bitmap);
for(int x = 100; x<300; x++)
for(int y = 300; y>100; y--)
SetPixelV(memdc, x, y, 0x000000FF);
BitBlt(hdc, 0, 0, w, h, memdc, 0, 0, SRCCOPY);
//cleanup:
SelectObject(memdc, oldbmp);
DeleteDC(memdc);
DeleteObject(bitmap);
EndPaint(hWnd, &ps);
return 0;
}
请注意,您可以访问所有 GDI 函数。在此示例中,您可以改用FillRect
:
RECT rc{ 100, 100, 300, 300 };
SetDCBrushColor(memdc, RGB(255, 0, 0));
FillRect(memdc, &rc, (HBRUSH)GetStockObject(DC_BRUSH));
或者使用GetDIBits
操作位图。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 编译时未启用intel oneApi CUDA支持
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 在 windows.h 的WM_PAINT中启用输出缓冲
- 为什么 MSVC++ 需要 std::setprecision 才能使用 std::hexfloat 启用全精度输出