如何实现控件随对话框大小变化而自动调整大小和位置

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 消息。 
******************************************************************************************************************************************* 转载自:
http://topic.csdn.net/u/20090314/16/835a3bbb-2d13-4842-922a-8a07cde1a055.html (作者:Fireway2008) 总结步骤: 
1.创建一个CWnd*   的数组,在初始化时取的各个控件的句柄,存在这个数组里面    2.处理WM_SIZE事件,可以得到新变化后的窗口和最初窗口的变化比例kx,ky    3.对数组中的每一个控件,计算新位置    4.MoveWindow移动到新位置 




   2014年全国注册建造师考试  建设工程造价管理  建设工程计价  建设工程造价案例分析  建设工程技术与计量    
  




      对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽。控件是从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_rect.Width() 为对话框在横向的变化比例;y / m_rect.Height()为对话框在纵向的变化比例  
rect.left  = rect.left * x / m_rect.Width();    // 调整控件大小  rect.right = rect.right * x / m_rect.Width();  rect.top  = rect.top * y / m_rect.Height();  rect.bottom = rect.bottom * y / m_rect.Height();  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); // 将变化后的对话框大小设为旧大小,否则无法还原控件原始位置 }  }  
******************************************************************************************************************************************* 
转载自:http://www.joyvc.cn/GuiAndWindows/GuiAndWindows00040.html 
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_FullScreenRect.left=WindowRect.left-ClientRect.left;                      m_FullScreenRect.top=WindowRect.top-ClientRect.top;      
                m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;                      m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;      
                m_bFullScreen=TRUE;   //设置全屏显示标志为TRUE       
                //进入全屏显示状态      
                WINDOWPLACEMENT wndpl;      
                wndpl.length=sizeof(WINDOWPLACEMENT);                      wndpl.flags=0;      
                wndpl.showCmd=SW_SHOWNORMAL;                      wndpl.rcNormalPosition=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=rtBtn.Width();                 //button长度                    int ly=rtBtn.Height();                //button高度                    int dx=rtClient.right-rtBtn.right;    //离右边框的距离                    int dy=rtClient.bottom-rtBtn.bottom;  //离底边框的距离        
                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就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值