+ -
当前位置:首页 → 问答吧 → 我在1920*1080分辨率下做的对话框全屏显示,怎么让比在小的分辨率下也实现全屏显示?

我在1920*1080分辨率下做的对话框全屏显示,怎么让比在小的分辨率下也实现全屏显示?

时间:2011-12-06

来源:互联网

控件怎么才能随着分辨率自动调整 位置 和 大小?

作者: yd250990477   发布时间: 2011-12-06

C/C++ code
void OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    CDialog::OnGetMinMaxInfo(lpMMI);
    lpMMI->ptMinTrackSize.x = m_MinSize.cx;
    lpMMI->ptMinTrackSize.y = m_MinSize.cy;

    CRect    rc(0, 0, 1024, 768);
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); // 取得桌面区域
    lpMMI->ptMaxPosition.x = rc.left;
    lpMMI->ptMaxPosition.y = rc.top;
    lpMMI->ptMaxSize.x = rc.Width();
    lpMMI->ptMaxSize.y = rc.Height();
}

作者: wangweixu520   发布时间: 2011-12-06

C/C++ code
RECT   rect,rect2; 
//移动窗口到桌面的右侧 
//此时取得的rect左上角是(0,0),估计是因为窗口刚创建 
//桌面窗口的左上角总是(0,0) 
this-> GetDesktopWindow()-> GetWindowRect(&rect); 
this-> GetWindowRect(&rect2); 
rect2.left=rect.right-(rect2.right-rect2.left)-21; 
rect2.right=rect.right-21; 
rect2.top=rect.bottom/5; 
rect2.bottom=rect.bottom-rect.bottom/5; 
this-> MoveWindow(&rect2); 
//调整窗口内的控件位置 
GetClientRect(&rect); 
MoveCtrl(rect.right,rect.bottom); 


rect1得到的事窗口坐标(像素),无论是1024x768或者800x600分辨率,rect1就是这个分辨率的值,rect2是你窗口的坐标(像素)调整他就可以了

作者: wangweixu520   发布时间: 2011-12-06

C/C++ code
int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);

作者: shen_wei   发布时间: 2011-12-06

屏幕大小包括开始菜单栏的。
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcClient, 0);
然后自己按比例计算控件位置大小,MoveWindow

作者: ndy_w   发布时间: 2011-12-06

我就是想得到比例系数,
然后想用它乘以控件大小得到新的大小。
可怎么得到比例系数啊,能不能详细点?

作者: yd250990477   发布时间: 2011-12-06

楼主发两贴,那我也说两遍:
这种程序不适合用对话框,但是还是可以解决的:
可以分为以下几个步骤:
1)在OnInitDialog中,使用
  ::EnumChildWindows(m_hWnd, GetChildWindowPos, (LPARAM)m_hWnd);
其中GetChildWindowPos是Callback函数,由你来实现,你可以用类似以下代码实现:
C/C++ code

BOOL CALLBACK xxx::GetChildWindowPos(HWND hwnd, LPARAM lparam)
{
    HWND hWnd = (HWND)lparam;
    CWnd *pWnd = CWnd::FromHandle(hwnd);
        ASSERT(pWnd);
    UINT u32ID = pWnd->GetDlgCtrlID();

    YouMainDlg *pDlg = (YouMainDlg*)CWnd::FromHandle(hWnd);
        ASSERT(pDlg);
    pDlg->AddChildWindow(u32ID);
    return TRUE;
}

//其中AddChildWindow实现大概如下:
struct sControl; //你自己定义.大概有offset/width/height/hwnd...信息
CRect rect;
GetWindowRect(&rect);
CRect rcChild;
GetDlgItem(u32ID)->GetWindowRect(&rcChild);
nt i32TitleHeight = GetSystemMetrics(SM_CYCAPTION);
sControl.u32ID = u32ID;
sControl.i32OffsetX = rcChild.left - rect.left;
sControl.i32OffsetY = rcChild.top - rect.top - i32TitleHeight;
sControl.i32Width = rcChild.Width();
sControl.i32Height = rcChild.Height();
sControl.hWnd = GetDlgItem(u32ID)->m_hWnd;
vectControl.push_back(sControl); //其中vectControl为std::vector

int i32MaxWidth = GetSystemMetrics(SM_CXMAXIMIZED);
int i32MaxHeight = GetSystemMetrics(SM_CYMAXIMIZED);
float fRatioX = (float)i32MaxWidth / rect.Width();
float fRatioY = (float)i32MaxHeight / rect.Height();
    
sControl.i32OffsetX *= fRatioX;
sControl.i32OffsetY *= fRatioY;
sControl.i32Width *= fRatioX;
sControl.i32Height *= fRatioY;
vectControl.push_back(sControl);
return TRUE;
}



2)实现一个AdjustChildWindow函数,里面大概如下:
C/C++ code

//判断是否最大化或者其他情况:根据Onsize中的nType参数来判断.
//...
::EnumChildWindows(m_hWnd, SetChildWindowPos, ...);

SetChildWindowPos是一个CallBack函数,由你自己来实现:
大概内容是把容器中的控件信息取出来,然后调整合适,调用SetWindowPos or MoveWindow即可



3)在OnSize中调用AdjustChildWindow.

作者: yuucyf   发布时间: 2011-12-06