powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по ListView
8 сообщений из 8, страница 1 из 1
Вопрос по ListView
    #32846432
Feon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста
есть список
есть выбранный элемент списка(слева стоит галочка)
если галочку снимаю, получаю WM_NOTIFY и новое состояние LVIS_FOCUSED|LVIS_SELECTED
но если просто выделить этот элемент - получаю тоже самое (а галка не снята)
а мне нужно определить либо просто выделен, либо галка снята
как это определить спомощью WM_NOTIFY?
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32846537
MKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не содержится в сообщении. Оно извещает только о том что что-то изменилось. Чтобы узнать, что сейчас с галкой, нужно просмотрь на состояние элемента. Для этого есть много вариантов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
MFC: 
BOOL CListCtrl::GetCheck(int nItem)
WTL: 
BOOL CListViewCtrl::GetCheckState(int nItem)
WINAPI:
BOOL ListView_GetCheckState(HWND hWndLV,    UINT nItem)
или:
BOOL(((UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, LVIS_STATEIMAGEMASK) >>  12 ) -  1 )
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32846684
MKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, ошибочка:

автор
Это не содержится в сообщении. Оно извещает только о том что что-то изменилось.


Cодержит, можно месадж не слать. Tам в LPARAM сидит

Код: plaintext
LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam;

и можно вычислить

BOOL bChecked = (lpnmv->uNewState >> 12) - 1;
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32846959
Feon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ListView_GetCheckState(pnmv->hdr.hwndFrom, pnmv->iItem);
возвращает -1
что же не правильно?
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32846971
Guest?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
должно быть ничего не выбрано ;)
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32847272
MKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feon
Вы наверное LVN_ITEMCHANGING ловите а не LVN_ITEMCHANGED. Тогда учтите что когда Вы только добавляете айтемы, оно тоже к Вам придет, но ListView_GetCheckState обломается, т.к. такого айтема еще нету в LV (В момент когда Вы заполняете свой LV) . Предпримите что-нибудь чтобы этот особый случай не учитывать.

Например, выходите из обработчика если не закончена начальная загрузка LV данными. Или если Вам все равно и Вы не хотите отменять изменения то перейдите на LVN_ITEMCHANGED.
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32847615
agfeonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлавливаю именно LVN_ITEMCHANGED
------------------------------
if( uMsg == WM_NOTIFY )
{
NMLISTVIEW* pnmv = (NM_LISTVIEW FAR *) lParam;

//LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam;
//BOOL bChecked = (lpnmv->uNewState >> 12) - 1;
if(pnmv->hdr.code == LVN_ITEMCHANGED)
{
BOOL w_w = ListView_GetCheckState(pnmv->hdr.hwndFrom, pnmv->iItem);
-------------------------------
w_w равно -1 стоит галка или нет
не пойму в чем дело
может хендл не тот?
но я посылаю месадж тому окну, от которого пришло LVN_ITEMCHANGED
дело в том, что я контролирую сообщения главному род. окну
ведь LVN_ITEMCHANGED приходит от LV?, в род. окно?
и мне нужно вычислить тот момент, когда снимается галка
вот
...
Рейтинг: 0 / 0
Вопрос по ListView
    #32848215
iMKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
agfeonov
В родительское окно, от LV, но от всех LV и вообще от всех чилдренов. А Вы почему-то не проверяете явно от кого WM_NOTIFY пришел. Вы проверяете только hdr.code, а может быть (зависит от Вашего случая) нужно еще проверить hdr.hwndFrom или hdr.idFrom. Ведь у Вас там поди несколько лист вью? И не все с чекбоксами, и тогда получается ошибка в том что у того кому вы шлете месадж LVS_EX_CHECKBOXES не выставлен. И к тому же не уверен что константа LVN_ITEMCHANGED не может случайно совпасть с каким то другим кодом (например в случае если Вы сами какой код неосторожно придумали и шлете нотифаем). Вобщем может быть причин много а вывод - проверьте, от того ли чилда пришло, который LV c чекбоксами


Ну и еще с целью структуризации кода, снижения мелкобажности, может быть имеет смысл разбить обработку WM_NOTIFY на несколько функций, перенести эти проверки на карту сообщений и тд, если нет противопоказаний и к тому же Вы используете стандартную библиотеку где такие средства уже есть
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по ListView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]