CIPAddressCtrlでIP設定時に000が0に省略されないようにセットするには?

[戻る]
こう 2006/07/27(木) 15:39:57
環境
OS:WIN2000
VC++.NET

度々お世話になります。

CListCtrlから以下のようにIPアドレスを取得します。
csIpData = m_List.GetSelData(0);
この時のcsIpDataには"192.168.000.001"と入っています。

CIPAddressCtrlを使用し、
上記のcsIpDataのIPアドレスをIP Address Controlにセットすると、
"192.168.0.1"と"0"が省略されてセットされてしまいます。

"0"が省略されずにセットする方法をご教授下さい。
よろしくお願いします。

επιστημη 2006/07/27(木) 15:56:18
> 上記のcsIpDataのIPアドレスをIP Address Controlにセットすると、
> "192.168.0.1"と"0"が省略されてセットされてしまいます。

どうやってセットするんですか? コードが見たい。
# (文字列でなく)4つの数をセットするしか方法がないのなら、たぶんムリ。
# 「0埋め3ケタで表示しろ」と指図できない限り。

こう 2006/07/27(木) 16:05:07
>επιστημηさん
返信ありがとうございます。
現在のコードは以下のようになっています。
"現在"と"その前"でも結果は同じでした。

--現在
CString csIpData;
csIpData = m_List.GetSelData(0);

CString csIp1, csIp2, csIp3, csIp4;
csIp1 = csIpData.Mid( 0,  3 );
csIp2 = csIpData.Mid( 4,  3 );
csIp3 = csIpData.Mid( 8,  3 );
csIp4 = csIpData.Mid(12,  3 );
csData.Format("%03s.%03s.%03s.%03s", csIp1, csIp2, csIp3, csIp4);
m_Ip.SetWindowText( csData );    

--その前
CString csIpData;
csIpData = m_List.GetSelData(0);
m_EastIp.SetWindowText(csIpData);

よろしくお願いします。

Blue 2006/07/27(木) 16:19:10
VC++6.0 Enter SP6(Windows Xp Pro SP2)ですが、デフォルトでダイアログを作成し、
CIPAddressコントロールとボタンのみ配置して、

void CIPAddCtrlTestDlg::OnButton1() 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    CIPAddressCtrl* pIPAddCtrl
                       = ( CIPAddressCtrl* )this->GetDlgItem( IDC_IPADDRESS1 );
    pIPAddCtrl->SetWindowText( _T( "192.168.000.001" ) );
}

と、記述して試してみましたが、きちんと 192.168.0.1 と表示されました。

.NET 環境で、これだけの同じように作っても再発するのか確認してくれますか?

PATIO 2006/07/27(木) 16:25:42
m_IpがCIPAddressCtrlクラスのインスタンスなら
SetWindowTextを使うのではなくてSetAddressを使うべきだろうし、
CIPAddressCtrlクラスの説明に0詰めを行うようなスタイルが
説明されていないのであれば、無理でしょう。

どうしても0詰めしたいのであれば、自前でCEditを使ってコントロールする
とかしないと無理だと思います。
それこそサブクラス化して自分で処理を書き足すような事をすれば、
出来るかもしれませんけれど、その為にはCIPAddressCtrlの実装を
理解しておく必要があると思いますよ。

こう 2006/07/27(木) 16:27:03
>Blueさん
返信ありがとうございます。

確認ですが、
"000"を"0"と表記したいのではなく、
"000"を"000"のまま表記したいです。

現状、Blueさんの書いていただいたとおり、
"192.168.000.001"は"192.168.0.1"と出力されています。

省略されないようにするにはどうすればよろしいでしょうか。

よろしくお願いします。

こう 2006/07/27(木) 16:29:05
>PATIOさん
返信ありがとうございます。

SetAddressを使用してみましたが、
これも無理でした。

>自前でCEditを使ってコントロールする
とありますが、どのように扱うのでしょうか。

よろしくお願いします。

Blue 2006/07/27(木) 16:31:02
> "000"を"000"のまま表記したいです。
そういうことね、、、CIPAddressCtrlをそのまま使っている以上無理でしょう。
PATIO さんのおっしゃるとおり自分でその機能を作りこむしかないですね。

こう 2006/07/27(木) 16:33:07
[[解決]]
>Blueさん
返信ありがとうございます。

やはり無理なんですね。

時間がかかりそうなのであきらめます。
ありがとうございました。

敬具

Blue 2006/07/27(木) 16:45:36
Spy++でしらべてみたとこと IPアドレスコントロール には4つの エディットボックスが
あるようです。
表示だけでしたら、FindWindowExかなんかで、3番目のエディットボックスのハンドル
を取得して、それに対して直接SetWindowTextを呼べば "000" と表示されます。

一応適当に
void CIPAddCtrlTestDlg::OnButton1() 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    CIPAddressCtrl* pIPAddCtrl = ( CIPAddressCtrl* )this->GetDlgItem( 
IDC_IPADDRESS1 );

    HWND hWnd1 = ::FindWindowEx( pIPAddCtrl->GetSafeHwnd(), NULL, NULL, NULL );
    HWND hWnd2 = ::FindWindowEx( pIPAddCtrl->GetSafeHwnd(), hWnd1,NULL, NULL );
    HWND hWnd3 = ::FindWindowEx( pIPAddCtrl->GetSafeHwnd(), hWnd2,NULL, NULL );
    HWND hWnd4 = ::FindWindowEx( pIPAddCtrl->GetSafeHwnd(), hWnd3,NULL, NULL );

    ::SetWindowText( hWnd1, _T( "001" ) );
    ::SetWindowText( hWnd2, _T( "000" ) );
    ::SetWindowText( hWnd3, _T( "168" ) );
    ::SetWindowText( hWnd4, _T( "192" ) );
}

こう 2006/07/27(木) 16:56:01
>Blueさん
返信ありがとうございます。

上記で可能になりました。
ありがとうございます。

今後ともよろしくお願いします。

PATIO 2006/07/27(木) 17:02:46
セットだけなら良いんですが、編集が入ったら元の木阿弥になりませんか?
編集しないと言う前提ならいいかもしれませんけれど。

編集がかかったときも0詰めしたいのならやっぱり手間をかける必要があるのではと
思います。

Blue 2006/07/27(木) 17:07:28
> 編集が入ったら元の木阿弥になりませんか?
ユーザが 001 とうてばそのとおりになるのは IPアドレスコントロールのデフォルトの
動きです。

ですので、考慮すべきは、プログラム側で設定するところだけだと思います。
(SetWindowText,SetAddress)

PATIO 2006/07/27(木) 17:21:28
いえ、1と打った時も0詰めにしたいのかなと思ったので
そこまで考慮に入れる必要がないなら設定だけでよいと思います。

Blue 2006/07/27(木) 17:32:06
>いえ、1と打った時も0詰めにしたいのかなと思ったので
そういうことですね。

やるとしたら、編集中ではなくフォーカスが外れたらぐらいでよさそうですね。
(123 と入れたいのに 001 になって入力できなくなったらウザ杉ですからね)


といっても、サブクラス化なのかな。。。メンドそ。
だったら、自作のコントロールを作成したほうがよいのかも。

こう 2006/07/27(木) 17:40:52
いつもお世話になっております。

同一のスレに質問していいのか迷いましたが、
ここ書き込みいたします。

IP Address Controlにセットした値をGetWindowTextで取得すると、
これも"000"が"0"を表記されてしまいます。

解決するすべをご教授お願いします。

Blue 2006/07/27(木) 17:55:26
GetAddressで取得して、Formatするんじゃだめなの?

こう 2006/07/27(木) 18:35:09
>Blueさん
返信ありがとうございます。

Formatでできました。
あろがとうございます。


---ソース
CString csData;
m_TcpIp.GetWindowText(csData);

BYTE bData[4];
m_TcpIp.GetAddress(bData[0],bData[1],bData[2],bData[3]);
csData.Format("%03d.%03d.%03d.%03d", bData[0],bData[1],bData[2],bData[3]);

古いスレッドには追加発言できません。