Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2012, 15:58   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Блин, у меня интернет на 4 дня вырубили.
возникла проблемма с щелчками мыши.
NM_CLICK / NM_RCLICK обрабатываются, только если нажать и отпустить кнопку, не сдвинув курсор мыши. А мне надо, чтобы обработка происходила сразу при WM_LBUTTONDOWN и при нажатии стрелок на клавиатуре (как в Utorrent'e).
пытался принимать сообщение LVN_ITEMACTIVATE, но оно приходит только при двойном щелчке или при нажатии на ENTER.
Сообщение LVN_ITEMCHANGED приходит по нескольку раз подряд, что очень неприемлимо.
подозреваю, что надо создать для Листвью отдельную процедуру и принимать сообщения WM_LBUTTONDOWN и WM_KEYDOWN.
если да, то как в таком случае их обрабатывать? Нужно узнать Item+SubItem,по которым я щелкнул.
для WM_KEYDOWN узнать только Item.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.04.2012, 02:33   #12
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
пытался принимать сообщение LVN_ITEMACTIVATE, но оно приходит только при двойном щелчке или при нажатии на ENTER.
Неправда. Прекрасно оно приходит при одиночном щелчке и при перемещении стрелками. Если стиль LVS_EX_ONECLICKACTIVATE включен для контрола.

Цитата:
Сообщение LVN_ITEMCHANGED приходит по нескольку раз подряд, что очень неприемлимо.
Никто ж не мешает проверить, действительно ли item изменился:

Код:
// WM_NOTIFY главного окна

            LVN_ITEMCHANGED:
            begin
               // Действительно ли СМЕНИЛСЯ item?
               if (lpNm^.uOldState and LVIS_SELECTED <> LVIS_SELECTED) and
                  (lpNm^.uNewState and LVIS_SELECTED = LVIS_SELECTED)
               then // Да, изменился. Это будет работать однократно
            end;
Karpinsky вне форума Ответить с цитированием
Старый 25.04.2012, 15:29   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Karpinsky Посмотреть сообщение
Неправда. Прекрасно оно приходит при одиночном щелчке и при перемещении стрелками. Если стиль LVS_EX_ONECLICKACTIVATE включен для контрола.
c этим стилем вроде строчки начинают выделяться при наведении на них мыши. мне это не подходит.
Цитата:
Сообщение от Karpinsky Посмотреть сообщение
Никто ж не мешает проверить, действительно ли item изменился:
спасибо. теперь всё так, как задумано.
однако, я считаю, что Microsoft перемудрили с сообщениями в WM_NOTIFY.
Получается большая куча (если создать много контролов). Легко запутаться в CASE IF ELSE.
p.s. Забыл еще вот что:
как отсортировать все элементы в трех колонках так, чтобы сохранить их зависимость друг от друга?
это делается вручную или Листвью может это сделать сам? Опять же "как в Utorrent'е"
если автоматически, то как именно?
если вручную, то как правильно задать поиск по форуму?
p.p.s. В Utorrent'e информация в Листвью обновляется по таймеру, что усложняет сортировку. А мне надо просто один раз отсортировать и всё.

Последний раз редактировалось BLACK_RAIN; 25.04.2012 в 16:32.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.04.2012, 20:25   #14
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
Получается большая куча (если создать много контролов). Легко запутаться в CASE IF ELSE.
Не делай всю работу в оконной функции, выноси в отдельные процедуры/функции.

Цитата:
как отсортировать все элементы в трех колонках так, чтобы сохранить их зависимость друг от друга?
Это зависит от того, как ты эти данные добавлял и как отображаешь. Если использовал "грубый" способ с добавлением через ListView_InsertItem, когда в поле LV_ITEM.pszText хранится собственно указатель на текст - то сам себе Буратино. Я использую другой метод: в pszText заталкиваю LPSTR_TEXTCALLBACK, реальные данные храню где-то в другом месте, а в поле LV_ITEM.lParam заношу указатель на данные для этой строки листвью. Тогда для отображения данных нужно ловить LVN_GETDISPINFO, и по индексу iSubItem-а уже разруливаю, что именно отображать в данный момент.

Зато и сортировка делается элементарно: вызывается ListView_SortItems с функцией сравнения, которая получает 2 указателя на реальные данные. В соответствии с необходимостью, возвращается результат -1, 0 или 1 (определяющий, будут ли меняться эти 2 элемента местами), и при следующей отрисовке ListView будет работать уже с новым порядком строк.

Если надо - потом набросаю пример, но это будет не раньше конца следующей недели, из-под Debian-а приложения на WinAPI не очень просто писать
Karpinsky вне форума Ответить с цитированием
Старый 26.04.2012, 10:01   #15
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Karpinsky Посмотреть сообщение
Если надо - потом набросаю пример
да, было бы неплохо увидеть код.
а то, на словах такие замуты не особо понятны.
мне не срочно. в любое время.
нашел еще траблу:
надо программно изменить выбранную строку. (Выделить n-ную строку).
LVM_SETSELECTIONMARK меняет только индекс, а выделенная строка не меняется.
Код:
  n := 5;
  sendmessage(lv_parent,LVM_SETSELECTIONMARK,0,n);
что опять не так?

Последний раз редактировалось BLACK_RAIN; 26.04.2012 в 10:46.
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.04.2012, 13:35   #16
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
что опять не так?
Описание LVM_SETSELECTIONMARK читал? это тот айтем, с которого начинается множественное выделение. Чтоб выделить один элемент - достаточно
Код:
n := 5;
ListView_SetItemState(lv_parent, n, 
   LVIS_SELECTED or LVIS_FOCUSED, LVIS_SELECTED or LVIS_FOCUSED);
и (если lv_parent теряет фокус при установке, скажем, выделение айтема по нажатию кнопки) установить фокус на lv_parent либо LVS_SHOWSELALWAYS при создании ListView...

В общем, вот, набросал тут программку, должно работать, попробуй, я не компилировал, если что не так - говори.
Вложения
Тип файла: zip WinHello.zip (3.4 Кб, 21 просмотров)
Karpinsky вне форума Ответить с цитированием
Старый 26.04.2012, 13:49   #17
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Karpinsky Посмотреть сообщение
В общем, вот, набросал тут программку, должно работать, попробуй, я не компилировал, если что не так - говори.
ага, спасибо.
на выходных попробую разобраться.
напишу, если что.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.05.2012, 14:54   #18
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от MSDN
cxMin

Type: int

Windows Vista. Minimum width of the column in pixels.
А для Windows XP как-нибудь можно?
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов phphel Общие вопросы Delphi 19 30.01.2011 21:24
несколько вопросов по C Horus92 Общие вопросы C/C++ 2 15.11.2009 16:08
БД - Несколько вопросов lutdan БД в Delphi 3 11.10.2009 20:22
Несколько Вопросов Дорст Общие вопросы Delphi 3 12.11.2007 09:18