1. 程式人生 > >在對話方塊中加入工具條與 RepositionBars的呼叫

在對話方塊中加入工具條與 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所取得的時螢幕座標.