【问题标题】:C++: Setting the console window as a WS_POPUPC++:将控制台窗口设置为 WS_POPUP
【发布时间】:2012-10-11 03:32:52
【问题描述】:

我正在尝试创建一个无边框的控制台窗口。
我能够将 windowstyle 设置为 WS_POPUP,它删除了边框,但有一些小故障;

似乎控制台窗口上的某些部分没有被重绘,或者类似的东西,但我尝试在整个窗口上使用 InvalidateRect() 和其他重绘函数,但它们没有似乎工作。
有人建议使用 SetWindowPos()(带有 SWP_FRAMECHANGED),但这也无济于事。

我一直在摆弄这个问题有一段时间了,我很确定这与客户区域没有正确绘制有关(不要引用我的话)

当我第一次向下滚动然后向上滚动时,底部的故障部分也会变成黑色/透明,但我的程序中的文本有时不会显示在它下面,据我所知,这表明它没有背景,所以它有一种“变色龙”的效果。

有什么想法吗?

【问题讨论】:

  • 控制台通常不能很好地处理这种事情。
  • 我可以看到。但这并没有真正帮助我。
  • 您的任务(创建无边框控制台窗口)看起来像锻炼。不?我的意思是,这个问题的原因是什么。
  • 你确定,你需要控制台窗口,而不是 GUI?您可以绘制任何东西并使用 GUI 窗口的任何窗口样式;-) 至于您的问题,如果您真的需要控制台 - 尝试使用 SetWindowRgn 而不是操纵 wnd 样式。
  • 与 Windows 想要的工作方式作斗争通常比它的价值更麻烦。

标签: c++ windows winapi console cmd


【解决方案1】:

我终于明白了。 (非常感谢马克西姆斯)
我必须使用SetWindowRgn(),就像他建议的那样。

最终的代码如下所示:

HWND hWnd = GetConsoleWindow();
RECT rcScr, rcWnd, rcClient;

GetWindowRect(hWnd, &rcWnd);
GetWindowRect(GetDesktopWindow(), &rcScr);
GetClientRect(hWnd, &rcClient);

MoveWindow(hWnd, (rcScr.right / 2) - 330, (rcScr.bottom / 2) - 180, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, 1);
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
SetWindowRgn(hWnd, CreateRectRgn(rcClient.left + 2, rcClient.top + 2, rcClient.right + 2, rcClient.bottom + 2), TRUE);
ShowWindow(hWnd, 1);

【讨论】:

  • 我发现在最新版本的 Windows 上,仅发送 ShowWindow() 就足以使 cmd 再次正确查看。
  • @charles.milette 根据我的测试,只有在未选中“使用旧控制台”的新 cmd.exe 的 Windows 10 上才会出现这种情况。我很想找到解决这个问题的方法,而不仅仅是“消除问题”。
猜你喜欢
  • 2011-03-23
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2014-11-12
  • 2019-01-18
相关资源
最近更新 更多