ListView - в run-time не меняется вид списка (Report, Icon..
От: fedko Россия  
Дата: 02.07.03 08:23
Оценка:
Проблема: При создании ListView устанвливается некоторый вид (Detail, List, Large icons, Small icons)
После создания пытаюсь его изменить, стиль окна меняется (проверено в Spy++), а окно остаётся прежним.
Код взят из Wizard к Visual C++.

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

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

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

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

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

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



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

Вопросы:
Как это вылечить?
И проблема ли это именно Win2000 или VC7 или их комбинации? (К сожалению уже потер VC6 и проверить не могу).
Если вы попробовали сделать как я написал и у вас работает, plz, напишите вашу конфигурацию (версию VC, SDK, Windows, Сервис паков)
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);
    }
}
- Искренне ваш, Поросенок Пафнутий
Re: Забыл добавить ещё один важный момент
От: Федько Олег Россия  
Дата: 02.07.03 11:38
Оценка:
Если у Вас всё работает посмотрите какая версия comctl32.dll (от каких Windows и IE), т.к. я
чувствую что проблема не в VC.NET.

У меня comctl32.dll
Product Version = 5.50.4704.1100
File Version = 5.81.4704.1100

По идее он от Internet Explorer 6

===============================

Метод, описаный в MSDN:
You can change the view type after you create a list-view control. To retrieve and change the window style, use the GetWindowLong and SetWindowLong functions. To determine the window styles of the current view, use the LVS_TYPEMASK value.
я пробывал.
Re[2]: Забыл добавить ещё один важный момент
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 02.07.03 11:49
Оценка:
Здравствуйте, Федько Олег, Вы писали:

ФО>Если у Вас всё работает посмотрите какая версия comctl32.dll (от каких Windows и IE), т.к. я

ФО>чувствую что проблема не в VC.NET.

ФО>У меня comctl32.dll

ФО>Product Version = 5.50.4704.1100
ФО>File Version = 5.81.4704.1100

ФО>По идее он от Internet Explorer 6


ФО>===============================


ФО>Метод, описаный в MSDN:

ФО>You can change the view type after you create a list-view control. To retrieve and change the window style, use the GetWindowLong and SetWindowLong functions. To determine the window styles of the current view, use the LVS_TYPEMASK value.
ФО>я пробывал.

А вот эти строчки вы вставляли:
// without next 3 lines scrolling will be incorrect
pWnd->m_listIcons.MoveWindow(0, 0, 0, 0);
pWnd->GetClientRect(&rc);
pWnd->m_listIcons.MoveWindow(&rc);


P.S.
У меня W2K Eng SP4 + IE6 SP1
comctl32.dll
Product Version = 5.50.4916.400
File Version = 5.81.4916.400

Тот кусок кода, который я привел, тестировался на W2K SP2.
- Искренне ваш, Поросенок Пафнутий
Re[3]: Забыл добавить ещё один важный момент
От: Федько Олег Россия  
Дата: 02.07.03 12:19
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>А вот эти строчки вы вставляли:

SDB>
SDB>// without next 3 lines scrolling will be incorrect
pWnd->>m_listIcons.MoveWindow(0, 0, 0, 0);
pWnd->>GetClientRect(&rc);
pWnd->>m_listIcons.MoveWindow(&rc);
SDB>



Попробывал так:
// change the style; window will repaint automatically
if (dwStyle != -1)
{
      DWORD dwNewStyle = ::GetWindowLong(pView->m_hWnd, GWL_STYLE);
      dwNewStyle = (dwNewStyle & ~LVS_TYPEMASK) | dwStyle;
      ::SetWindowLong(pView->m_hWnd, GWL_STYLE, dwNewStyle);

      RECT rc;
      // pView->GetWindowRect берёт конечно не те координаты, но в данном случае это не важно.
      pView->GetWindowRect(&rc);
      pView->MoveWindow(0, 0, 0, 0);
      pView->MoveWindow(&rc);
}

всё равно не работает

SDB>P.S.

SDB>У меня W2K Eng SP4 + IE6 SP1
SDB>comctl32.dll
SDB>Product Version = 5.50.4916.400
SDB>File Version = 5.81.4916.400

SDB>Тот кусок кода, который я привел, тестировался на W2K SP2.


=====================

Сейчас попробывал создать обычный диалог, а в нём CListCtrl — тут работает!!!
Попробывал создать Single Document — не Explorer style с CListView — и тут работает!!!
А в Explorer style НЕ РАБОТАЕТ!!! Может дело в CSplitterWnd?
Re: Решение проблемы
От: Федько Олег Россия  
Дата: 02.07.03 12:52
Оценка:
Сам же случайно и нашёл в чём проблема:

VC-шный визард по умолчанию в сгенерированном View (который растёт от ListView)
перелавливает WM_STYLECHANGED при помощи объявления пустой функции:
afx_msg void OnStyleChanged(...);
void ...View::OnStyleChanged(int /*nStyleType*/, LPSTYLESTRUCT /*lpStyleStruct*/)
{
  // ничего не делает
}


Если в этой функции вызвать CListView::OnStyleChanged(), или её убрать вообще то всё заработает.

Интересно, они когда визарды делают, их тестируют?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.