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

VC++ 實用開發技巧三則:精靈對話框、Socket 通訊、工具列佈局

     編輯:關於VC++

技巧一:建立精靈對話框

使用 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() 動態控制按鈕顯示。

技巧二:TCP Socket 雙向通訊(CSocket 實作)

伺服器端


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() + 動態按鈕控制。
  • Socket 通訊:CSocket 封裝 TCP 流程,配合定時器實現週期收發。
  • 工具列並列:計算目標停靠區域與位置,呼叫 DockControlBar。

三個技巧涵蓋 UI、網路、佈局常見需求,可直接整合至專案加速開發。

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