通过 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】:

控制台窗口不是你的窗口,你不应该直接在上面画画!

您可以使用FillConsoleOutputAttributeFillConsoleOutputCharacter 来创建带有框和线的彩色“图形”并使用屏幕缓冲区,但仅此而已。

如果您需要像素精度,那么您需要在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++ 像素在调整控制台大小或将其移出屏幕时消失的主要内容,如果未能解决你的问题,请参考以下文章

使用(MFC 的)CImage::SetPixel() 改变像素的颜色

如何在 Windows 控制台中为特定像素着色

SetPixel 会随着时间的推移而变慢

Qt C++ 可调整大小矩形的最小尺寸

Bitmap类

GDI+下Bitmap逐像素快速读写性能测试