WinXP SP2 + VisualStudio.NET2003 + MFCです。
スタイルがLVS_ICONのCListCtrlで質問があります。
文中のラベルの幅とは、アイテムにフォーカスがある場合の
ラベルを囲む点線の幅として記述しています。
32x32のイメージリストを設定して実行したところ、
ラベルの幅がアイコンの幅より左右に広がっています。
ラベルの幅=32+α
100x100のイメージリストを設定して実行したところ、
同様にラベルの幅がアイコンの幅より左右に広がっています。
ラベルの幅=100+α
ただ、32x32のイメージリストを設定して実行した後で、
100x100のイメージリストに変更し、
SetIconSpacing()でアイコン間隔を調整したのですが、
ラベルの幅は32x32の幅のままになってしまっています。
ラベルの幅=32+αのまま
ラベルの幅を変更する方法をご存知の方がいらっしゃいましたら
ご教示ください。
よろしくお願いします。
> ただ、32x32のイメージリストを設定して実行した後で、
> 100x100のイメージリストに変更し、
> SetIconSpacing()でアイコン間隔を調整したのですが、
> ラベルの幅は32x32の幅のままになってしまっています。
> ラベルの幅=32+αのまま
これについて、どういう現象が起こっているのか掴めません。
現象を再現できる最小限のコードを掲載できますか?
シャノンさん、返事ありがとうございます。
> 現象を再現できる最小限のコードを掲載できますか?
再現したテストコードです。
・CHogeListCtrlはCListCtrlを継承しています。
・CHogeListCtrlの生成時はLVS_REPORTにしています。
→生成時にLVS_ICONを指定してしまうと、
InitList()でChangeLargeImage()にしても
ラベルの幅が32+αになってしまうため
void CHogeListCtrl::InitList()
{
m_imgLarge.Create(100, 100, ILC_COLOR24 | ILC_MASK, 0, 4);
m_imgIcon.Create(32, 32, ILC_COLOR24 | ILC_MASK, 0, 4);
InsertItem(0, _T(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));
// ChangeIconImage(); ラベルの幅=32+α
// ChangeLargeImage(); ラベルの幅=100+α
ChangeIconImage();
}
void CHogeListCtrl::ChangeLargeImage()
{
SetImageList(&m_imgLarge, LVSIL_NORMAL);
ModifyStyle(LVS_TYPEMASK, LVS_ICON);
SetIconSpacing(146, 145);
}
void CHogeListCtrl::ChangeIconImage()
{
SetImageList(&m_imgIcon, LVSIL_NORMAL);
ModifyStyle(LVS_TYPEMASK, LVS_ICON);
SetIconSpacing(78, 75);
}
-------------
void CHogeListCtrlDlg::OnButtonLargeImage()
{
m_listHoge.ChangeLargeImage();
}
void CHogeListCtrlDlg::OnButtonIconImage()
{
m_listHoge.ChangeIconImage();
}
よろしくお願いします。
やっぱりわかりません。
> ・CHogeListCtrlの生成時はLVS_REPORTにしています。
> →生成時にLVS_ICONを指定してしまうと、
> InitList()でChangeLargeImage()にしても
> ラベルの幅が32+αになってしまうため
その現象を再現させたいので、LVS_ICON で生成してください。
32x32 の場合、俺の環境では、アイテムの文字列が
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa('a'×50文字)
のとき、アイテムをクリックすると、横一列に12文字×4段、5段目に2文字が表示されま
した。
で、ChangeLargeImage を呼ぶと、横一列に23文字×2段、3段目に4文字が表示されまし
た。
最初から LVS_ICON でも、アイテムを選択していてもいなくても、VisualStyle が ON で
も OFF でも、ChangeIconImage と ChangeLargeImage を何度呼んでもそうなりました。
これと違う結果になりますか?
ChangeLargeImage を呼んでも、12×4+2文字になるということですか?
> これと違う結果になりますか?
> ChangeLargeImage を呼んでも、12×4+2文字になるということですか?
はい、私の環境ではChangeLargeImage を呼んでも
12×4+2文字になります。
近くにあったWindows2000で試したのですが、
現象は変わりませんでした。
どこかでコードを公開できればいいのですが。。
コモンコントロール v6 マニフェストを追加しないと再現しました。
アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやるとうまくいきま
した。
list.SetItemText( 0, 0, list.GetItemText( 0, 0 ) );
みたいに。
が、原因はわかりません。
可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。
2003 ってデフォルトでは追加されないんでしたっけ。
> アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやると
> うまくいきました。
アイテムが複数あった場合、すべてに行う必要がありますが
今回のプロジェクトではアイテム数が限られているため、
この方法で実現しようと思います。
ありがとうございました。
> 可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。
対象が海外も含まれており、いまだに2000も現役なもので。。。