IPアドレスコントロールの使い方
Visual Studioでダイアログボックスを作成し、その中で「IP address control」を使用し、
ユーザが入力したIPアドレスを内部処理したいと考えています。
この「IP address control」で取得したデータを参照する方法をご教示ください。
Visual Studio 2022を例に、Windows 11は使っていないのでWindows 10(22H2)の使用を前提に回答しますが、Windows 11でも動作すると思っています。
IPアドレスコントロール(SysIPAddress32
)はVisual Studioのツールボックスに載っているので、Visual Studioのダイアログエディター上でドラッグアンドドロップすればそのダイアログボックスに貼り付けることができます。
以下のコードは、IPアドレスコントロールを貼り付けた後にいくつかラベルやボタンを追加した上で、リソースファイル(*.rc)中のダイアログボックスのリソースを示したものです。ダイアログボックスはVisual Studio のプロジェクトテンプレート「「Windows デスクトップアプリケーション C++」で作成されるバージョン情報ダイアログのIDD_ABOUTBOX
をほとんどそのまま使っています。
WinApp1.rc(リソースファイル)
rc
1 IDD_ABOUTBOX DIALOGEX 0, 0, 170, 84
2 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
3 CAPTION "バージョン情報 WinApp1"
4 FONT 9, "MS UI Gothic", 0, 0, 0x1
5 BEGIN
6 ICON IDI_WINAPP1,IDC_STATIC,14,14,20,20
7 LTEXT "WinApp1, バージョン 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
8 LTEXT "Copyright (c) 2025",IDC_STATIC,42,26,114,8
9 DEFPUSHBUTTON "OK",IDOK,113,63,50,14,WS_GROUP
10 CONTROL "",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,7,42,100,14
11 PUSHBUTTON "取得",IDC_BUTTON1,113,42,50,14
12 LTEXT "----",IDC_STATIC1,7,63,100,14,0,WS_EX_CLIENTEDGE
13 END
この内CONTROL "",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,7,42,100,14
の行がIPアドレスコントロールです。コントロールのIDはIDC_IPADDRESS1
で、ツールボックスからドラッグアンドドロップしてファイルを保存するとresource.hに自動的に保存されます。
resource.h
h
1 #define IDC_IPADDRESS1 1000
簡単ですが、バージョン情報ダイアログボックス(IDD_ABOUT
)のダイアログプロシージャーにおいてIPアドレスコントロールに初期値「1.2.3.4」を入れ、ダイアログボックスの表示中に「取得」ボタン(IDC_BUTTON1
)を押下すると入力されたIPv4アドレスを取得してラベルのコントロール(IDC_STATIC1
)上に表示するサンプルコードを示します。C++となっていますが、ほとんどC言語です。
IP Address Control Reference - Microsoft Learn
※日本語記事は自動翻訳の為か変に訳され過ぎて意味不明なことがありますので、オリジナルの英語記事の方を示しておきます。日本語記事を読みたい場合はURL中の"en-us"を"ja-jp"に置換してご参照ください
C++
1 // 必要に応じて追加すること:
2 // #include <commctrl.h>
3 // #pragma comment(lib, "comctl32.lib")
4 // ...
5 // INITCOMMONCONTROLSEX icex;
6 // icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
7 // icex.dwICC = ICC_INTERNET_CLASSES;
8 // BOOL succeeded = InitCommonControlsEx(&icex);
9 //
10 // バージョン情報ボックスのメッセージ ハンドラーです。
11 INT_PTR CALLBACK About ( HWND hDlg , UINT message , WPARAM wParam , LPARAM lParam )
12 {
13 UNREFERENCED_PARAMETER ( lParam ) ;
14 INT_PTR result = FALSE ;
15
16 switch ( message ) {
17 case WM_INITDIALOG :
18 // IPアドレスコントロールに初期値を入れておく
19 SendDlgItemMessageW ( hDlg , IDC_IPADDRESS1 ,
20 IPM_SETADDRESS , 0 , MAKEIPADDRESS ( 1 , 2 , 3 , 4 ) ) ;
21 result = TRUE ;
22 break ;
23
24 case WM_COMMAND :
25 switch ( LOWORD ( wParam ) ) {
26 case IDOK :
27 case IDCANCEL :
28 EndDialog ( hDlg , LOWORD ( wParam ) ) ;
29 result = TRUE ;
30 break ;
31
32 case IDC_BUTTON1 :
33 {
34 // 「取得」ボタン押下時の処理
35 DWORD ipaddress = 0 ;
36 WCHAR ipaddressText [ 128 ] ;
37 // IPアドレスコントロールに入力された値を取得
38 LRESULT mresult = SendDlgItemMessageW ( hDlg , IDC_IPADDRESS1 , IPM_GETADDRESS , 0 , ( LPARAM ) & ipaddress ) ;
39 if ( mresult == 4 ) {
40 BYTE ip1st = FIRST_IPADDRESS ( ipaddress ) ;
41 BYTE ip2nd = SECOND_IPADDRESS ( ipaddress ) ;
42 BYTE ip3rd = THIRD_IPADDRESS ( ipaddress ) ;
43 BYTE ip4th = FOURTH_IPADDRESS ( ipaddress ) ;
44 // IPv4アドレス文字列整形
45 wsprintfW ( ipaddressText , L "%d.%d.%d.%d" , ( int ) ip1st , ( int ) ip2nd , ( int ) ip3rd , ( int ) ip4th ) ;
46 }
47 else {
48 // 入力項目数 != 4
49 wsprintfW ( ipaddressText , L "入力項目数が足りない(%d)" , ( int ) mresult ) ;
50 }
51 SetDlgItemTextW ( hDlg , IDC_STATIC1 , ipaddressText ) ;
52 }
53 break ;
54 }
55 }
56
57 return result ;
58 }
59
実行例をサンプル画像で示しておきます。
尚、IPアドレスコントロールがサポートしているIPアドレスの形式はIPv4のみで、IPv6には未対応です 。古いコモンコントロールですから仕方無いでしょう。
Windowsのデスクトップアプリケーションについて
先に記載したサンプルコードを見て、ウンザリしませんでしたか? ほとんどネイティブなだけにかなり煩雑です。
Windows上で動作させるデスクトップアプリケーションですが、まず、開発用のプログラミング言語としては現在ではC#が多く使われていると思います。.NET, .NET Framework上でWindows FormsやWPFを使えばUIが主体の一般的なプログラムは大体カバーできるのではないでしょうか。ただ、C#なら全てできると言う訳でもなくて、WindowsのOSに近い低レイヤーの部分やミドルウェアの開発ではC言語/C++が使われることもまだまだあります。クロスプラットフォームのオープンソース製品ではC言語/C++であったりするので、それらでないとかえって面倒なことになります。また、UIの見た目について、使うフレームワークによって趣きが違う場合があります。
今回の回答中に示したIPアドレスコントロールのサンプルコードはWindowsのネイティブのAPI(Win32 API)を使ったもので、このやり方は現役ではあるものの30年以上まえから漸進的に進化してきたものです。WindowsのCOM(ActiveX)や.NET含む様々なサブシステムを使うにはかなり面倒(一部は非現実的)です。もともとはC言語ベースのインターフェースで、開発環境としてはC++を使う上ではMFC(Microsoft Foundation Class)ライブラリと言うものもありますが、標準C++が策定される前から存在したものであり、使い方が異質です。(注意して使えば標準C++のライブラリと同居は可能です) UIの見た目も結構素朴なものになりがちです。
MFC デスクトップ アプリケーション - Microsoft Learn
まぁ、Windows APIも知っているとC#/.NET, .NET Frameworkでどうしても必要なときに使うP/Invoke(Platform Invoke)と言う技の意味が分かるので、習熟に無用な時間をかけない限りは知っておいて損はないと思います。
UIが必要ではあるけども本格的なデスクトップアプリケーションでなくてよいということであれば、PythonやJava、その他のプログラミング言語も選択肢になります。
teratailでも過去、Windowsのデスクトップアプリケーションの開発方法について何度か質問、回答が挙がっていました。投稿時期を気にしつつ、それらを覗いてみるのも良いと思います。