如何?控制項隨對話方塊大小變化而自動調整大小和位置

來源:互聯網
上載者:User
  

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移動到新位置

     
對話方塊或視類的大小調後,控制項的大小和位置沒有變化,介面看起來會很不爽。控制項是從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就可以了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.