各位高手,如何针对不同尺寸和分辨率的屏幕设计软件界面? 我的程序是基于对话框的,上面摆了很多控件,如何让这些控件的大小随着屏幕的改变而改变?现有一种办法就是对控件一个一个的设置SetWindowPos(),但是控件太多,很麻烦,有没有好的办法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本人上次搜索了N多以前的帖子也没找到....这次又关注ing 其实改分辨率并不会影响窗口的布局吧。好像使用“大字体”和“小字体”倒是会影响dialog的显示尺寸。如果窗口的尺寸会发生变化,好像一般只能用movewindow()等等搞定,暂时还不知道其他的办法。其实你可以这样,在dialog上放控件的时候随手乱放,不要去布局,然后自己写一个布局函数比如Relayout()等等,在这个函数里区分对待各种情况,用movewindow()把控件放到合适的地方。别的办法还暂时没见到。 保留改变前后的两个分辨率算出之间的比例a.使用getwindo()函数.得到第一个子窗口(),循环至最后一个子窗口.得到子窗口在dialog上的相对位置,与a相乘,在用setwindowpos chenzhou35(vcworm.51.net) :谢谢你,你可能误会了。不同的分辨率确实会影响。如在1024*768能完全显示,在800*600不一定能显示完全。 我刚刚作了一个,实际上就是动态的定义你的空间大小及其位置:CWnd *pwnd = GetDlgItem(IDC_STATIC_PICTURE); int ox, oy, width, height; CRect rc,rc1; GetClientRect(&rc); if(pwnd->GetSafeHwnd()) { height = cy*2/3; width = height*194/191; oy = rc.top + rc.Height()/2 - height/1.75; ox = rc.left + rc.Width()/2. - width/2; pwnd->MoveWindow(ox, oy, width, height, false); } 控件太多当然是比较麻烦,但是只能这样做唯一可以偷懒的方法就是定义成数组,把你以前定义的那么控制变量改成数组变量,但是这样一来你在ClassWizard里面看不到哪个控件与哪个变量关联,可能可读性差点,但是如果实在太多的话就只能这样做了比如:你以前的内容:CEdit m_edCtl1;在DDX里面有:DDX还有消息里面的东西这些都要改。 用GetWindow(WS_CHILE)GetNextWindow函数循环得到控件的窗口在设置可以把 先得到当前的分辨率: int cy = GetSystemMetric( SM_CYSCREEN); int cx = GetSystemmetric( SM_CXSCREEN);然后跟据屏幕的大小计算对话框的大小和各个控件的位置. 下面是比较完整的代码,还不明白我就没办法了CRect rectChild;CWnd* pWndChild = GetWindow(GW_CHILD);while (pWndChild){ pWndChild->GetWindowRect(rectChild); //修改rectChild pWndChild->MoveWindow(rectChild); pWndChild = pWndChild->GetNextWindow(); }记得给分,呵呵 求解决一个win32显示窗口的问题 怎样在MFC中实现监听功能 快春节了,散分,散分!祝大家春节快乐! 如何在程序中通过外部程序打开一个chm帮助文件呢?在线等 升任大斑竹,散分 如何取得任务栏上的切换标题 自定义控件的clsssid问题 关于圆弧绘制的问题? CEdit控件的 value 变量与 Control 变量有什么不同啊? 控件注册问题 怎样在工程已经建立的情况下更改这个属性? 为什么用StretchBlt缩放后,再用GetBitmapBits就不行了?
使用getwindo()函数.
得到第一个子窗口(),循环至最后一个子窗口.
得到子窗口在dialog上的相对位置,与a相乘,在用setwindowpos
CWnd *pwnd = GetDlgItem(IDC_STATIC_PICTURE);
int ox, oy, width, height;
CRect rc,rc1;
GetClientRect(&rc);
if(pwnd->GetSafeHwnd())
{
height = cy*2/3;
width = height*194/191;
oy = rc.top + rc.Height()/2 - height/1.75;
ox = rc.left + rc.Width()/2. - width/2;
pwnd->MoveWindow(ox, oy, width, height, false);
}
唯一可以偷懒的方法就是定义成数组,把你以前定义的那么控制变量改成数组变量,但是这样一来你在ClassWizard里面看不到哪个控件与哪个变量关联,可能可读性差点,但是如果实在太多的话就只能这样做了
比如:
你以前的内容:CEdit m_edCtl1;
在DDX里面有:DDX
还有消息里面的东西这些都要改。
GetWindow(WS_CHILE)
GetNextWindow
函数循环得到控件的窗口
在设置可以把
int cy = GetSystemMetric( SM_CYSCREEN);
int cx = GetSystemmetric( SM_CXSCREEN);
然后跟据屏幕的大小计算对话框的大小和各个控件的位置.
CRect rectChild;
CWnd* pWndChild = GetWindow(GW_CHILD);
while (pWndChild)
{
pWndChild->GetWindowRect(rectChild);
//修改rectChild
pWndChild->MoveWindow(rectChild);
pWndChild = pWndChild->GetNextWindow();
}记得给分,呵呵