意の中のカワズ(35歳の壁 別館)

35歳の壁の別館ブログです。コード中心になるようにしたいので、技術雑記はできるだけ本館に書きます。

VBA全般:「画像付のコンボボックス表示」

ガントチャートを作る作業をちまちまやってるわけですが、
昨日くらいからどうでもよいところに躓いてます。
まぁ、気にしなきゃよいのですがちょっと画像処理系(?)弱いなぁと
思うのでがんばってます。

昨日は、

・オートシェイプをフォームに表示したい
・オートシェイプのサイズ変更を検知したい

の2つで躓きました。
結論、2つ目は、Widows近辺からフックしないとだめみたい。
イベントが飛ばないんですわ。

そんでもって、今日は、掲題のコンボボックスに画像を表示する。
という初歩的なことでこけました。

どういうものかというとこういうやつ。


わかりますでしょうか。
一番上のボックスがそれです。

え?こんなの当たり前??
いやぁ・・やったことなくて。

で、どうやって実現しているか。


色々デフォルト機能+APIで行こうと思ったのですが、
結局、DCを取得してくるのぐらいしかなさそうだったので
ActiveX方式にしました。

まぁ、要するにコントロールの参照追加です。
コントロールの追加に際して、とても重要なページを見つけました。

Visual Basic 6.0 に添付されている ActiveX コントロール一覧
 http://support.microsoft.com/kb/412577/ja

要は、ActiveXコントロール(VBE に標準参照していないヤツ)の
正式名称を探すためのサイト。
まぁ、ちゃんとしたのがあるのでしょうがVB6用です。

正式名称は、変わりませんがXPなどの標準で使うやつは、
OCX名が違うのでその点ご了承くださいませ。


以下、やることの概説です。

1) ActiveX 参照追加
2) コントロールの貼り付け
3) ImageList の設定
4) ImageComboboxの設定 コーディング

        • -

■ 1) ActiveX 参照追加

  今回、追加するのは
   ・ImageCombobox
   ・ImageList
  の2つです。
  ImageList を参照できるヤツといえば、他にも
   ・ListView
  などがあります。

  

  参照設定方法は・・わかりますね。
  上図のツールボックスを右クリックして、[その他コントロール] で
  追加してください。
  正式名称は、既出のURLを参考に。


■ 2) コントロールの貼り付け

  それぞれフォームに貼り付けるだけです。
  ここで、ImageCombobox と ImageList の関係を説明します。

  ImageList は、複数の画像を登録しておくためのコントロールで、
  タイマー同様、それ自体は表示とかはされないやつです。
  ImageComboboxは、通常のコンボと違って、イメージをコンボ内に
  内包させることのできるコントロール
  そして、そのイメージをどこから取得させるかというと、
  ImageList を指定して、そのリストから表示します。


  ImageList には、画像毎に
   ・インデックス
   ・キー
   ・タグ
  が設定できます。

  これをImageコンボで、何行目にどのインデックスのアイテムを表示。
  と、指示してやるわけです。

  これは、プロパティ画面からもできますし、プログラムからも
  設定できます。
  今回は、プログラムから設定しました。


■ 3)ImageList の設定

  前項で説明したとおり、ImageListには複数の画像をインデックス番号などで
  管理しながら登録できます。

  これもプロパティから設定できます。

  

  まさにプロパティページってのがありますので、それをクリックすると
  設定画面が起動します。

  プロパティページでは、
  [イメージ]タブ から [ピクチャの挿入] ってのを押すたびに
  画像を登録できます。
  キー、タグはなくてもいけるのかな?
  私は
   キー = a
   タグ = 1
  として、設定(後はインクリメント)しました。


■ 4)ImageCombobox の設定 コーディング

  イメージコンボボックスでも、プロパティ画面があります。
  その画面の[全般]タブ内でイメージリストの設定リストボックスで
  3) で作成したImageListの名前を指定すれば紐付けは完了なのですが、
  私はうまく行きませんでしたのでコーディングで処理します。


  

Private Sub UserForm_Initialize()
' コンボボックスの場合
Me.ImageCombo1.ImageList = Me.ImageList1
Me.ImageCombo1.ComboItems.Add 1, "a", "実線", 1, 1, 1
Me.ImageCombo1.ComboItems.Add 2, "b", "点線(丸)", 2, 2, 1

' リストビューの場合
Me.ListView1.SmallIcons = Me.ImageList1
Me.ListView1.Icons = Me.ImageList1
Me.ListView1.ListItems.Add 1, "a", "aaaaa", 1, 1

End Sub


■ 完成図

尚、後述で申し訳ないですがこのImageComboBox は挙動がおかしいことが多く、
Excelが異常終了させられやすいそうなので気をつけてください。


■ 補足

今回は、ListViewをプロパティ画面から設定しました。
後日、暇があれば動的に線画像を取込んでくるような方法
(例えば、他の設定で変更された線情報で描画しなおした画像作成し取込ませる。)
なんてのを考えてますが、やり方は画像作成し、取込むで完結しているので
興味ある日とは作ってみてはいかがでしょうか。

実は、完成図の上の方の枠内ではそういったプレビューが表示されるように
なっていますが、そこは画像作成で取込まずクリップボード経由で
取込んでいます。