+ -
当前位置:首页 → 问答吧 → 在大分辨率下的全屏对话框,上面有控件,怎么让它在小分辨率上也 全屏,并且控件的位置和大小也自动调整?

在大分辨率下的全屏对话框,上面有控件,怎么让它在小分辨率上也 全屏,并且控件的位置和大小也自动调整?

时间:2011-12-06

来源:互联网

在大分辨率下的全屏对话框,上面有控件(如:btn1),拿到一个小分辨率电脑上怎么样也 全屏,并且控件的位置和大小也自动调整?
我的想法是让 现在控件大小=原来控件大小 * 2个分辨率的比例系数,
怎么得到这个比例系数?

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

没明白问题。。。

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

比如我在一个1920*1080的电脑做的全屏窗口,怎么让他在1280*767的电脑上也全屏显示。
上面的控件大小和位置自动调整。

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

你的软件一开始,运行就1920*1080吗?

如果是,那你就换算 1920*1080 到 1280*767 之间的关系。。

当屏幕发生分辨率的变化时取得屏幕的尺寸 
然后在以上的消息中用SetWindowPos或其他调整窗口大小的函数处理即可

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

我的软件上在1920电脑上写的,
我把他拷到1280电脑上了,运行时有部分按钮没有显示出来,
怎么让他全屏显示出来,

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

等比例缩放,根据分辨率的大小改变所有控件的大小,这个有点烦,需要改动的地方很多,用SetWindowPos。

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

codeproject上搜索easysize

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

int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
这个函数可以获得当前屏幕大小

作者: mayudong1   发布时间: 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

在当前分辨率下记录控件在窗体的位置(坐标值),然后再切换分辨率时窗体resize时把这些控件再设回以前的位置即可!

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

热门下载

更多