• ベストアンサー

VB6,リストボックスの特定行の色変更は可能?

リストボックスに複数行テキストが登録されているときに、特定の行の背景色を変更することは可能でしょうか? リストボックスのプロパティ等をいろいろ探してみたのですがそれらしきものは見つかりません。 サブクラス化というやつをすればできるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.1

これは「オーナードロー」というテクニックになります。 例えばListBoxの描画をVBでは意識する必要がありませんが(マウスで選択するとハイライトしたり、ウインドウを再表示した時に再描画してくれたり等)、これはOSが勝手にやってくれるからなのです。 「オーナードロー」とは、このOSがやってくれる作業を自分で行う、ということになります。 自分で行えば背景色の変更も、前景色の変更も可能になります。 背景にビットマップを描画することも可能です。 >サブクラス化というやつをすればできるのでしょうか? オーナードローをVB6で実現するには、サブクラス化が必須になります。 オーナードローのコントロールからWM_DRAWITEMというメッセージが送られてくるので、それを処理しなければいけないからです。 ただ、VB6標準のListBoxには「オーナードローを許可する」ListBoxというのがありません。 具体的に言うと LBS_OWNERDRAWFIXED:(デフォルト)普通のListBox LBS_OWNERDRAWVARIABLE:オーナードローが有効なListBox という2つのウインドウスタイルがありますが、VB6標準のListBoxはLBS_OWNERDRAWFIXED固定になっています。 これを変える事は難しいので、CreateWindowEx()API関数を使って「一から(LBS_OWNERDRAWVARIABLEを有効にした)ListBoxを作成する」という作業が必要になります。 そのうえで、サブクラス化を行い、ウインドウプロシージャでWM_DRAWITEMを捕まえて、描画を行います。 しかも、描画にしてもVC++などでウインドウ描画(ブラシなど)の知識があればその辺は何とかなると思いますが、やったことが無いとかなり大変です。 なにせ、OSがやってくれたことを全部(に近い状態で)行わなくてはいけないのですから。 もしサブクラス化の知識もおありでないようでしたら、潔くListBoxを使うのはあきらめたほうがいいかもしれませんね(^^; 一応、参考になりそうなサイトを挙げておきます。 <<ボタンのオーナードロー>> http://www5.ocn.ne.jp/~minute/article/vb/a2.html このケースではCommandButtonですが、考え方は一緒です。 <<サブクラス化>> http://www.galliver.co.jp/writing/susume_vb/tre908/ ListBoxそのものではありませんが(MS提供のユーザーコントロールを使う)、参考になるサンプルとその情報があります。 いちばん簡単なのは、多少運用は面倒ですがListBoxの代わりにTreeViewなどを使う方法ですね。 時間があればListBoxでチャレンジしても構いませんが、サブクラス化一つとってもそれなりの知識が必要ですので、段階を踏んで知識を積み上げていくことをオススメします。

tochanx
質問者

お礼

道標を立ててくださりありがとうございます。 VBのスキルレベルは、まだコントロールをきったりはったりのレベルですが、少しずつ上昇させていきたいと思います。 とりあえず参考リンクから、やっていきます。

関連するQ&A

  • リストボックスの特定行の背景色

    いつもお世話になっております。 VB6を使っています。 リストボックスの特定の行の背景色を変えたいのですが、 何か方法はあるのでしょうか? どうかよろしくお願いいたします。

  • VB6のリストボックスで特定の項目に色をつけるには?

    VB6.0で複数の数値データをリストボックスに登録した場合、例えば100以上のデータの場合、赤色をつけるにはどうすればいいのでしょうか。 下記で(1)のコードが打てればいいのでしょうが、List1.List(i)に対してForeColorプロパティは使用できません。 For i = 0 To List1.ListCount - 1 If List1.List(i) >= 100 Then List1.List(i).ForeColor=vbRed(1) End If Next i どなたか教えてください。

  • VBとリストボックス

    こんにちわ。 いまVB6.0sp5でリストボックスに チェックボックス付きのリストを表示し, クリックで複数選択するロジックを組んでいます。 リストに表示するデータ件数がリストボックスの高さを超えるため, 横スクロールさせる必要があります。 そこで,2列目のキャプションをクリックすると, スクロールし,選択した行以外のチェックボックスが見た目, 消えてしまいます。 なお消えたチェックボックスの箇所をクリックすると, その行のチェックボックスが選択された状態で表示されます。 2列目のキャプションをクリックしたときに,ほかの行のチェックボックスを 消さないようにしたいのですが, どうすれば良いでしょうか? 教えてください。 宜しくお願いします。

  • テキストボックスの内容(複数行)をリストへ

    テキストボックスの内容(複数行)をリストボックスへ1行表示にするにはどうすれば良いのでしょうか? replaceにてvbcrlf(改行文字?)を置き換えしようとしても無理でした。 ご教授お願いします。

  • VBでテキストボックスの重複行削除

    テキストボックスのチェンジイベントでテキストボックスに貼り付けた複数行のデータに 重複行があればその行を消したいのですがうまくいきません。 良い方法があればご教示下さい。 例) 1111 2222 1111 3333 4444 ↓↓ 1111 2222 3333 4444

  • 【VB6】複数行のテキストボックスの改行

    お世話になります。 VB6で、複数行入力出来るテキストボックスを作成しました。 そのテキストボックスの横幅は、最大30文字(60byte)まで入力出来ます。 ですが、あくまでフォーム上で伸縮させていた為、中途半端に折り返しされます。 【例】 iiiiiiiiiijjjjjjjjjjiiiiiiiiiijjjjjjjjjjiiiiiiiiiijjjあ jjjjjjj (↑計62バイトなので、本来であれば2行目に改行されてしまったjjjjjjjの左5文字を1行目に表示させたい) その行は特定のバイトを超えたらその場で強制的に改行!というソースを追加したいです。 その為には、常にテキストボックスの入力バイト数を監視するようにしなければならないと思いますが、なるべく動作や容量が重くならないような方法はありますでしょうか?

  • Accessのリストボックスについて

    いつもお世話になっております。 XP Pro.、Access2003を使っています。 フォームに貼り付けたリストボックスに列見出し を表示しています。 しかし、列見出しとデータ行との区別がつきにくいので、 列見出しだけ背景色を変えたいと考えているのですが、 該当するプロパティがみつかりません。 どのようにすればいいのか、ご教示お願いいたします。

  • VB6でチェックボックス付のリストボックスを配置しているのですが、行を

    VB6でチェックボックス付のリストボックスを配置しているのですが、行を選択したときにチェックON/OFFにさせることはできないでしょうか? 現状だとチェックボックスをクリックしないと動かないので・・・。

  • エクセルVBAのリストボックス

    エクセルVBAのリストボックスを使った検索システムを作っています。 リストボックスはユーザーフォームではなくsheetに貼り付けてます。 リスト地域 北海道 青 森 岩 手 山 形 新 潟  ・  ・  ・ リストボックスから地域(複数選択)を選んで検索ボタン(コマンドボタン)を押すと同じsheetの特定の場所(例えばrange("A25")に選択した地域を表示させたいのですがうまくいきません。 例) 北海道、東京、愛知 のように表示させたいです。 単数選択ではうまく表示できるのですが、複数だとうまくいきません。 (複数選択できるようにプロパティのMultiSelectの項目はfmMultiselectMultiに変更しています。) よろしくお願いします。

  • リストボックスの全行表示

    リストボックスをクリックした時の表示行数は決まっていますよね。これを、例えば20行あれば、クリックしたときに20行全部最初のクリックで表示するようにできますか? #「HTML」のカテゴリーで質問→javascriptならできるかなという助言があったので、こちらで質問させて下さい。 #複数行の表示(size="")のことではありません。 #どうも見えない部分を認識してくれないユーザーさんがあるので、それへの対応です。

専門家に質問してみよう