想请教一下如何让vc++程序自动适应屏幕分辨率大小的问题。如我在1024x768状态下编写的程序在680x860分辨率下界面就显示不完全,有什么办法来处理吗?
谢谢!
12 个解决方案
#1
可以改变自已程序的界面,将每个控件的位置都计算出来.
看下面这个例子,在窗口大小改变时,窗口里的控件也跟着调整位置.
void CEmail::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType==SIZE_RESTORED && cx>=522 && cy>=386)
{
CWnd *pwnd;
CRect rect;
pwnd=(CWnd *)GetDlgItem(IDC_COMBO_CATALOG);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-15;
rect.left=rect.right - 90;
pwnd->MoveWindow(&rect,TRUE);
pwnd=(CWnd *)GetDlgItem(IDC_LIST);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-10;
rect.bottom=rect.top+cy/3+20;
pwnd->MoveWindow(&rect,TRUE);
((CListCtrl *)pwnd)->SetColumnWidth(1, rect.Width()-274);
pwnd=(CWnd *)GetDlgItem(IDC_RICHEDIT);
if(pwnd==NULL)return;
rect.top=rect.bottom+5;
rect.bottom=cy-10;
pwnd->MoveWindow(&rect,TRUE);
}
}
看下面这个例子,在窗口大小改变时,窗口里的控件也跟着调整位置.
void CEmail::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType==SIZE_RESTORED && cx>=522 && cy>=386)
{
CWnd *pwnd;
CRect rect;
pwnd=(CWnd *)GetDlgItem(IDC_COMBO_CATALOG);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-15;
rect.left=rect.right - 90;
pwnd->MoveWindow(&rect,TRUE);
pwnd=(CWnd *)GetDlgItem(IDC_LIST);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-10;
rect.bottom=rect.top+cy/3+20;
pwnd->MoveWindow(&rect,TRUE);
((CListCtrl *)pwnd)->SetColumnWidth(1, rect.Width()-274);
pwnd=(CWnd *)GetDlgItem(IDC_RICHEDIT);
if(pwnd==NULL)return;
rect.top=rect.bottom+5;
rect.bottom=cy-10;
pwnd->MoveWindow(&rect,TRUE);
}
}
#2
这个你自己google一下啦,帮顶
#3
非常感谢大家的回复。这样定义每一个控件会很烦恼的哟,可否有一劳永逸的办法呢?谢谢!
#4
用EASYSIZE
#5
老兄 我也遇见了和你一样的问题 哎 好郁闷的哟 你解决了么?咱们一起讨论一下子撒?
#6
试试在每次画图形前重新定义一次虚拟坐标
#7
还没有解决哟,1楼的方法我试验后没有变化哟,不知道是什么原因呢?
#8
意思很简单,创建控件时不要用固定大小,要根据屏幕的大小,按比例来调整就行了.
#9
根据屏幕的大小,按比例来调整
#10
我觉得你们说 按比例这些东西 说的都很抽象 根本没有从本质上解决问题
我现在已经实现了在同一台电脑不同分辨率下 保证了圆都是正圆 可在不同比例的电脑下就不能保证是正圆了
我现在已经实现了在同一台电脑不同分辨率下 保证了圆都是正圆 可在不同比例的电脑下就不能保证是正圆了
#11
学习,我也想让程序适应屏幕分辨率大小。。。。
#12
你是用MFC写的还是直接用API写的啊。
如果你是用MFC写的,可以在建立对话框的时候,也就是OnInitDialog里面加上这名话。ShowWindow(SW_MAXIMIZE);如果不是的话,可以ShowWindow(m_hWnd,SW_MAXMINZE);你还可以获取屏幕的尺寸。
GetSystemMetrics(int nIndex);参数用SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度。就可以运用MoveWindow();方法比较多,LZ自己想想看那方法可以行得通。
如果你是用MFC写的,可以在建立对话框的时候,也就是OnInitDialog里面加上这名话。ShowWindow(SW_MAXIMIZE);如果不是的话,可以ShowWindow(m_hWnd,SW_MAXMINZE);你还可以获取屏幕的尺寸。
GetSystemMetrics(int nIndex);参数用SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度。就可以运用MoveWindow();方法比较多,LZ自己想想看那方法可以行得通。
#1
可以改变自已程序的界面,将每个控件的位置都计算出来.
看下面这个例子,在窗口大小改变时,窗口里的控件也跟着调整位置.
void CEmail::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType==SIZE_RESTORED && cx>=522 && cy>=386)
{
CWnd *pwnd;
CRect rect;
pwnd=(CWnd *)GetDlgItem(IDC_COMBO_CATALOG);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-15;
rect.left=rect.right - 90;
pwnd->MoveWindow(&rect,TRUE);
pwnd=(CWnd *)GetDlgItem(IDC_LIST);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-10;
rect.bottom=rect.top+cy/3+20;
pwnd->MoveWindow(&rect,TRUE);
((CListCtrl *)pwnd)->SetColumnWidth(1, rect.Width()-274);
pwnd=(CWnd *)GetDlgItem(IDC_RICHEDIT);
if(pwnd==NULL)return;
rect.top=rect.bottom+5;
rect.bottom=cy-10;
pwnd->MoveWindow(&rect,TRUE);
}
}
看下面这个例子,在窗口大小改变时,窗口里的控件也跟着调整位置.
void CEmail::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType==SIZE_RESTORED && cx>=522 && cy>=386)
{
CWnd *pwnd;
CRect rect;
pwnd=(CWnd *)GetDlgItem(IDC_COMBO_CATALOG);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-15;
rect.left=rect.right - 90;
pwnd->MoveWindow(&rect,TRUE);
pwnd=(CWnd *)GetDlgItem(IDC_LIST);
if(pwnd==NULL)return;
pwnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right=cx-10;
rect.bottom=rect.top+cy/3+20;
pwnd->MoveWindow(&rect,TRUE);
((CListCtrl *)pwnd)->SetColumnWidth(1, rect.Width()-274);
pwnd=(CWnd *)GetDlgItem(IDC_RICHEDIT);
if(pwnd==NULL)return;
rect.top=rect.bottom+5;
rect.bottom=cy-10;
pwnd->MoveWindow(&rect,TRUE);
}
}
#2
这个你自己google一下啦,帮顶
#3
非常感谢大家的回复。这样定义每一个控件会很烦恼的哟,可否有一劳永逸的办法呢?谢谢!
#4
用EASYSIZE
#5
老兄 我也遇见了和你一样的问题 哎 好郁闷的哟 你解决了么?咱们一起讨论一下子撒?
#6
试试在每次画图形前重新定义一次虚拟坐标
#7
还没有解决哟,1楼的方法我试验后没有变化哟,不知道是什么原因呢?
#8
意思很简单,创建控件时不要用固定大小,要根据屏幕的大小,按比例来调整就行了.
#9
根据屏幕的大小,按比例来调整
#10
我觉得你们说 按比例这些东西 说的都很抽象 根本没有从本质上解决问题
我现在已经实现了在同一台电脑不同分辨率下 保证了圆都是正圆 可在不同比例的电脑下就不能保证是正圆了
我现在已经实现了在同一台电脑不同分辨率下 保证了圆都是正圆 可在不同比例的电脑下就不能保证是正圆了
#11
学习,我也想让程序适应屏幕分辨率大小。。。。
#12
你是用MFC写的还是直接用API写的啊。
如果你是用MFC写的,可以在建立对话框的时候,也就是OnInitDialog里面加上这名话。ShowWindow(SW_MAXIMIZE);如果不是的话,可以ShowWindow(m_hWnd,SW_MAXMINZE);你还可以获取屏幕的尺寸。
GetSystemMetrics(int nIndex);参数用SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度。就可以运用MoveWindow();方法比较多,LZ自己想想看那方法可以行得通。
如果你是用MFC写的,可以在建立对话框的时候,也就是OnInitDialog里面加上这名话。ShowWindow(SW_MAXIMIZE);如果不是的话,可以ShowWindow(m_hWnd,SW_MAXMINZE);你还可以获取屏幕的尺寸。
GetSystemMetrics(int nIndex);参数用SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度。就可以运用MoveWindow();方法比较多,LZ自己想想看那方法可以行得通。