在網路程式開發中,讓使用者輸入 IP 位址向來是個麻煩事:TEdit 既無法限制輸入範圍(0-255),又需自行解析字串轉換為 32 位整數。其實 Windows 早就提供現成的解決方案——IP 位址控制項(類別名 SysIPAddress32),位於 comctl32.dll 中。本文教你如何在 C++Builder 中整合並使用這個原生控制項。
IP 控制項屬於 Internet Explorer 3 引入的新控制項,必須呼叫 InitCommonControlsEx 並指定 ICC_INTERNET_CLASSES 旗標才能使用:
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_INTERNET_CLASSES;
InitCommonControlsEx(&icc);
建議在專案的 WinMain 或表單的 OnCreate 最早期執行此初始化。
由於 VCL 未包裝此控制項,需用 CreateWindowEx 動態建立:
HWND hIP = CreateWindowEx(
WS_EX_CLIENTEDGE, WC_IPADDRESS, NULL,
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
10, 10, 150, 22,
Handle, (HMENU)IDC_MYIP, HInstance, NULL
);
WC_IPADDRESS 宏定義於 <commctrl.h>,展開為 "SysIPAddress32"。
| 功能 | 訊息/巨集 | 說明 |
|---|---|---|
| 設定 IP | IPM_SETADDRESS / IPAddress_SetAddress(hwnd, ip) | ip 為 MAKEIPADDRESS(b1,b2,b3,b4) 組合的 DWORD |
| 取得 IP | IPM_GETADDRESS / IPAddress_GetAddress(hwnd, &ip) | 回傳欄位填寫狀態,ip 輸出 DWORD |
| 設定範圍 | IPM_SETRANGE / IPAddress_SetRange(hwnd, field, min, max) | 限制某欄位(0-3)輸入範圍 |
| 清空 | IPM_CLEARADDRESS | 重設為空白 |
將 HWND 封裝在自訂元件中,於 CreateParams 或建構函式建立視窗,並公開 IPAddress 屬性(DWORD 或 AnsiString)供設計時編輯,即可像原生 VCL 控制項一樣使用,享受自動驗證、鍵盤導航、複製貼上等完整體驗。