如何在 Windows 控制台中为特定像素着色
Posted
技术标签:
【中文标题】如何在 Windows 控制台中为特定像素着色【英文标题】:How to color a specific pixel in windows console 【发布时间】:2015-04-22 06:38:23 【问题描述】:我是 C++ 编程的新手,我觉得学习起来很有趣。 任何人都可以给我一个想法,在 Windows 控制台中为特定像素设置颜色,而即使 Windows 控制台被刷新或移动,颜色也会保持不变。
我在最近的代码中使用了 Setpixel()。这里有一些代码 sn-ps,假设它在函数体内:
HWND myconsole = GetConsoleWindow();
HDC dc = GetDC(myconsole);
COLORREF color = RGB(255,120,120);
for(int count =0;count<100;count++)
SetPixel(dc,0,count,color);
任何想法和意见都会有很大帮助。谢谢!
【问题讨论】:
您当前的代码正在更改 屏幕 上的像素,这恰好位于控制台窗口上方。这显然不是你想要的。问题是,控制台不能以像素为单位,它以字符块为单位。毕竟,它是纯文本的。研究使用WriteConsoleOutput
函数输出彩色文本(除其他外)。
控制台只能按角色访问,无论您对其中一个角色进行何种修改,都无法清除控制台。
如果你真的需要这个,试试钩子:***.com/questions/5432551/…
我明白你的评论...我会试试这个!!谢谢..也许我还有一些后续问题,所以请稍等..
@user 你确定这还能用吗?我认为控制台窗口不会收到 WM_PAINT 消息。它不像普通的窗户。彼得,如果你想要一个可以绘制的普通窗口,那么只需创建一个并自己处理 WM_PAINT 消息。
【参考方案1】:
要么您的问题不清楚,要么您随后改变了主意,并决定要在 Win32 窗口而不是 Win32 控制台窗口上绘图。无论如何,这里有两个问题的答案。
-
绘图到 Win32 窗口(不是控制台)
您可以通过多种方式绘制到 Win32 项目(包括 OpenGL 和 DirectX 等图形 API)。最简单的方法是使用 Windows GDI(图形设备接口),它只是 Windows.h 中的一些函数。
SetPixel() 将绘制到您为其提供句柄的任何设备上下文(第一个参数)。如果你想在窗口上绘图,这个句柄必须是你的主窗口的设备上下文(你也可以给它一个离屏表面的句柄,比如一个后台缓冲区)。
因此,要获取主窗口的设备上下文的句柄,请使用: GetDC(hWnd) 其中 hWnd 是主窗口的句柄。返回的设备上下文句柄可以在 SetPixel() 中用于绘制到窗口。
HDC _hWindowDC = GetDC(_hWnd);
SetPixel(_hWindowDC, _iXpos, _iYpos, _myColorRef);
如果您想像尝试那样绘制到设备上下文,您需要创建一个 Win32 项目,而不是 Win32 控制台项目。
-
绘图到 Win32 控制台项目
如 cmets 中所述,对于控制台项目,您只能“绘制”字符,而不能“绘制”像素。例如,您可以选择一个屏幕坐标并计算出一些字符,如下所示:
COORD point;
point.X = _iX;
point.Y = _iY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point);
cout << "Whatever";
【讨论】:
@ Serge,您的答案就像是通过函数 SetConsoleCursorPosition 在控制台屏幕的指定坐标中显示“任何”字符串。是的,我可以使用控制台项目使用 SetConsoleCursorPosition 函数进行绘制。使用 Win32 项目如何将颜色设置为指定像素。? @Peter G,您可以通过多种方式绘制到 Win32 项目(包括 OpenGL 和 DirectX 等图形 API)。最简单的方法是使用 Windows GDI(图形设备接口),它是@Cody Gray 这是我尝试 WriteConsoleOutput 时的 sn-ps。这不是很好,但也许它可以帮助其他人.. 如果有人可以在这里提出想法并纠正一些逻辑和误解,那就更好了.. 谢谢
const CHAR_INFO *buffer;
CHAR_INFO buffer1;
buffer = &buffer1;
buffer1. Char. AsciiChar= '-';
buffer1.Attributes = 0x0001;
const SECURITY_ATTRIBUTES *securityAttribute;
HANDLE writeConsole= GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE readConsole = GetStdHandle(STD_INPUT_HANDLE);
COORD buffer1Size=10,10;
COORD position = 4,4;
SMALL_RECT display =4,4,50,50;
WriteConsoleOutput(writeConsole,buffer,buffer1Size,position,&display);
【讨论】:
以上是关于如何在 Windows 控制台中为特定像素着色的主要内容,如果未能解决你的问题,请参考以下文章