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