新建一個對話框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所取得的時屏幕座標.