CListCtrlのラベルの幅を変更したい

[戻る]
シュウ 2008/04/24(木) 11:32:40
WinXP SP2 + VisualStudio.NET2003 + MFCです。

スタイルがLVS_ICONのCListCtrlで質問があります。

文中のラベルの幅とは、アイテムにフォーカスがある場合の
ラベルを囲む点線の幅として記述しています。

32x32のイメージリストを設定して実行したところ、
ラベルの幅がアイコンの幅より左右に広がっています。
ラベルの幅=32+α

100x100のイメージリストを設定して実行したところ、
同様にラベルの幅がアイコンの幅より左右に広がっています。
ラベルの幅=100+α

ただ、32x32のイメージリストを設定して実行した後で、
100x100のイメージリストに変更し、
SetIconSpacing()でアイコン間隔を調整したのですが、
ラベルの幅は32x32の幅のままになってしまっています。
ラベルの幅=32+αのまま

ラベルの幅を変更する方法をご存知の方がいらっしゃいましたら
ご教示ください。

よろしくお願いします。

シャノン 2008/04/24(木) 12:38:52
> ただ、32x32のイメージリストを設定して実行した後で、
> 100x100のイメージリストに変更し、
> SetIconSpacing()でアイコン間隔を調整したのですが、
> ラベルの幅は32x32の幅のままになってしまっています。
> ラベルの幅=32+αのまま

これについて、どういう現象が起こっているのか掴めません。
現象を再現できる最小限のコードを掲載できますか?

シュウ 2008/04/24(木) 13:45:22
シャノンさん、返事ありがとうございます。

> 現象を再現できる最小限のコードを掲載できますか?

再現したテストコードです。
・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();
}

よろしくお願いします。

シャノン 2008/04/24(木) 14:07:45
やっぱりわかりません。

> ・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文字になるということですか?

シュウ 2008/04/24(木) 14:34:38
> これと違う結果になりますか?
> ChangeLargeImage を呼んでも、12×4+2文字になるということですか?

はい、私の環境ではChangeLargeImage を呼んでも
12×4+2文字になります。

近くにあったWindows2000で試したのですが、
現象は変わりませんでした。

どこかでコードを公開できればいいのですが。。

シャノン 2008/04/24(木) 15:02:34
コモンコントロール v6 マニフェストを追加しないと再現しました。

シャノン 2008/04/24(木) 15:07:10
アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやるとうまくいきま
した。
 list.SetItemText( 0, 0, list.GetItemText( 0, 0 ) );
みたいに。

が、原因はわかりません。

シャノン 2008/04/24(木) 15:24:10
可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。
2003 ってデフォルトでは追加されないんでしたっけ。

シュウ 2008/04/24(木) 15:27:37
[[解決]]
> アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやると
> うまくいきました。

アイテムが複数あった場合、すべてに行う必要がありますが
今回のプロジェクトではアイテム数が限られているため、
この方法で実現しようと思います。

ありがとうございました。

シュウ 2008/04/24(木) 15:29:34
> 可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。

対象が海外も含まれており、いまだに2000も現役なもので。。。

古いスレッドには追加発言できません。