【问题标题】:Convert SetPixel coordinates to pixels on console将 SetPixel 坐标转换为控制台上的像素
【发布时间】:2014-05-01 16:16:00
【问题描述】:

我在 c++ 中工作,通常控制台的大小是 25*80 像素,但我使用 setpixel() 方法在控制台上显示,它需要更大的坐标值,为什么会这样以及如何转换从像素到 setpixel() 坐标。

这是我的 setpixel() 代码

   HWND myconsole = GetConsoleWindow();
   HDC mydc = GetDC(myconsole);
   SetPixel(mydc,50,50,RGB(0,255,0));

【问题讨论】:

  • 您是否将像素与光标位置混淆了?

标签: c++ winapi console


【解决方案1】:

您所指的 25*80 不是以像素为单位,而是以字符为单位。如果要使用SetPixel修改控制台窗口,首先要获取客户区的大小,可以使用GetClientRect来完成。

以下内容将在控制台窗口的客户区域上绘制一个红色十字准线:

HWND myconsole = GetConsoleWindow();
HDC mydc = GetDC(myconsole);
RECT rect;
GetClientRect(myconsole, &rect);
for(int i = 0; i < rect.bottom - rect.top; ++i)
    SetPixel(mydc, (rect.right - rect.left) / 2, i, RGB(255, 0, 0));
for(int i = 0; i < rect.right - rect.left; ++i)
    SetPixel(mydc, i, (rect.bottom - rect.top) / 2, RGB(255, 0, 0));

请注意,只要控制台窗口认为需要重绘,它就可以(并且将)覆盖您的绘图。

【讨论】:

  • 也可以使用GetConsoleScreenBufferInfo获取控制台显示窗口的坐标(即控制台缓冲区的可见部分)。结合GetClientRect,您可以在字符和像素之间进行转换。但这一切都毫无意义。
  • 谢谢,“你说的25*80不是像素,而是字符”这样就解决了问题
  • @arx 我不得不承认,我发布答案的主要原因是因为在控制台窗口上使用SetPixel 的想法引起了我的兴趣(以一种奇怪且可能与性有关的方式),以至于我只是不得不尝试一下。
【解决方案2】:

ScreenToClient 提供屏幕坐标到客户端坐标的转换。将坐标提供给 ScreenToClient 并获取客户端坐标并在那里绘制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多