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

VC++ 學習:IP 位址控制項 (CIPAddressCtrl) 進階技巧 — 即時變更通知與網段設定

     編輯:VC 教學

技巧一:捕捉每個欄位的即時變更 (EN_CHANGE)

CIPAddressCtrl 雖非編輯控制項,但內部包含 4 個子編輯控制項 (每個八位組一個)。當任一欄位內容變更,會發送 EN_CHANGE 通知。透過 Spy++ 可得知子編輯控制項 ID 為 1135 (各欄位共用同一 ID)。

實作步驟

  1. 在父視窗類別宣告處理函式:afx_msg void OnChangeIpField();
  2. 訊息對映:ON_EN_CHANGE(1135, OnChangeIpField)
  3. 處理函式中即可取得最新 IP 位址:

void CMyDlg::OnChangeIpField() {
    DWORD dwIp = 0;
    m_ipCtrl.GetAddress(dwIp); // 取得 4 八位組打包值
    BYTE b1 = FIRST_IPADDRESS(dwIp);
    BYTE b2 = SECOND_IPADDRESS(dwIp);
    BYTE b3 = THIRD_IPADDRESS(dwIp);
    BYTE b4 = FOURTH_IPADDRESS(dwIp);
    // 即時驗證、顯示、聯動其他控制項...
}

技巧二:程式化設定網段 (不填入最後兩欄)

SetAddress 需提供 4 個八位組,無法直接表示「100.6.x.x」這類網段。利用子視窗枚舉,逐欄設定文字:


void SetIpAddressCtrlNetwork(CIPAddressCtrl* pCtrl,
    BYTE nField0, BYTE nField1, BYTE nField2, BYTE nField3, BYTE nFieldCount) {
    if (!pCtrl) return;
    pCtrl->ClearAddress();
    if (nFieldCount == 0) return;
    if (nFieldCount >= 4) {
        pCtrl->SetAddress(nField0, nField1, nField2, nField3);
        return;
    }

    BYTE fields[4] = { nField0, nField1, nField2, nField3 };
    HWND hChild = ::GetWindow(pCtrl->m_hWnd, GW_CHILD);
    int idx = 3; // 子視窗順序為高位到低位? 實測為反序,需注意
    while (hChild && idx >= 0) {
        if (idx < nFieldCount) {
            TCHAR sz[4]; _stprintf_s(sz, _T("%d"), fields[idx]);
            ::SetWindowText(hChild, sz);
        }
        hChild = ::GetWindow(hChild, GW_HWNDNEXT);
        idx--;
    }
}

注意:子視窗遍歷順序可能因版本不同而異,建議搭配 Spy++ 確認實際順序再調整 idx 邏輯。

總結

善用 EN_CHANGE 實現即時回饋,結合子視窗文字設定突破 SetAddress 限制,讓 IP 位址控制項更靈活好用。

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