預設工具列會佔滿一行。利用 DockControlBar 配合目標工具列位置,可實現並列停靠:
void CCJMDIFrameWnd::DockControlBarLeftOf(CControlBar* Bar, CControlBar* LeftOf) {
CRect rect; DWORD dw; UINT n = 0;
RecalcLayout(TRUE); // 確保 GetWindowRect 準確
LeftOf->GetWindowRect(&rect);
rect.OffsetRect(1, 0); // 稍微偏移避免重疊
dw = LeftOf->GetBarStyle();
n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
n = (dw & CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
n = (dw & CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
n = (dw & CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
DockControlBar(Bar, n, &rect);
}
呼叫 DockControlBarLeftOf(pBar1, pBar2) 即可讓 Bar1 停靠在 Bar2 左側並列。
利用 CPropertySheet 的 SetWizardMode 快速實現類似 Office 2000 的精靈介面:
void CMy56_s1Dlg::OnWiz() {
CSheet sheet;
sheet.SetWizardMode();
int iRet = sheet.DoModal(); // 返回 ID_WIZFINISH 或 IDCANCEL
}
// 頁面 1:顯示「上一步」「下一步」
BOOL CPage1::OnSetActive() {
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
// 頁面 2 (最後一頁):顯示「上一步」「完成」
BOOL CPage2::OnSetActive() {
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
伺服端監聽連線,客戶端主動連接,雙方建立連線後透過 Send/Receive 收發資料:
// 伺服端
BOOL CMy63_s1_serverDlg::OnInitDialog() {
CDialog::OnInitDialog();
sockListen.Create(6802, SOCK_STREAM, "127.0.0.1");
sockListen.Listen(5);
sockListen.Accept(m_sockSend); // 阻塞等待連線
sockListen.Close(); // 關閉監聽 socket
SetTimer(1, 3000, NULL); // 定時發送
}
void CMy63_s1_serverDlg::OnTimer(UINT) {
static int i=0; char buf[20];
sprintf(buf, "%010d", i++);
m_sockSend.Send(buf, 10, 0);
}
// 客戶端
BOOL CMy63_s1_clientDlg::OnInitDialog() {
CDialog::OnInitDialog();
m_sockRecv.Create();
m_sockRecv.Connect("127.0.0.1", 6802);
SetTimer(1, 3000, NULL);
}
void CMy63_s1_clientDlg::OnTimer(UINT) {
char buf[20]; int n = m_sockRecv.Receive(buf, 10, 0);
if (n >= 0) { buf[n] = '\0'; m_szRecv = buf; UpdateData(FALSE); }
}
TCP 保證有序、可靠傳遞,適合區域網路雙向資料交換。