CListCtrlのラベルの幅を変更したい – プログラミング – Home

CListCtrlのラベルの幅を変更し...
 
通知
すべてクリア

[解決済] CListCtrlのラベルの幅を変更したい


シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

WinXP SP2 + VisualStudio.NET2003 + MFCです。

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

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

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

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

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

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

よろしくお願いします。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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

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


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

シャノンさん、返事ありがとうございます。

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

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

よろしくお願いします。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

やっぱりわかりません。

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


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

> これと違う結果になりますか?
> ChangeLargeImage を呼んでも、12×4+2文字になるということですか?

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

コモンコントロール v6 マニフェストを追加しないと再現しました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやるとうまくいきま
した。
 list.SetItemText( 0, 0, list.GetItemText( 0, 0 ) );
みたいに。

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。
2003 ってデフォルトでは追加されないんでしたっけ。


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

> アイコンのサイズを変えた後に、アイテムの文字列を設定しなおしてやると
> うまくいきました。

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

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


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

> 可能なら、コモンコントロール v6 マニフェストを使ったほうがいいのかな。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました