Re: ListView - в run-time не меняется вид списка (Report, Ic
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 02.07.03 09:38
Оценка: 1 (1)
Здравствуйте, fedko, Вы писали:

F>Проблема: При создании ListView устанвливается некоторый вид (Detail, List, Large icons, Small icons)

F>После создания пытаюсь его изменить, стиль окна меняется (проверено в Spy++), а окно остаётся прежним.
F>Код взят из Wizard к Visual C++.

F>Система: Windows 2000, Visual C++ .NET


F>Чтобы получить такое поведение надо:

F>Создать в Visual C++ .NET новый проект -> MFC Application
F>Проект назовём к примеру Test

F>В Application Style ставим

F> Application Type = Single Document
F> Project Style = Windows Explorer
F>Остальные настройки по умолчанию.

F>В файле TestView.cpp функцию void CTestView::OnInitialUpdate() меняем на:


F>
F>void CTestView::OnInitialUpdate()
F>{
F>  CListView::OnInitialUpdate();

F>  GetListCtrl().InsertColumn(0, "Col 1");
F>  GetListCtrl().InsertItem(0, "Item 1");
F>  GetListCtrl().InsertItem(1, "Item 2");
F>}
F>



F>Запускаем программу.

F>По идее при нажатии в меню View на Large Icons, Small Icons, List и Detail должен происходить переход к нужному виду, а этого не происходит! При этом что самое интересное, если посмотреть на стиль окна (например, при помощи Spy++), то стили действительно меняются, но вид окна остаётся прежним!

F>Вопросы:

F>Как это вылечить?
F>И проблема ли это именно Win2000 или VC7 или их комбинации? (К сожалению уже потер VC6 и проверить не могу).
F>Если вы попробовали сделать как я написал и у вас работает, plz, напишите вашу конфигурацию (версию VC, SDK, Windows, Сервис паков)

На VC6 SP5 я делал так:
void CSampleApp::OnChangeView(void)
{
    RECT rc;

    static DWORD adwStyles[] = {
        LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT
    };

    CMainWnd* pWnd = DYNAMIC_DOWNCAST(CMainWnd, AfxGetMainWnd());
    const MSG* pMsg = pWnd->GetCurrentMessage();
    CMenu* pSubMenu = pWnd->GetMenu()->GetSubMenu(1);
    UINT fuState = pSubMenu->GetMenuState(LOWORD(pMsg->wParam), MF_BYCOMMAND);
    if ((fuState & MF_CHECKED) == 0) {
        int nIndex = LOWORD(pMsg->wParam) - IDM_VIEW_LARGEICONS;
        // change style as needed
        DWORD dwStyle = ::GetWindowLong(pWnd->m_listIcons, GWL_STYLE);
        dwStyle = (dwStyle & ~LVS_TYPEMASK) | adwStyles[nIndex];
        ::SetWindowLong(pWnd->m_listIcons, GWL_STYLE, dwStyle);
        // without next 3 lines scrolling will be incorrect
        pWnd->m_listIcons.MoveWindow(0, 0, 0, 0);
        pWnd->GetClientRect(&rc);
        pWnd->m_listIcons.MoveWindow(&rc);
        // adjust "View" menu
        pSubMenu->CheckMenuRadioItem(0, 3, nIndex, MF_BYPOSITION);
    }
}
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.