vs2005中提供有IP Address控件,可以方便的输入IPv4地址,wxWidgets没有提供类似插件,不过可以利用PlatformSDK自己定义一个
1,声明一个基于wxControl的类,类名为wxIpAddr,实现如下:
wxIpCtrl.h
#ifndef _WXIPCTRL_H_
#define _WXIPCTRL_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "wxIpCtrl.h"
#endif
#include "CommCtrl.h" // SDK必须用到的头文件
#include "wx/msw/private.h"
class WXDLLEXPORT wxIpAddr:public wxControl

...{
public:
wxIpAddr(wxWindow *parent, wxWindowID id,
const wxString& value = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("SysIPAddress32"))

...{
Create(parent, id, value, pos, size, style, validator, name);
}
bool Create(wxWindow *parent, wxWindowID id,
const wxString& value = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("SysIPAddress32"));
~wxIpAddr();
virtual wxSize DoGetBestSize() const;// 为IP address控件定义一个合适的大小
wxUint32 GetIpAddr32();// 得到一个32位IP地址(大字节序)
wxString GetIPAddStr();// 得到一个xxx.xxx.xxx.xxx格式的字符串
private:

};
#endif
2,方法实现:
wxIpCtrl.cpp
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "wxIpCtrl.h"
#endif

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wxIpCtrl.h"
wxIpAddr::~wxIpAddr()

...{

}
bool wxIpAddr::Create(wxWindow *parent, wxWindowID id,
const wxString& value,
const wxPoint& pos,
const wxSize& size,
long style,
const wxValidator& validator,
const wxString& name)

...{
DoGetBestSize();//入参size没有使用,创建控件时使用的size是该函数生成的m_bestSizeCache
if ( !CreateControl(parent, id, pos, m_bestSizeCache, style, validator, name) )
return false;
INITCOMMONCONTROLSEX CommCtrl;// 可以参照MSDN
CommCtrl.dwSize=sizeof(CommCtrl);
CommCtrl.dwICC=ICC_INTERNET_CLASSES;
BOOL flag = InitCommonControlsEx(&CommCtrl);
if (flag==false)

...{
assert(0);
return false;
}
if ( !MSWCreateControl(name, WS_VISIBLE|WS_CHILD, pos, m_bestSizeCache, value) )
return false;
return true;
}
wxSize wxIpAddr::DoGetBestSize() const

...{
int cx, cy;
wxGetCharSize(GetHWND(), &cx, &cy, GetFont());
int hText = cy;
hText += EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) - cy;
int wText = 24*cx;
wxSize best(wText, hText);
CacheBestSize(best);
return best;
}
wxUint32 wxIpAddr::GetIpAddr32()

...{
wxUint32 m_dwIpAddr;
::SendMessage(GetHwnd(), IPM_GETADDRESS, 0, (LPARAM)&m_dwIpAddr);// 参见MSDN
m_dwIpAddr = wxINT32_SWAP_ON_LE(m_dwIpAddr);
return m_dwIpAddr;
}
wxString wxIpAddr::GetIPAddStr()

...{

union ...{
unsigned char bytes[4];
wxUint32 whole_thing;
} in_pieces;
wxUint32 ipaddr = GetIpAddr32();
int i;
char *piece;

static char string[3*4+3+1]; /**//* WWW.XXX.YYY.ZZZ */
in_pieces.whole_thing = ipaddr;
piece = string;
for (i = 0; i < 4; i++)

...{
assert(i>=0 && i<4);
if (in_pieces.bytes[i] >= 100)

...{
*piece++ = (char)('0' + ((in_pieces.bytes[i]/100) % 10));
}
if (in_pieces.bytes[i] >= 10)

...{
*piece++ = (char)('0' + ((in_pieces.bytes[i]/10) % 10));
}
*piece++ = (char)('0' + in_pieces.bytes[i] % 10);
if (i == 3)

...{
*piece = '';
}
else

...{
*piece++ = '.';
}
}
return wxString(string);
}

这样就可以使用,举个例子,在一个Dialog中使用IP Address控件
3,入口函数
wxTextCtrlApp.cpp
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "wxTextCtrlApp.h"
#endif

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "wxTextCtrlDialog.h"

class MyDialogApp: public wxApp

...{
DECLARE_CLASS( MyDialogApp )

public:
MyDialogApp();
virtual bool OnInit();
virtual int OnExit();
};

DECLARE_APP(MyDialogApp)

IMPLEMENT_APP( MyDialogApp )

IMPLEMENT_CLASS( MyDialogApp, wxApp )



MyDialogApp::MyDialogApp()

...{
}

bool MyDialogApp::OnInit()

...{
DemoDialog* mainWindow = new DemoDialog(NULL, ID_DemoDialog, _("Personal DemoDialog"));
mainWindow->ShowModal();

mainWindow->Destroy();
// A modal dialog application should return false to terminate the app.
return false;

}

int MyDialogApp::OnExit()

...{
return wxApp::OnExit();
}
4,从wxDialog继承一个类(
DemoDialog),并在
DemoDialog中画出IP Address控件
wxTextCtrlDialog.cpp
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "wxTextCtrlDialog.h"
#endif
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wxTextCtrlDialog.h"
#include "wxIpCtrl.h"
IMPLEMENT_DYNAMIC_CLASS( DemoDialog, wxDialog )

BEGIN_EVENT_TABLE( DemoDialog, wxDialog )
EVT_BUTTON( ID_BUTTON1, DemoDialog::OnButton1Click )
END_EVENT_TABLE()

DemoDialog::DemoDialog()

...{
}

DemoDialog::DemoDialog( wxWindow* parent, wxWindowID id, const wxString& caption,
const wxPoint& pos, const wxSize& size, long style )

...{
Create(parent, id, caption, pos, size, style);
}
bool DemoDialog::Create( wxWindow* parent, wxWindowID id, const wxString& caption,
const wxPoint& pos, const wxSize& size, long style )

...{
SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
wxDialog::Create( parent, id, caption, pos, size, style );

CreateControls();
if (GetSizer())

...{
GetSizer()->SetSizeHints(this);
}
Centre();
return true;
}
DemoDialog::~DemoDialog()

...{

}

void DemoDialog::CreateControls()

...{
DemoDialog* itemDialog1 = this;
wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
itemDialog1->SetSizer(itemBoxSizer2);

wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_LEFT|wxALL, 5);

wxStaticText* itemStaticText4 = new wxStaticText( itemDialog1, wxID_STATIC,
_("Please enter your ip address"), wxDefaultPosition, wxDefaultSize, 0 );
itemBoxSizer3->Add(itemStaticText4, 0, wxALIGN_LEFT|wxALL, 5);

wxIpAddr* itemIpAddr = new wxIpAddr( itemDialog1, ID_IPADDRESS,
_T(""), wxDefaultPosition, wxDefaultSize, 0 );
itemBoxSizer3->Add(itemIpAddr, 0, wxALIGN_LEFT|wxALL, 5);
wxStaticLine* itemStaticLine12 = new wxStaticLine( itemDialog1, ID_STATICLINE,
wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
itemBoxSizer2->Add(itemStaticLine12, 0, wxGROW|wxALL, 5);

wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxHORIZONTAL);
itemBoxSizer2->Add(itemBoxSizer13, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);

wxButton* itemButton14 = new wxButton( itemDialog1, wxID_OK,
_("&OK"), wxDefaultPosition, wxDefaultSize, 0 );
itemBoxSizer13->Add(itemButton14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

wxButton* itemButton15 = new wxButton( itemDialog1, wxID_CANCEL,
_("&Cancel"), wxDefaultPosition, wxSize(80,20), 0 );
itemBoxSizer13->Add(itemButton15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

wxButton* itemButton16 = new wxButton( itemDialog1, ID_BUTTON1,
_("Button"), wxDefaultPosition, wxDefaultSize, 0 );
itemBoxSizer13->Add(itemButton16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

}
void DemoDialog::OnButton1Click( wxCommandEvent& event )// 测试函数,显示控件中输入的IP地址

...{
wxIpAddr* ipaddr = (wxIpAddr*)FindWindow(ID_IPADDRESS);
wxMessageBox(ipaddr->GetIPAddStr(), "", wxOK | wxICON_INFORMATION, this);
}
5,声明Dialog的继承类在这里声明
wxTextCtrlDialog.h
#ifndef _DemoDialog_H_
#define _DemoDialog_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "wxTextCtrlDialog.h"
#endif
#include "wx/spinctrl.h"
#include "wx/statline.h"
#define ID_DemoDialog 10000
#define ID_TEXTCTRL1 10001
#define ID_SPINCTRL1 10002
#define ID_CHOICE1 10003
#define ID_STATICLINE 10006
#define ID_IPADDRESS 10007
#define ID_BUTTON1 10008
#define SYMBOL_DemoDialog_STYLE wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX
#define SYMBOL_DemoDialog_TITLE _("Personal DemoDialog")
#define SYMBOL_DemoDialog_IDNAME ID_DemoDialog
#define SYMBOL_DemoDialog_SIZE wxSize(400, 300)
#define SYMBOL_DemoDialog_POSITION wxDefaultPosition
class DemoDialog: public wxDialog

...{
DECLARE_DYNAMIC_CLASS( DemoDialog )
DECLARE_EVENT_TABLE()

public:
DemoDialog();
DemoDialog( wxWindow* parent, wxWindowID id = SYMBOL_DemoDialog_IDNAME,
const wxString& caption = SYMBOL_DemoDialog_TITLE,
const wxPoint& pos = SYMBOL_DemoDialog_POSITION,
const wxSize& size = SYMBOL_DemoDialog_SIZE,
long style = SYMBOL_DemoDialog_STYLE );

bool Create( wxWindow* parent, wxWindowID id = SYMBOL_DemoDialog_IDNAME,
const wxString& caption = SYMBOL_DemoDialog_TITLE,
const wxPoint& pos = SYMBOL_DemoDialog_POSITION,
const wxSize& size = SYMBOL_DemoDialog_SIZE,
long style = SYMBOL_DemoDialog_STYLE );
~DemoDialog();
void CreateControls();
void OnButton1Click( wxCommandEvent& event );
private:
};
#endif