[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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にする方法、 「ハズレかも知れないよ」的な情報でも構いません。 アドバイスお願いします。
(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" で返したらええやん。 すみません。勉強不足で。 どこら辺が「普通」なのか、誰か教えて欲しいですね。
>全体的に微妙やね。 いやホントそうですね。
(白茶)
すべてコールバック内での処理の話だし。
せやからどんな風に呼んどんのか書かな分からへんやん。
回答者が検証するとき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.