Проблема: При создании 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, Сервис паков)
Здравствуйте, 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);
}
}
Если у Вас всё работает посмотрите какая версия 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.
я пробывал.
Здравствуйте, Федько Олег, Вы писали:
ФО>Если у Вас всё работает посмотрите какая версия 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.
Здравствуйте, 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?
Сам же случайно и нашёл в чём проблема:
VC-шный визард по умолчанию в сгенерированном View (который растёт от ListView)
перелавливает WM_STYLECHANGED при помощи объявления пустой функции:
afx_msg void OnStyleChanged(...);
void ...View::OnStyleChanged(int /*nStyleType*/, LPSTYLESTRUCT /*lpStyleStruct*/)
{
// ничего не делает
}
Если в этой функции вызвать CListView::OnStyleChanged(), или её убрать вообще то всё заработает.
Интересно, они когда визарды делают, их тестируют?