MFC:CMainFrame周围的隐藏边距

时间:2018-05-08 06:34:23

标签: winapi mfc

我的应用程序中的主框架很常见:类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相同?

感谢你的想法和帮助:) 卢博米尔

1 个答案:

答案 0 :(得分:0)

8个像素是边框厚度(它不总是8)。当窗口处于最大化状态时,您不需要边框,因此操作系统通过将边界推出视图来隐藏边框。

客户区的任何部分都不会被隐藏。客户区的控件和图纸不受影响。

标题栏图纸可能略有变化。例如,当标题栏变薄并且文本稍微向上移动时,标题栏的文本将垂直居中。所以你想留下这个。

最大化窗口不会覆盖整个屏幕。底部有一个任务栏(它通常位于底部,可以是40像素高)我们需要不包含任务栏的桌面区域。这可以从SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0)获得,与最大屏幕区域不同。

在实际程序中,您可能希望以最大化状态启动程序。然后使用CWnd::ShowWindow(SW_SHOWMAXIMIZED)。如果您不想要最大化状态,请使用其他方法,例如SetWindowPos

使用GetWindowPlacement查找窗口当前是否处于最大化状态。

<小时/> 当窗口未最大化时,带有DwmGetWindowAttribute的{​​{1}}可用于查找Windows 10透明边框。在这种情况下它不适用。