Window-01 コンボボックス・エディットボックスの入力バイト数を制限する
Q コンボボックス・エディットボックスの入力バイト数を制限したいです。スタイルの「水平オートスクロール」のチェックを外せば、コントロールの幅に合わせて文字数が制限されますが、等幅フォントでない場合には内容によって文字数が大きく変わってしまいます。こういうときでも常に一定のバイト数で制限する方法はありますか。
A SendMessage関数でメッセージを送ることで実現可能です。等幅フォントでなくても問題ありません。
どう使う?
コンボボックスの場合
'※コンボボックスComboBox1がMainWnd上に置かれていることを前提とする。
Dim hWnd As HWND
hWnd=GetDlgItem(hMainWnd,ComboBox1)
SendMessage(hWnd,CB_LIMITTEXT,50,0)
'この時点で ComboBox1には50バイト以内の入力しか許されなくなる
エディットボックスの場合
'※エディットボックスEditBox1がMainWnd上に置かれていることを前提とする。
Dim hWnd As HWND
hWnd=GetDlgItem(hMainWnd,EditBox1)
SendMessage(hWnd,EM_LIMITTEXT,50,0)
'この時点で EditBox1には50バイト以内の入力しか許されなくなる
SendMessageという関数を使用しました。これは、「ウィンドウ」に「メッセージ」を送るものです。ここでいう「メッセージ」とは、「文字色を変えろ」とか、「フォントを変えろ」など、属性を変更することを依頼するものです。逆に、属性の取得を依頼するものもあります。
しかし、「ウィンドウ」は「コントロール」が置いてあるメインの窓で、「コントロール」は「ウィンドウ」の中に張り付くもの、という別物ではないかと思われる方も多いでしょう。
実は、「ウィンドウ」と「コントロール」というのは、RADツールを使っている上では区別されても、プログラム上では区別されません。正確には、「コントロール」も「ウィンドウ」である、ということです。
そのため、「コントロール」相手にでもSendMessageを使うのです。
今言った「メッセージ」はSendMessageの第2引数に指定します。
ここでは制限を50バイトにしていますが、SendMessageの第3引数を変えれば制限バイト数を変更できます。
但し、64KB(65536)以上の設定は不可となっています。
※入力バイト数を制限する「メッセージ」は、コンボボックスに対しては「CB_LIMITTEXT」、エディットボックスに対しては「EM_LIMITTEXT」である。
ところで、GetDlgItem関数は何の役割を果たすのか。
それは、コントロールのハンドルを取得する立派な「API」なのです。
第1引数に親ウィンドウのハンドル、第2引数にはコントロールID…といっても難しいので簡単に言えば「コントロールの名前」を指定します。但し文字列ではなく、""は付けません。
また、第1引数には「MainWnd」ではなく、「hMainWnd」を指定することにも気を付けてください。
SendMessage関数は、ウィンドウ操作において使う機会が多いので、簡単な知識としてでも覚えておいたほうがいいでしょう。