[[20130507204702]]  『CustomUI作成:getItemImageでdropDownのitemに登録したimageは16x16サイズにならないの?』(白茶)  ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

 『CustomUI作成:getItemImageでdropDownのitemに登録したimageは16x16サイズにならないの?』(白茶)

●経緯

 今までは自作アドインのOpen時にVBA側からCommandBarを作成していました。
 Excel2010になった後も「アドイン」タブからコマンドを選択していたのですが、
 ぼちぼちリボン化に取り掛かろうかなと、ようやく重い腰をあげました。(あげてまだ1週間です)

 そのCommandBarのControls中にmsoControlDropdownがひとつあり、これに関しては
 とあるCodeModuleからProcOfLineによる判定でDropdownにプロシージャ名をAddItemし、
 OnActiont側でDropdownのTextをRunするという実行形態を採っていました。

 それ以外の固定的なコマンドのリボン化は、ほぼ目途がついたのですが、
 コイツをリボン上でどうしてやろうか、dynamicMenuになっちゃうか?(めんどいなぁ)
 と、思っていたら、dropDownのコールバックで何とかなりそうだと気付きました。

 列挙したいプロシージャ名は以前からの仕組の流用で、あらかじめ配列に格納しておけます。
 て事は、今回新たにすべき事は、
 getItemCountでdropDownのitem数を設定し、
 getItemLabelでdropDown内の項目を順次設定する。(必要ならgetItemIDも)
 実行側はonActionで今までとだいたい同じ手法が採れるだろう。

 と、踏んで、実際おおむねその通りに動作してくれそうな感触です。

●問題

 そのまま作業を進めていれば、何も引っかからなくて良かったのですが、
 「getItemImage」がどうしても気になって、脇道に逸れてしまった、その真っ最中です。

 とりあえず試しに、幾つかのitemに対してimageをSetしてみたのですが、
 dropDownのitemがimageを設定したitemだけデカくなってしまいました。
 imageのサイズが32x32になってしまった様です。
 (以下が、実際のgetItemImageの処理)

 Sub dropDown_getItemImage(control As IRibbonControl, index As Integer, ByRef image)
    Select Case control.id
        Case "task1"
            Select Case index
                Case 0:     Set image = GetImagefromFaceId(2135)
                Case 1:     Set image = CommandBars.GetImageMso("SizeToControlHeightAndWidth", 16, 16)
                ' (以下省略)
        End Select
    End Select
 End Sub

 Rem FaceIdからIPictureDispを取得(imageMsoが分らなかった場合用の仮対策)
 Function GetImagefromFaceId(FaceIdNumber As Long) As IPictureDisp
    Const BarName As String = "TMP_GetImagefromFaceId"
    On Error Resume Next
    CommandBars(BarName).Delete
    Err.Clear
    On Error GoTo 0
    Dim Bar As CommandBar, CB As CommandBarButton
    Set Bar = CommandBars.Add(Name:=BarName, temporary:=True)
    Set CB = Bar.Controls.Add(Type:=msoControlButton, temporary:=True)
    CB.FaceId = FaceIdNumber
    Set GetImagefromFaceId = CB.Picture
    CB.Delete
    Bar.Delete
    Set CB = Nothing
    Set Bar = Nothing
 End Function

 FaceIdから取得したものは勿論、GetImageMsoも16x16を指定してるのですが、
 実際dropDownのitemに表示されるimageは16x16の画像をそのまま拡大表示したようなボヤけた画像です。
 素直に16x16のまま出てくれていればいいのに・・・

 だいたいは
http://msdn.microsoft.com/ja-jp/library/aa338199%28office.12%29.aspx
http://msdn.microsoft.com/ja-jp/library/aa722523%28office.12%29.aspx
 のあたりを参考に書いたのですが、そもそも2007の情報だし、(2010の同様の情報に辿り着けなかった orz)
 どうなのかな・・・ とは思っているのですが、
 見た限りでは、dropDownのitemのsizeを設定する属性はどうやら無さそうです。
 それとも何か見落としているのでしょうか?

 当初の目的からすると、明らかに「いらん事」をしようとしているのは承知の上で、
 dropDownのitemのimageを16x16にする方法、
 「ハズレかも知れないよ」的な情報でも構いません。
 アドバイスお願いします。


肝心なXML分からんし何ともいえないけど、逆に32サイズにならなくね?
つーか、GetImagefromFaceIdも要らなくね?
Application.CommandBars.FindControl(***).Picture でええやん。
あとこれも。CommandBars.GetImageMso・・・。
普通に Set image = "SizeToControlHeightAndWidth" で返したらええやん。
全体的に微妙やね。

 (774)

 かなり今更ですが、解決(というか理由が判明)したので一応報告。
 知らない間に面白いレスも1つ来たし。(2週間以上はレスチェックしてたんですがね。すみません)

 > 肝心なXML分からんし何ともいえないけど、

 すみません。今回の現象にXMLそのものはあんまり関係ないと思ったもので・・・。
 すべてコールバック内での処理の話だし。

 >逆に32サイズにならなくね?

 いろいろ試してみた結果、
 先頭のitem(indexがゼロのitem)にImageをSetした場合は、全て16x16サイズになるけど、
 途中のitemからImageをSetし出すと、16x16サイズを32x32サイズに引き伸ばした画像になる様です。

 例えばitemが5個あるとして、
 index=0とindex=3に対してImageをSetした場合は、全て16x16になるけど、
 index=1とindex=3に対してImageをSetした場合は32x32サイズに引き伸ばした画像になる。

 それは判ったのですが、、
 結局CommandBarControlのdropDownとの根本的な動作の違いに気付いたので、
 galleryをdropDownっぽく使うことにしました。
 というのは、、
 直近に選択したitem(いわゆるSelectedItem)を続けて選択する場合、
 CommandBarControlのdropDownはOnActionが発動するけど、tabのdropDownは発動しない。
 従って、前回のOnAction時にSelectedItemをクリアしてやる必要が出てきたんですが、
 だったら、あえてdropDownを使う意味がそもそも無くなってしまったという・・・。

 > つーか、GetImagefromFaceIdも要らなくね?
 > Application.CommandBars.FindControl(***).Picture でええやん。
 > あとこれも。CommandBars.GetImageMso・・・。

 使いたいイメージが全て既知のContorlに使用されているんなら、そうですね。
 ただし、仮にそうだとしたら、いちいちFindControlなんかせずに、
 最初っからコールバックを「getImageMso」にしますよね。
 なんかツッコミ方がズレてますよ。

 CommandBarの時はFaceIDの一覧なんか手軽に自分で作れたし、
 「FaceIDは知ってるんだけど、Office内のどこで使われてるのかは知らない」
 という人も多いと思います。
 imageMsoも公開されている一覧はアプリケーション単位のものばかりだから、
 調べるのに時間がかかる。
 (そんなマイナーなイメージ使うなよ。って言われたらそれまでですが)
 一応、
 >imageMsoが分らなかった場合用の仮対策
 とも書いたんだし、そこを突っ込んでこられるとは思いもしませんでした。

 あと、
 > 普通に Set image = "SizeToControlHeightAndWidth" で返したらええやん。
 すみません。勉強不足で。
 どこら辺が「普通」なのか、誰か教えて欲しいですね。

 >全体的に微妙やね。
 いやホントそうですね。

 (白茶)


うん
微妙というか、何一つ正常に機能しないぞ
774のレス

すべてコールバック内での処理の話だし。

せやからどんな風に呼んどんのか書かな分からへんやん。
回答者が検証するときXMLまで全部書かせるんかい?

途中のitemからImageをSetし出すと、16x16サイズを32x32サイズに引き伸ばした画像になる様です。

これはおもろい。
知らんかったわ。

最初っからコールバックを「getImageMso」にしますよね。 なんかツッコミ方がズレてますよ。 ・・・
とも書いたんだし、そこを突っ込んでこられるとは思いもしませんでした。

せやからな、ワシが言いたいのはなんで

Dim Bar As CommandBar, CB As CommandBarButton
Set Bar = CommandBars.Add(Name:=BarName, temporary:=True)
Set CB = Bar.Controls.Add(Type:=msoControlButton, temporary:=True)
CB.FaceId = FaceIdNumber
Set GetImagefromFaceId = CB.Picture

こんなことしてんのかって話。
idMsoが分からんかったときのためにコマンドバーのID(FaceId)からアイコン取得って話は分かる。
けど何で↑みたいにいちいちコマンドバー追加せなアカンのか、と。
言いたいのはそこやね。コマンドバーのIDわかっとるんやったら

Application.CommandBars.FindControl(id:=xxx).Picture

で返したら済む話やんか。な?

すみません。勉強不足で。 どこら辺が「普通」なのか、誰か教えて欲しいですね。

ごめん。Setはいらんかったわ。
コピペしたときの消し忘れやね。

普通も何もExcel 2007 VBA Programmer's Referenceにも書いてあるやん。
idMsoかIPictureでエエって。
リボン弄るのにわりと常識。
知らんかったんならホンマに勉強不足。
色んな質問に回答付けてるみたいやけど、自分ももうちょっと勉強した方がええで。

 (774)

 >コマンドバーのIDわかっとるんやったら

 いや、ですからぁ・・・。
 「FaceID」だと言ってるじゃないですか。最初っから。
 コントロールのIDが使えない場合なんですって。
 別物でしょ?
 Application.CommandBars.FindControl(id:=9199).Picture
 とか無理でしょ?

 >ごめん。Setはいらんかったわ。
 ですね。
 スレの主旨(16x16にならないのはなぜ?)を度外視して
 無理矢理イチャモン付けてる事には変わりないですが。
 その記述が出来るからって、
 16x16サイズの検証に何ら貢献しないっすよね?

 >色んな質問に回答付けてるみたいやけど
 えらい古い話ですね。
 恥ずかしいからそこは見逃して下さいね・・・。泣きそうになる・・・orz

 (白茶)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.