我的应用程序中的主框架很常见:类CMainFrame:public CFrameWndEx。
在我的代码中,我正在寻找屏幕上的MainFrame位置,如果它已经出局,(例如当任何监视器被关闭或断开连接时)我将窗口移动到有效区域。
int VIRTSCR_Left = GetSystemMetrics(SM_XVIRTUALSCREEN);
int VIRTSCR_Top = GetSystemMetrics(SM_YVIRTUALSCREEN);
int VIRTSCR_Width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int VIRTSCR_Height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int VIRTSCR_Right = VIRTSCR_Left + VIRTSCR_Width;
int VIRTSCR_Bottom = VIRTSCR_Top + VIRTSCR_Height;
所以在我的情况下,我得到(对于一个屏幕)0,1920,0,1200。
CMainFrame大小和位置,当它最大化时:
CRect rc;
pMainFrame->GetWindowRect(rc);
给我-8,-8,1928,1168。 (底部是40px高的Windows主任务栏)。
所以在可见主框架周围是下一个不可见的8px宽边距
我在哪里可以找到这个值8px?
是否可以通过GetSystemMetrics(...)进行处理?
对于其他屏幕解析(例如2k,3k显示器),值是否为8px相同?
感谢你的想法和帮助:) 卢博米尔
答案 0 :(得分:0)
8个像素是边框厚度(它不总是8)。当窗口处于最大化状态时,您不需要边框,因此操作系统通过将边界推出视图来隐藏边框。
客户区的任何部分都不会被隐藏。客户区的控件和图纸不受影响。
标题栏图纸可能略有变化。例如,当标题栏变薄并且文本稍微向上移动时,标题栏的文本将垂直居中。所以你想留下这个。
最大化窗口不会覆盖整个屏幕。底部有一个任务栏(它通常位于底部,可以是40像素高)我们需要不包含任务栏的桌面区域。这可以从SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0)
获得,与最大屏幕区域不同。
在实际程序中,您可能希望以最大化状态启动程序。然后使用CWnd::ShowWindow(SW_SHOWMAXIMIZED)
。如果您不想要最大化状态,请使用其他方法,例如SetWindowPos
使用GetWindowPlacement
查找窗口当前是否处于最大化状态。
DwmGetWindowAttribute
的{{1}}可用于查找Windows 10透明边框。在这种情况下它不适用。