wxWidgets:使用IP Address控件(仅适用于msw)

本文介绍了如何在wxWidgets中,由于官方未提供IP Address控件,通过引用PlatformSDK来创建一个自定义的wxIpCtrl类,实现类似于VS2005中的IP Address输入功能,特别适用于msw平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值