VC++6.0 MFC WinXp sp2
CListViewで選択しているアイテムを切り替え(反転)を行いたいのですが、
何故か文字列部分は切り替わるのですが、イメージ(アイコン)部分は切り替わりません。
アイコン表示の時は上手くいきますが、
レポート(詳細モード)の場合は上手くいきません。
何が間違っているのでしょうか。
// 選択の切り換え処理
CListCtrl& ListCtrl = GetListCtrl();
for(int i = 0; i<ListCtrl.GetItemCount(); i++){
// 状態を取得
if( ListCtrl.GetItemState(i, LVIS_SELECTED) == FALSE ){
ListCtrl.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);// 選択状態
}else{
ListCtrl.SetItemState(i, 0, LVIS_SELECTED);// 選択解除
}
}
エクスプローラでも、リストにフォーカスがない状態で
項目を選択すると同じようにアイコンに色がつかないですね。
バグじゃないでしょうか。
というわけで、切り替え処理の前に、
ListCtrl.SetFocus();
としてみるとよいようです。(WinXP)
dairygoods さん
回答ありがとうございます。
これは仮想リストビューに変更してから、おかしくなりました。
下記の記述にオカシイ箇所がありましたら、指摘してください。
void CCADExplorerView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
int iItemIndex= pItem->iItem;
// 文字を設定
if( pDispInfo->item.mask & LVIF_TEXT ){
// ファイルサイズを取得を文字列に変更
char FileSize[256] = { };
int Size = m_DLNameInfoList[iItemIndex].FileSize / 1000;
// 3桁区切りでカンマを挿入
char AddkanmaFileSize[256] = ;
IntToCommaSeparateString( AddkanmaFileSize , Size);
sprintf(FileSize, %s KB, AddkanmaFileSize);
// ファイルの更新日時を取得
CString FileTime;
FileTime.Format(%04d/%02d/%02d %02d:%02d,
m_DLNameInfoList
[iItemIndex].FileStatus.m_mtime.GetYear(),
m_DLNameInfoList
[iItemIndex].FileStatus.m_mtime.GetMonth(),
m_DLNameInfoList
[iItemIndex].FileStatus.m_mtime.GetDay(),
m_DLNameInfoList
[iItemIndex].FileStatus.m_mtime.GetHour(),
m_DLNameInfoList
[iItemIndex].FileStatus.m_mtime.GetMinute() );
// フォルダモード
switch( pDispInfo->item.iSubItem )
{
case 0 :
strcpy( pDispInfo->item.pszText,
m_DLNameInfoList[iItemIndex].FileName ) ;
break ;
case 1 :
strcpy( pDispInfo->item.pszText,
FileSize ) ;
break ;
case 2 :
strcpy( pDispInfo->item.pszText,
m_DLNameInfoList[iItemIndex].FileExt ) ;
break ;
case 3 :
strcpy( pDispInfo->item.pszText,
FileTime ) ;
break ;
default :
break ;
}
}
// イメージを設定
if ( pDispInfo->item.mask & LVIF_IMAGE ) {
CString FileExt = m_DLNameInfoList[iItemIndex].FileExt;
FileExt.MakeUpper();
for(int i = 0; i < WILDCARD_NUM; i++ ){
if( FileExt == gIconExt[i] ){
pItem->iImage = i;
break;
}
}
}
*pResult = 0;
}