通过 SetPixel 设置的 C++ 像素在调整控制台大小或将其移出屏幕时消失
Posted
技术标签:
【中文标题】通过 SetPixel 设置的 C++ 像素在调整控制台大小或将其移出屏幕时消失【英文标题】:C++ Pixels set through SetPixel are disappearing when resizing the console or moving it out of the screen 【发布时间】:2017-03-04 15:21:02 【问题描述】:所以我目前正在使用 SetPixel 函数重新着色屏幕上的一些像素。但是当我调整控制台大小或将控制台移出屏幕时,屏幕外的像素又变黑了。
如何防止它们变黑?
问候,TPRammus
编辑:这是一个例子:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <iostream>
using namespace std;
HWND consoleWindow = GetConsoleWindow(); // Get a console handle
int main()
HDC consoleDC = GetDC(consoleWindow); // Get a handle to device context
SetPixel(consoleDC, 20, 20, RGB(255, 255, 255));
ReleaseDC(consoleWindow, consoleDC);
cin.ignore();
return 0;
【问题讨论】:
SetPixel
来自哪个库?
假设这是 Win32 函数,您需要在收到 WM_PAINT 消息时绘制像素。
@BrandonIbbotson 在wingdi.h中声明。
你需要读一本关于 WIn32 编程的书——这个话题太宽泛了,在这里无法讨论,但基本上你需要一个消息循环和一个窗口过程..
您需要一个消息循环和一个窗口过程 ...为此您必须使用CreateWindow() 函数创建自己的窗口。您不能只为控制台窗口处理 WM_PAINT,因为控制台窗口在您无权访问的不同进程(“cmd.exe”)中运行。
【参考方案1】:
控制台窗口不是你的窗口,你不应该直接在上面画画!
您可以使用FillConsoleOutputAttribute
和FillConsoleOutputCharacter
来创建带有框和线的彩色“图形”并使用屏幕缓冲区,但仅此而已。
如果您需要像素精度,那么您需要在WM_PAINT
中使用CreateWindow 和draw 创建自己的窗口。
【讨论】:
【参考方案2】:您可以做的一个解决方案是创建一个无限循环,然后在无限循环内,在这里调用设置的像素。
请查看示例代码(根据您提供的内容):
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <iostream>
using namespace std;
HWND consoleWindow = GetConsoleWindow(); // Get a console handle
int main()
HDC consoleDC = GetDC(consoleWindow); // Get a handle to device context
while(true)
SetPixel(consoleDC, 20, 20, RGB(255, 255, 255));
SetPixel(consoleDC, 20, 21, RGB(255, 255, 255));
SetPixel(consoleDC, 20, 22, RGB(255, 255, 255));
SetPixel(consoleDC, 20, 23, RGB(255, 255, 255));
SetPixel(consoleDC, 21, 20, RGB(255, 255, 255));
SetPixel(consoleDC, 21, 21, RGB(255, 255, 255));
SetPixel(consoleDC, 21, 22, RGB(255, 255, 255));
SetPixel(consoleDC, 21, 23, RGB(255, 255, 255));
SetPixel(consoleDC, 22, 20, RGB(255, 255, 255));
SetPixel(consoleDC, 22, 21, RGB(255, 255, 255));
SetPixel(consoleDC, 22, 22, RGB(255, 255, 255));
SetPixel(consoleDC, 22, 23, RGB(255, 255, 255));
SetPixel(consoleDC, 23, 20, RGB(255, 255, 255));
SetPixel(consoleDC, 23, 21, RGB(255, 255, 255));
SetPixel(consoleDC, 23, 22, RGB(255, 255, 255));
SetPixel(consoleDC, 23, 23, RGB(255, 255, 255));
ReleaseDC(consoleWindow, consoleDC);
cin.ignore();
return 0;
不是那么完美的解决方案,因为当您向下滚动控制台时,像素正在被复制并且看起来像一个尾随点,但它让您了解如何完成工作。 :)
【讨论】:
以上是关于通过 SetPixel 设置的 C++ 像素在调整控制台大小或将其移出屏幕时消失的主要内容,如果未能解决你的问题,请参考以下文章