使用Windows系統提供的IP控制項

來源:互聯網
上載者:User

       在網路程式中,我們常常碰到需要使用者輸入IP地址的情況。然而C++ Builder並沒有為我們提供可以用於輸入IP串的控制項,於是我們只好用TEdit控制項(單行文字框)來接受使用者輸入的IP串。但是,使用TEdit來輸入IP串並不是一個好的主意,因為處理起來非常不方便。事實上,在我們的身旁有一個專門用來輸入IP串的Windows控制項,就象網路連結屬性中, 網際網路通訊協定 (IP) (TCP/IP) 屬性中輸入IP的控制項。IP控制項會拒絕非法的IP串(在每個部分只能輸入0~255之間的數字);它讓你可以輕鬆地擷取控制項中的IP串所對應的IP值(32位整數),這省去了IP串和IP值之間相互轉換的麻煩;此外,你還能限制IP控制項中所能輸入的IP的範圍。在本文中,我將向大家介紹如何在我們的C++ Builder程式中使用Windows的IP控制項。

 

        Windows中有兩個非常重要的動態連接庫:commctrl.dll和comctl32.dll,它們是Windows的自訂控制庫(Windows Common Controls)。自訂控制庫中包含了許多常用的Windows控制項,如Statusbar,Coolbar,HotKey等;在C++ Builder中,這些控制項大多數都已被封裝成可視化控制項了。在Microsoft推出Internet Explorer 3之後,自訂控制庫中新增了一些控制項,其中就包括Windows的IP控制項(IP Address edit control)。

 

 

●初始化Windows自訂控制庫●

     

      Windows提供了兩個API函數,InitCommonControls和InitCommonControlsEx,用來初始化自訂控制庫。從名字我們不難看出這兩個API函數的關係:後者是前者的增強。如果你希望在程式中使用IP控制項,你必須用InitCommonControlsEx來完成對自訂控制庫以及類的初始化。函數InitCommonControlsEx的原型如下:

typedef struct tagINITCOMMONCONTROLSEX {
DWORD dwSize;// size of this structure
DWORD dwICC;// flags indicating which classes to be initialized
} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;
WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
IP控制項屬於ICC_INTERNET_CLASSES類別的控制項,如果要使用該控制項,你應該在程式中包含如下的初始化代碼:
TInitCommonControlsEx ICC;
ICC.dwSize = sizeof(TInitCommonControlsEx);
ICC.dwICC= ICC_INTERNET_CLASSES;
if(!InitCommonControlsEx(&ICC))
return;//初始化組件失敗

 

 

●建立IP控制項●

        Windows API函數CreateWindow或者CreateWindowEx都可以用來建立一個IP控制項執行個體。IP控制項的視窗類別名為"SysIPAddress32",C++ Builder的commctrl.pas單元為其定義了一個符號常量WC_IPADDRESS。下面這條語句將在Form1上建立一個IP控制項。

HWND hIpEdit = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD|WS_VISIBLE,10,10,135,47,Handle,0,HInstance,NULL);

 

 

●使用IP控制項●

        在程式中,我們通過向IP控制項發送訊息來與它通訊。IP控制項可以響應的訊息有以下6個,這些訊息及它們的含義見下表:

訊息常量訊息值作用參數及傳回值

IPM_CLEARADDRESS WM_USER+100

清除IP控制項中的IP串參數無

 

IPM_SETADDRESS WM_USER+101

設定IP控制項的IP串Lparam為32位的IP值

 

IPM_GETADDRESS WM_USER+102

擷取IP控制項中的IP串所對應的IP值(32位整數)Lparam為一個指向Integer變數的指標。傳回值等於IP控制項中非控的欄位數目;擷取到的IP值存放在lparam 所指向的Integer變數中。

 

IPM_SETRANGE WM_USER+103

設定IP控制項4個部分的其中一個的IP取值範圍Wparam指明要設定取值範圍的部分;lparam的低16位字為該欄位的範圍:高位元組為上限,低位元組為下限。

 

IPM_SETFOCUS WM_USER+104

設輸入焦點Wparam指明哪個部分擷取焦點

 

IPM_ISBLANK WM_USER+105

IP串是否為空白參數無。傳回值:若為空白,返回非0;不為空白,返回0

 

★㈠清空IP串(IPM_CLEARADDRESS)★

SendMessage(hIpEdit,IPM_CLEARADDRESS,0,0);

 

★㈡設定IP串(IPM_SETADDRESS)★

int nIP;
nIP=MAKEIPADDRESS(192,168,0,1);
SendMessage(hIpEdit,IPM_SETADDRESS,0,nIP);
此例將IP控制項的內容設為"192.168.0.1",其中MAKEIPADDRESS是一個Win32宏,定義在commctrl.h標頭檔中,它用來合成一個32位的IP值:
#define MAKEIPADDRESS(b1,b2,b3,b4)
((LPARAM)(((DWORD)(b1) < <24)+((DWORD)(b2) < <16)+((DWORD)(b3) < <8)+((DWORD)(b4))))

 

★㈢擷取IP值(IPM_GETADDRESS)★
int nIP;
SendMessage(hIpEdit,IPM_GETADDRESS,0,int(&nIP));
//nIP++;
//SendMessage(hIpEdit,IPM_SETADDRESS,0,nIP);//將IP加1再賦給IP控制項。

若想要擷取IP控制項中IP串所對應的IP值,你應該向IP控制項發送IPM_GETADDRESS訊息,並且需要把一個32位整數的地址作為SendMessage的最後一個參數。

 

★㈣設定取值範圍(IPM_SETRANGE)★

SendMessage (hIpEdit, IPM_SETRANGE, 0, 200 < <8|100);

此語句將IP控制項的第一部分的範圍限制為100~200。在IPM_SETRANGE訊息中,Wparam指明要設定的欄位, 而lparam的低16位字為該欄位的範圍:高位元組為上限,低位元組為下限。

 

★㈤設定輸入焦點(IPM_SETFOCUS)★

SendMessage(hIpEdit,IPM_SETFOCUS,3,0);

//將輸入焦點設在IP控制項的第四部分。

㈥判斷IP串是否為空白(IPM_ISBLANK)

if(!SendMessage(hIpEdit,IPM_ISBLANK,0,0))
{
//IP控制項中的IP串為空白
}
else
{
//IP控制項中的IP串至少有一部分不是空的
}

 

 

●IP控制項的通知訊息●

 

      當IP串被改動後或者輸入焦點發生了轉移,IP控制項就會向它的父視窗發送通知訊息IPN_FIELDCHANGED。在大多數情況下,我們都可以忽略此通知訊息。以下是處理通知訊息IPN_FIELDCHANGED的一個樣本:

void __fastcall TForm1::WndProc(TMessage &Msg)
{
LPNMHDR p=(LPNMHDR)Msg.LParam;
if(Msg.Msg==WM_NOTIFY)
{
if(p-> code==IPN_FIELDCHANGED)
{
//處理IP控制項的IPN_FIELDCHANGED通知訊息
}
}
TForm::WndProc(Msg);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.