2024年3月24日发(作者:)
如何实现控件随对话框大小变化而自动调整大小和位置
VC++ 2009-12-28 20:27:42 阅读461 评论0 字号:大中小 订阅
1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话
框上面的控件重新调整新位置和大小。
2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来调整控件的位置和大
小,控件的大小最好设置成窗口的百分之几,这样的话,就可以根据窗口的大小随时调整
了。
3. 每次OnSize 即可获得一个CRect,然后根据这个CRect来确定这些控件的位置和
大小,使用函数MoveWindow 或SetWindowpos实现。
4.
1)通过下面两个函数获取的是显示屏幕的大小【屏幕的分辨率】(不包括任务栏等区
域):
int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //屏幕宽度
int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //屏幕高度
2)这两个函数获取的是真正屏幕的大小【屏幕的分辨率】(包括任务栏等区域):
int cx = GetSystemMetrics( SM_CXSCREEN );
int cy = GetSystemMetrics( SM_CYSCREEN );
如:用前两个函数获取的大小可能是1024*687 ,而用下边两个获取的就是1024*768。
5. 在OnSize() 中调用: GetClientRect() 和 GetWindowRect() 函数可获取窗口
大小,但需注意得到的是设备坐标,如果需要画图什么的还需要转换成逻辑坐标。
6. 字体大小随窗口变化而自动变化,比如说始终使字的高度始终占窗口的1/3。使用:
1). 在Creat中将nHeight设成窗口长度或者宽度的一定比值就行了 (最好在onsize
函数中设置);
2). 使用 WM_FONTCHANGE 消息。
*********************************************************************************
**********************************************************
转载自:
/u/20090314/16/835a3bbb-2d13-4842-922a-8a07cde1a055.
html (作者:Fireway2008)
总结步骤:
1.创建一个CWnd* 的数组,在初始化时取的各个控件的句柄,存在这个数组里面
2.处理WM_SIZE事件,可以得到新变化后的窗口和最初窗口的变化比例kx,ky
3.对数组中的每一个控件,计算新位置
ndow移动到新位置
对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽。控
件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其
大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。
===========>>>>>>>
根据按钮控件ID不同进行调整,响应WM_SIZE
1. 先声明一个成员
CRect m_rect; //用于保存对话框大小变化前的大小
2. 初始化的时候获取对话框区域
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//获取对话框创建时的大小:
GetClientRect(&m_rect);
……
}
3. 自定义一个函数,根据控件ID进行处理
void CTestDlg::ChangeSize(UINT nID, int x, int y)
{
CWnd *pWnd;
pWnd = GetDlgItem(nID); //获取控件句柄
if(pWnd) //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{
CRect rect; //获取控件变化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect); //将控件大小转换为在对话框中的区域坐标
// 其中 x / m_() 为对话框在横向的变化比例;y / m_()为对
话框在纵向的变化比例
= * x / m_(); // 调整控件大小
= * x / m_();
= * y / m_();
= * y / m_();
pWnd->MoveWindow(rect); //设置控件大小
}
}
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//进行条件判断,不然窗口最小化后再恢复就产生BUG(整数除以0),即:最小化的
时候m_rect的各个量是“0”,所以在窗口还原的时候就出现了除0的异常。
if(nType != SIZE_MINIMIZED )
{
ChangeSize(IDC_BUTTON1, cx, cy);
ChangeSize(IDC_BUTTON2, cx, cy);
ChangeSize(IDC_BUTTON3, cx, cy);
ChangeSize(IDC_BUTTON4, cx, cy);
GetClientRect(&m_rect); // 将变化后的对话框大小设为旧大小,否则无法还原控件
原始位置
}
}
*********************************************************************************
**********************************************************
转载自:/GuiAndWindows/
VC对话框全屏显示及相应控件位置改变
一、简单对话框全屏显示方法
在OnInitDialog()中任意加入:
1、ModifyStyle(WS_CAPTION,0,0); //如果不想去掉标题栏,去掉该句。
SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0);
2、ShowWindow(SW_SHOWMAXIMIZED);
二、复杂一点的对话框全屏显示方法,随屏幕的分辩率而调节
void CMainFrame::OnFullScreen()
{
GetWindowPlacement(&m_OldWndPlacement);
CRect WindowRect;
GetWindowRect(&WindowRect);
CRect ClientRect;
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery,
&ClientRect);
ClientToScreen(&ClientRect);
//获取屏幕的分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区
域
//将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外
//客户区位置间的差值, 就得到全屏显示的窗口位置
m_=;
m_=;
m_=+nFullWidt
h;
m_=+n
FullHeight;
m_bFullScreen=TRUE; //设置全屏显示标志为TRUE
//进入全屏显示状态
WINDOWPLACEMENT wndpl;
=sizeof(WINDOWPLACEMENT);
=0;
d=SW_SHOWNORMAL;
alPosition=m_FullScreenRect;
SetWindowPlacement(&wndpl);
}
三、对话框全屏及按钮控件移到相应位置
void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
int cx=::GetSystemMetrics(SM_CXSCREEN);
int cy=::GetSystemMetrics(SM_CYSCREEN);
CRect rtClient,rtBtn;
CWnd *pWnd=GetDlgItem(IDC_BUTTON);
GetClientRect(&rtClient); //获得对话框客户区屏幕坐标
ClientToScreen(&rtClient); //映射为屏幕坐标
pWnd->GetWindowRect(&rtBtn); //获得button屏幕坐标
int lx=(); //button长度
int ly=(); //button高度
int dx=; //离右边框的距离
int dy=; //离底边框的距离
MoveWindow(CRect(0,0,cx,cy)); //移动窗口
pWnd->MoveWindow(CRect(cx-dx-lx,cy-ly-dy,cx-dx,cy-dy));
button
CDialog::OnLButtonDown(nFlags, point);
}
四、设计状态下指定对话框以全屏显示
1、手工把它拽成比如1024×768, 然后Alt+V U
2、在*.rc文件中修改,但是单位不一样。
五、用MoveWindow或SetWindowPos全屏对话框
1. 首先计算出客户区的大小GetClientRect();
2. 再计算出整个窗口的大小GetWindowRect();
//移动
3. 然后再得到当前屏幕的大小GetSystemMetrics();
4. 最后根据这三个数据进行换算,得到当客户区为屏幕大小时窗口的位置和大小;
5. 计算完成后调用MoveWindow就可以了。


发布评论