604
社区成员
发帖
与我相关
我的任务
分享
以下代码封装了TIPAddress类,代码由cker编写,在此对cker表示感谢。
// start of TIPAddress
#include <CommCtrl.hpp>
#include <ComCtrls.hpp>
class TIPAddress;
//---------------------------------------------------------------------------
Word __fastcall MakeIPRange(Byte Low, Byte High)
{
return Word((Word(High) << 8) + Word(Low));
}
//---------------------------------------------------------------------------
unsigned __fastcall MakeIPAddress(Byte b1, Byte b2, Byte b3, Byte b4)
{
return Word((Word(b1) << 24)+(Word(b2) << 16)+(Word(b3) << 8)+(Word(b4)));
}
//---------------------------------------------------------------------------
Byte __fastcall First_IPAddress(unsigned X)
{
return Byte((X >> 24) & 0x0FF);
}
//---------------------------------------------------------------------------
Byte __fastcall Second_IPAddress(unsigned X)
{
return Byte((X >> 16) & 0x0FF);
}
//---------------------------------------------------------------------------
Byte __fastcall Third_IPAddress(unsigned X)
{
return Byte((X >> 8) & 0x0FF);
}
//---------------------------------------------------------------------------
Byte __fastcall Fourth_IPAddress(unsigned X)
{
return Byte(X & 0x0FF);
}
//---------------------------------------------------------------------------
typedef void __fastcall (__closure *TIPAddressFieldChangeEvent)
(TIPAddress* Sender, Byte OldField, Byte Value);
typedef void __fastcall (__closure *TIPAddressChangeEvent)
(TIPAddress* Sender, AnsiString IPAddress);
//---------------------------------------------------------------------------
class TIPAddress : public TWinControl
{
private:
TIPAddressChangeEvent FOnIPChange;
TIPAddressFieldChangeEvent FOnIPFieldChange;
int FMinIPAddress;
int FMaxIPAddress;
Byte FActiveField;
bool FAutoSize;
void __fastcall CNNotify(TWMNotify &Message); // CN_NOTIFY;
void __fastcall CNCommand(TWMCommand &Message); // CN_COMMAND;
protected:
virtual void __fastcall CreateParams(TCreateParams ¶ms);
AnsiString __fastcall GetMinIPAddress();
AnsiString __fastcall GetMaxIPAddress();
AnsiString __fastcall GetIPAddress();
void __fastcall SetMinIPAddress(AnsiString Value);
void __fastcall SetMaxIPAddress(AnsiString Value);
void __fastcall SetIPAddress(AnsiString Value);
bool __fastcall GetEmpty();
void __fastcall SetActiveField(Byte Value);
void __fastcall WndProc(TMessage &Message);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CN_NOTIFY, TWMNotify, CNNotify);
VCL_MESSAGE_HANDLER(CN_COMMAND, TWMCommand, CNCommand);
END_MESSAGE_MAP(TWinControl);
public:
virtual __fastcall TIPAddress(TComponent* AOwner);
AnsiString __fastcall IPToString(int Ip);
int __fastcall StringToIP(AnsiString Value);
void __fastcall Clear();
__published:
__property Byte ActiveField = {read = FActiveField, write = SetActiveField};
__property bool Empty = {read = GetEmpty};
__property AnsiString MinIPAddress = {read = GetMinIPAddress, write = SetMinIPAddress};
__property AnsiString MaxIPAddress = {read = GetMaxIPAddress, write = SetMaxIPAddress};
__property AnsiString IPAddress = {read = GetIPAddress, write = SetIPAddress};
__property TIPAddressChangeEvent OnIPChange = {read = FOnIPChange, write = FOnIPChange};
__property TIPAddressFieldChangeEvent OnIPFieldChange = {read = FOnIPFieldChange, write = FOnIPFieldChange};
__property Font;
__property ParentColor;
__property ParentFont;
__property ParentShowHint;
__property PopupMenu;
__property ShowHint;
__property TabOrder;
__property TabStop;
__property Tag;
__property DragCursor;
__property DragMode;
__property HelpContext;
};
//---------------------------------------------------------------------------
void __fastcall TIPAddress::WndProc(TMessage &Message)
{
switch (Message.Msg)
{
case WM_KEYDOWN:
{
ShowMessage("aweaw");
}
break;
}
TWinControl::WndProc(Message);
}
//---------------------------------------------------------------------------
__fastcall TIPAddress::TIPAddress(TComponent* AOwner):TWinControl(AOwner)
{
if (NewStyleControls)
ControlStyle << csClickEvents << csSetCaption << csDoubleClicks << csFixedHeight;
else
ControlStyle << csClickEvents << csSetCaption << csDoubleClicks << csFixedHeight << csFramed;
ParentColor = false;
FAutoSize = true;
Width = 100;
Height = 25;
TabStop = true;
FMinIPAddress = 0;
FMaxIPAddress = 0x0FFFFFFFF;
FActiveField = 0;
FOnIPChange = NULL;
FOnIPFieldChange = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::CreateParams(TCreateParams ¶ms)
{
InitCommonControl(ICC_INTERNET_CLASSES);
TWinControl::CreateParams(Params);
CreateSubClass(Params, WC_IPADDRESS);
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::CNCommand(TWMCommand &Message) //CN_COMMAND;
{
if ((Message.NotifyCode == EN_CHANGE) && OnIPChange)
OnIPChange(this, IPAddress);
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::CNNotify(TWMNotify &Message) //CN_NOTIFY;
{
switch(Message.NMHdr->code)
{
case IPN_FIELDCHANGED :
{
FActiveField = (PNMIPAddress(Message.NMHdr))->iField;
if (OnIPFieldChange)
{
OnIPFieldChange(this, (PNMIPAddress(Message.NMHdr))->iField,
(PNMIPAddress(Message.NMHdr))->iValue);
}
}
break;
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall TIPAddress::GetIPAddress()
{
int IP = 0;
SendMessage(Handle, IPM_GETADDRESS, 0, (int)&IP);
return IPToString(IP);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TIPAddress::GetMinIPAddress()
{
return IPToString(FMinIPAddress);
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::SetMinIPAddress(AnsiString Value)
{
FMinIPAddress = StringToIP(Value);
SendMessage(Handle, IPM_SETRANGE, 0, MakeIPRange(First_IPAddress(FMinIPAddress),
First_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 1, MakeIPRange(Second_IPAddress(FMinIPAddress),
Second_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 2, MakeIPRange(Third_IPAddress(FMinIPAddress),
Third_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 3, MakeIPRange(Fourth_IPAddress(FMinIPAddress),
Fourth_IPAddress(FMaxIPAddress)));
}
//---------------------------------------------------------------------------
AnsiString __fastcall TIPAddress::GetMaxIPAddress()
{
return IPToString(FMaxIPAddress);
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::SetMaxIPAddress(AnsiString Value)
{
FMaxIPAddress = StringToIP(Value);
SendMessage(Handle, IPM_SETRANGE, 0, MakeIPRange(First_IPAddress(FMinIPAddress),
First_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 1, MakeIPRange(Second_IPAddress(FMinIPAddress),
Second_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 2, MakeIPRange(Third_IPAddress(FMinIPAddress),
Third_IPAddress(FMaxIPAddress)));
SendMessage(Handle, IPM_SETRANGE, 3, MakeIPRange(Fourth_IPAddress(FMinIPAddress),
Fourth_IPAddress(FMaxIPAddress)));
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::SetIPAddress(AnsiString Value)
{
SendMessage(Handle, IPM_SETADDRESS, 0, StringToIP(Value));
}
//---------------------------------------------------------------------------
bool __fastcall TIPAddress::GetEmpty()
{
return (bool)(SendMessage(Handle, IPM_ISBLANK, 0, 0));
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::Clear()
{
SendMessage(Handle, IPM_CLEARADDRESS, 0, 0);
}
//---------------------------------------------------------------------------
void __fastcall TIPAddress::SetActiveField(Byte Value)
{
if(Value < 4)
{
SendMessage(Handle, IPM_SETFOCUS, WPARAM(Value), 0);
FActiveField = Value;
}
}
//---------------------------------------------------------------------------
int __fastcall TIPAddress::StringToIP(AnsiString Value)
{
Byte B[4];
B[0]= 0;
B[1]= 0;
B[2]= 0;
B[3]= 0;
int Cnt = 0;
int i = Value.Pos(".");
AnsiString Str;
while ((Value.Length() > 0) && ( Cnt < 4 ))
{
if (i == 0)
i = Value.Length() + 1;
Str = Value.SubString(1, i-1);
B[Cnt] = StrToInt(Str);
Value = Value.SubString(i+1, Value.Length());
i = Value.Pos(".");
Cnt++;
}
return MakeIPAddress(B[0], B[1], B[2], B[3]);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TIPAddress::IPToString(int Ip)
{
AnsiString strTemp;
strTemp.sprintf("%d.%d.%d.%d", First_IPAddress(Ip), Second_IPAddress(Ip),
Third_IPAddress(Ip), Fourth_IPAddress(Ip));
return strTemp;
}
// end of TIPAddress
调用举例:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TIPAddress *ip;
ip = new TIPAddress(this);
ip->Parent = this;
}