在對話框中加入工具條與 RepositionBars的調用

 

新建一個對話框IDD_DIALOG1,然後新建一個工具欄IDR_TOOLBAR1,要將上面的工具條插入到對話框當中的話,可以如下操作

BOOL ExaDg_1::OnInitDialog()
    {
       CDialog::OnInitDialog();
       // TODO: Add extra initialization here
/////////////////產生工具欄,並調整對話框上的所有的子窗口位置//////////////////////////////////
       if (!m_TBar.Create(this) ||!m_TBar.LoadToolBar(IDR_TOOLBAR1))
             {
              TRACE0("Failed to create dialog toolbar/n");
              EndDialog( IDCANCEL );
              }//產生工具欄
           CRect rcClientStart;
           CRect rcClientNow;
           GetClientRect(rcClientStart);
         //取得對話框客戶區的矩形區域大小存於rcClientStart當中
          RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);//上面創建了工具欄所以調整一次工具欄的默認高度就是30(經測量得出的結論),前面已經創建了一個工具欄,並通過RepositionBars進行了調整所以客戶區rcClientNow矮了30
       CPoint ptOffset(rcClientNow.left-rcClientStart.left, rcClientNow.top-rcClientStart.top);
          CRect rcChild;      //用來保存子窗口的矩形區域大小                          
          CWnd* pwndChild = GetWindow(GW_CHILD);//取得CWnd第一個子窗口的指針
       while (pwndChild)
          { //循環將所有的子窗口重新調整其位置                             
             pwndChild->GetWindowRect(rcChild);//取得句柄所對應子窗口的矩形座標(屏幕座標)存入rcChild
             ScreenToClient(rcChild);//將屏幕座標轉化爲窗客戶座標
             rcChild.OffsetRect(ptOffset);//將矩形rcChild按照ptOffset進行偏移計算
             pwndChild->MoveWindow(rcChild, FALSE);//將子窗口移動到rcChild處
             pwndChild = pwndChild->GetNextWindow();//取得下一個子窗口的指針
          }
///////////////下面將對話框大小重整////////////////////////////////////////////////////////
       CRect rcWindow;
       GetWindowRect(rcWindow);//取得窗口的屏幕矩形座標,包含標題欄與邊框在內
       rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
       rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
       MoveWindow(rcWindow, FALSE);
       RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);//將控件重排一次,改動了對話框的大小,再調整一次控件的位置,否則控件就不見啦
    CenterWindow();
       return TRUE; // return TRUE unless you set the focus to a control
                     // EXCEPTION: OCX Property Pages should return FALSE
   }

根據上面的代碼運行與調試結果來看,所謂的RepositionBars函數就是將ID值在AFX_IDW_CONTROLBAR_FIRST與AFX_IDW_CONTROLBAR_LAST之間的相應的控件進行”重繪”,個人理解爲讓其顯示在對話框上,因爲工具欄是創建出來的,並不像那些窗口資源中固有的編輯框(屬於窗口資源的一部分)那樣,所以每當對話框變化時,要通過RepositionBars函數將創建的工具欄顯示出來.或當創建了工具欄的時候,通過RepositionBars函數將工具欄顯示出來.除框架類之外,客戶區不包含工具欄,另外還要注意屏幕座標與客戶座標我區別,主要就在於其所參照的原點的的位置不同,以窗口左上角爲原點則爲客戶座標,以屏幕左上角不原點則爲屏幕座標.GetWindowRect所取得的時屏幕座標.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章