首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 實用技巧三則:工具列並列停靠、精靈對話框、Socket 雙向通訊

     編輯:VC 教學

技巧一:讓多個工具列並列顯示

預設工具列會佔滿一行。利用 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();
}

技巧三:電腦間 TCP 封包收發 (CSocket)

伺服端監聽連線,客戶端主動連接,雙方建立連線後透過 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 保證有序、可靠傳遞,適合區域網路雙向資料交換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved