应用程序UI显示的时候为了增强友好性,需要添加多屏幕适配。窗口显示的时候,会先判断当前窗口所处的是哪块屏幕,然后获取屏幕的尺寸和边界,如果窗口显示超过了屏幕边界会调整窗口的位置确保窗口显示在当前的屏幕内。
下面我以windows GDI 窗口显示和 Qt窗口显示两个方向介绍一下多屏幕适配的方法
1.GDI窗口显示多屏幕适配
在显示的时候先获取显示点所在的屏幕,如果获取不到就遍历屏幕列表,寻找距离当前点最近的屏幕。获取当前屏幕之后,根据点击的点获取显示窗口的显示范围,如果显示范围超出了当前的屏幕范围,对要显示的位置进行优化调整。
//枚举所有的物理硬件屏幕
static BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM lParam)
{
reinterpret_cast<std::vector<HMONITOR>*>(lParam)->push_back(hMonitor);
return TRUE;
}
//计算点点不在屏幕内部时距离屏幕矩形的距离
double cal_point_from_rect(const POINT &pt, const RECT &rc)
{
//在x范围内屏幕上,屏幕下
if (pt.x >= rc.left && pt.x <= rc.right)
{
if (pt.y < rc.top)
{
return rc.top - pt.y;
}
else if (pt.y > rc.bottom)
{
return pt.y - rc.bottom;
}
else
{
return 0;
}
}
//在y范围内
else if (pt.y >= rc.top && pt.y <= rc.bottom)
{
if (pt.x < rc.left)
{
return rc.left