1. 程式人生 > >如何實現控制元件隨對話方塊大小變化而自動調整大小和位置

如何實現控制元件隨對話方塊大小變化而自動調整大小和位置

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就可以了。