MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCShellTreeCtrlでのフロッピーへのアクセス制限

 前回は「CMFCShellListCtrl」での方法を紹介しましたが、今回は「CMFCShellTreeCtrl」での方法を紹介したいと思います。
 基本的にはほとんど同じなのですが、アイテムの追加方法など、微妙に違うのでここで紹介します。

 まず、「CMFCShellTreeCtrl」を派生させたクラス(ここではCMyMFCShellTreeCtrl)を作り、そこで「EnumObjects」をオーバライドします。
 ヘッダファイルに以下を追加します。
    HRESULT EnumObjects(HTREEITEM hParentItem, LPSHELLFOLDER pParentFolder, LPITEMIDLIST pidlParent);
 ここでcppファイルのコードなのですが、今回の方法も、コードをすべて掲載すると結構長くなるので、変更する箇所だけ掲載していきます。
 元になるコードは、「afxshelltreectrl.cpp」内の225行目以降を改良していきます。
 「afxshelltreectrl.cpp」ファイルは、「〜Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc」以下にあります。

 まず、「afxshelltreectrl.cpp」内の225行目以降にある「EnumObjects」関数をそのまま自分の派生クラスのcppファイルにコピペします。
 以下、関数内の一番上を1行目として、変更する箇所を書いていきます。
 1行目 CMFCShellTreeCtrl → CMyMFCShellTreeCtrl
 4行目 afxShellManager → theApp.GetShellManager()
34行目 afxShellManager → theApp.GetShellManager()
 ここまでは「CMFCShellListCtrl」の場合とほぼ同じですが、ここから少し違います。
43行目以降に以下を追加、
        TCHAR szPath [MAX_PATH];
        if(SHGetPathFromIDList(pItem->pidlFQ, szPath))
        {
            if(DRIVE_REMOVABLE == GetDriveType(szPath))
            {
                tvItem.cChildren = TRUE;
                // Fill in the TV_INSERTSTRUCT structure for this item:
                TVINSERTSTRUCT tvInsert;

                tvInsert.item = tvItem;
                tvInsert.hInsertAfter = TVI_LAST;
                tvInsert.hParent = hParentItem;

                InsertItem(&tvInsert);
                dwFetched = 0;
                continue;
            }
        }
となります。

 追加部分の詳しい説明は前回のものを見てもらうとして、前回との相違点を説明すると、「tvItem.cChildren = TRUE;」とすることで、ディスプレイ名の左に"+"マークが付き、展開可能アイテムになります。
 後は、ツリーコントロールにアイテムを追加するだけです。

 「CMFCShellTreeCtrl」の場合、「CMFCShellListCtrl」の様にサイズや更新日時などを取得しないので、属性取得部分だけ回避すればいいので、比較的楽に改良できます。
ランキングへ     posted by 遠雷 | Comment(0) | コントロール
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。