リストビューの表示ボタン、何故初期値がラージアイコンなのかわかりません。

[戻る]
きみお 2005/05/22(日) 09:06:58
VC++6.0 MFC windowsxp sp1

以下の関数はクラスウィザードで自動さくせいされた。
ビュークラスの関数です。
そこで疑問が一つあります。
このプログラムを立ち上げると最初の初期表示は
ラージアイコン(LVS_ICON)表示になっています。
これを詳細表示のLVS_LISTにしたいのですが、
どうも上手くいきません。
初期値(LVS_ICON)は何処で設定しているのでしょうか?
誰か教えてください。




BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

    ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, 
OnUpdateViewStyles)
    ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, 
OnViewStyle)
END_MESSAGE_MAP()


void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI)
{
    // TODO: このコードを変更・拡張して、 View メニューの選択を処理する
    // ようにしてください。

    CxxxxView* pView = GetRightPane(); 

    // もし右側のペインが作成されないかビューではないなら、
    // この範囲でコマンドを無効にします

    if (pView == NULL)
        pCmdUI->Enable(FALSE);
    else
    {
        DWORD dwStyle = pView->GetStyle() & LVS_TYPEMASK;

        // もしコマンドが ID_VIEW_LINEUP ならば、 LVS_ICON or 
LVS_SMALLICON 
        // モードになった場合だけ、このコマンドを有効にします

        if (pCmdUI->m_nID == ID_VIEW_LINEUP)
        {
            if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON)
                pCmdUI->Enable();
            else
                pCmdUI->Enable(FALSE);
        }
        else
        {
            // そうでなければ、ドットを使ってビューのスタイルを
反映します
            pCmdUI->Enable();
            BOOL bChecked = FALSE;

            switch (pCmdUI->m_nID)
            {
            case ID_VIEW_DETAILS:
                bChecked = (dwStyle == LVS_REPORT);
                break;

            case ID_VIEW_SMALLICON:
                bChecked = (dwStyle == LVS_SMALLICON);
                break;

            case ID_VIEW_LARGEICON:
                bChecked = (dwStyle == LVS_ICON);
                break;

            case ID_VIEW_LIST:
                bChecked = (dwStyle == LVS_LIST);
                break;

            default:
                bChecked = FALSE;
                break;
            }

            pCmdUI->SetRadio(bChecked ? 1 : 0);
        }
    }
}

void CMainFrame::OnViewStyle(UINT nCommandID)
{
    // TODO: このコードを変更・拡張して、 View メニューの選択を処理する
    // ようにしてください。
    CXXXXView* pView = GetRightPane();

    // もし右側のペインが作成されて CCADExplorerView ならば 、
    // メニュー コマンドを処理します
    if (pView != NULL)
    {
        DWORD dwStyle = -1;

        switch (nCommandID)
        {
        case ID_VIEW_LINEUP:
            {
                // リスト コントロールのアイコンをグリッド
位置に合わせます
                CListCtrl& refListCtrl = pView->GetListCtrl
();
                refListCtrl.Arrange(LVA_SNAPTOGRID);
            }
            break;

        // 他のコマンドはリスト コントロールのスタイルを変更します
        case ID_VIEW_DETAILS:
            dwStyle = LVS_REPORT;
            break;

        case ID_VIEW_SMALLICON:
            dwStyle = LVS_SMALLICON;
            break;

        case ID_VIEW_LARGEICON:
            dwStyle = LVS_ICON;
            break;

        case ID_VIEW_LIST:
            dwStyle = LVS_LIST;
            break;
        }

        // スタイル変更; ウィンドウは自動的に再描画します
        if (dwStyle != -1)
            pView->ModifyStyle(LVS_TYPEMASK, dwStyle);
    }
}

シャノン 2005/05/22(日) 10:53:25
質問が不適切かと思われます。
「なぜラージアイコンなの?」と聞かれれば「Microsoft がそう決めたから」くらいの
答えようしかないのではないでしょうか。

まぁ、ラージアイコンスタイル(LVS_ICON)は値が 0 なので、スタイルビットとして
は、他のどれも設定されていない場合の規定値ということになるのかもしれませんが。

そうではなく、「初期値を詳細表示にしたいのですが上手くいきません。どうしたらい
いでしょうか?」のような質問のほうが適切ではないでしょうか。

で、回答です。
「なぜ詳細表示にならないの?」という質問については「してないから」です。
「規定値がラージアイコンなのはおかしい」といくら言ったところで、それを変えるこ
とはできませんから、自分で詳細表示にしてやらなければ、詳細表示にはなりません。
上のコードには、そのためのコードが含まれていません。
(このコードは、ユーザが「表示」メニューをクリックしたときに表示方法を変えるコ
ードなので、クリックしなければ変わりません)

「詳細表示にするにはどうしたらいいの?」という質問については…
まず、詳細表示にするのはビューですから、コードを貼る場所が違います。これはフレ
ームのコードですよね。
ビューが作成される前に PreCreateWindow が呼ばれます。この中で CREATESTRUCT 構造
体の面罵を書き換えれば、ウィンドウが作成される前に、そのウィンドウのスタイルを
変えることができます。

というわけで答えは「View の PreCreateWindow 、スタイルを適切に設定してくださ
い」となりますか。

シャノン 2005/05/22(日) 10:54:34
誤字。よくやるんだこれ。

> この中で CREATESTRUCT 構造体の面罵を書き換えれば、

面罵 → メンバ

高志 2005/05/22(日) 11:19:33
シャノンさんありがとうございました。
無事できました。

BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs)
{

    cs.style |= (LVS_REPORT | LVS_SHOWSELALWAYS ); 

    return CListView::PreCreateWindow(cs);
}

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