使用 CPropertySheet + CPropertyPage 實現分步引導介面:
void CMyDlg::OnWizard() {
CSheet sheet;
sheet.SetWizardMode(); // 啟用精靈模式(顯示 Back/Next/Finish)
int ret = sheet.DoModal(); // 回傳 ID_WIZFINISH 或 IDCANCEL
}
// 頁面 1:顯示 Back、Next
BOOL CPage1::OnSetActive() {
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
// 頁面 2(最後一頁):顯示 Back、Finish
BOOL CPage2::OnSetActive() {
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
關鍵:SetWizardMode() 啟用精靈外觀,OnSetActive() 動態控制按鈕顯示。
BOOL CServerDlg::OnInitDialog() {
CDialog::OnInitDialog();
CSocket sockListen;
sockListen.Create(6802, SOCK_STREAM, "127.0.0.1"); // 建立監聽 socket
sockListen.Bind(6802, "127.0.0.1");
sockListen.Listen(5);
sockListen.Accept(m_sockSend); // 阻塞等待連線,m_sockSend 為成員變數
sockListen.Close(); // 關閉監聽 socket
SetTimer(1, 3000, NULL); // 3 秒定時發送
}
void CServerDlg::OnTimer(UINT nIDEvent) {
static int idx = 0;
char buf[20];
sprintf(buf, "%010d", idx++);
m_sockSend.Send(buf, 10, 0); // 發送 10 位元組
}
BOOL CClientDlg::OnInitDialog() {
CDialog::OnInitDialog();
m_sockRecv.Create(); // 建立 socket
BOOL ok = m_sockRecv.Connect("127.0.0.1", 6802); // 主動連線
TRACE("connect %s", ok ? "OK" : "Error");
SetTimer(1, 3000, NULL); // 3 秒定時接收
}
void CClientDlg::OnTimer(UINT nIDEvent) {
char buf[20];
int len = m_sockRecv.Receive(buf, 10, 0);
TRACE("received %d bytes", len);
if (len > 0) {
buf[len] = '\0';
m_strRecv = buf;
UpdateData(FALSE); // 更新介面顯示
}
}
重點:伺服器 Listen/Accept、用戶端 Connect、資料收發用 Send/Receive、定時器驅動週期性通訊。
從 CJ60Lib 移植的函式,將 Bar 工具列停靠在 LeftOf 左側並列:
void CCJMDIFrameWnd::DockControlBarLeftOf(CControlBar* Bar, CControlBar* LeftOf) {
CRect rect;
DWORD dw;
UINT n;
RecalcLayout(TRUE); // 確保 GetWindowRect 準確
LeftOf->GetWindowRect(&rect);
rect.OffsetRect(1, 0); // 微調位置
dw = LeftOf->GetBarStyle();
n = 0;
n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
n = (dw & CBRS_ALIGN_BOTTOM) ? AFX_IDW_DOCKBAR_BOTTOM : n;
n = (dw & CBRS_ALIGN_LEFT) ? AFX_IDW_DOCKBAR_LEFT : n;
n = (dw & CBRS_ALIGN_RIGHT) ? AFX_IDW_DOCKBAR_RIGHT : n;
DockControlBar(Bar, n, &rect); // 執行停靠
}
用法:DockControlBarLeftOf(pToolBar2, pToolBar1); 將工具列 2 停靠在工具列 1 左側並列顯示。
CPropertySheet::SetWizardMode() + 動態按鈕控制。CSocket 封裝 TCP 流程,配合定時器實現週期收發。DockControlBar。三個技巧涵蓋 UI、網路、佈局常見需求,可直接整合至專案加速開發。