レポート表示の時、アイテムの切り替え処理

[戻る]
たくろ 2005/06/16(木) 20:25:22
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);// 選択解除
    }
}

dairygoods 2005/06/21(火) 12:46:35
エクスプローラでも、リストにフォーカスがない状態で
項目を選択すると同じようにアイコンに色がつかないですね。
バグじゃないでしょうか。

というわけで、切り替え処理の前に、
ListCtrl.SetFocus();
としてみるとよいようです。(WinXP)

たくろ 2005/06/21(火) 21:16:09
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;
}

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