> Все примеры, которые я нашёл, в написаны для Delphi. Там > проблем нет – событие Owner Draw и т.д. > > А как то же самое сделать в C++ на API? Предполагаю, что > нужно использовать саблклассинг окон, но дальше этого > предположения пока не продвинулся.
Если УЖ ОЧЕНЬ не хочется использовать MFC (интересно почему?), то просто поставить в сабклассе обработчик на WM_NOTIFY/NM_CUSTOMDRAW. В обработчике первым делом сделать
А дальше все как в первой ссылке (которая lvcustomdraw.aspx)
> Если перехватывать сообщение WM_PAINT, то получается нужно > на себя всю отрисовку брать. Есть ли какое-нибудь WM_XXX > сообщение, которое возвращает координаты региона, на > который установлен курсор?
OnPaint перехватывать не надо. Common control-ы отрисовывают каждый айтем через нотификации.
Все примеры, которые я нашёл, в написаны для Delphi. Там проблем нет – событие Owner Draw и т.д.
А как то же самое сделать в C++ на API? Предполагаю, что нужно использовать саблклассинг окон, но дальше этого предположения пока не продвинулся.
Если перехватывать сообщение WM_PAINT, то получается нужно на себя всю отрисовку брать. Есть ли какое-нибудь WM_XXX сообщение, которое возвращает координаты региона, на который установлен курсор?
[Win32] Во первых использовать MFC17.07.08 10:00 Автор: amirul <Serge> Статус: The Elderman
> Все примеры, которые я нашёл, в написаны для Delphi. Там > проблем нет – событие Owner Draw и т.д. > > А как то же самое сделать в C++ на API? Предполагаю, что > нужно использовать саблклассинг окон, но дальше этого > предположения пока не продвинулся.
Если УЖ ОЧЕНЬ не хочется использовать MFC (интересно почему?), то просто поставить в сабклассе обработчик на WM_NOTIFY/NM_CUSTOMDRAW. В обработчике первым делом сделать
А дальше все как в первой ссылке (которая lvcustomdraw.aspx)
> Если перехватывать сообщение WM_PAINT, то получается нужно > на себя всю отрисовку брать. Есть ли какое-нибудь WM_XXX > сообщение, которое возвращает координаты региона, на > который установлен курсор?
OnPaint перехватывать не надо. Common control-ы отрисовывают каждый айтем через нотификации.
Да, мне уж очень не хочется использовать mfc. я понимаю, что...17.07.08 12:56 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Да, мне УЖ ОЧЕНЬ не хочется использовать MFC. Я понимаю, что здесь его использование было бы целесообразным, но хочется чистое API.
Вставил эти сообщения в сабкласс. Перемещаюсь по строкам ListBox’а, а от него 0 реакции (Ставлю брекпоинт на строчку с break). Вот мой код. В чём косяк?
Ну а всё-таки, из-за чего WM_NOTIFY может не приходить? Я пробовал окно и в ресурсах и через CreateWindow создавать, но ни на него, ни на WM_COMMAND, оно в сабклассе не реагирует, хотя корректно загружается (например, на WM_LBUTTONDOWB реагирует исправно).
Список “Listbox” создаю со стилем LBS_NOTIFY, но на мышь и клавиатуру ноль реакции.
Wm_notify - оно к тебе и не придет никогда18.07.08 17:23 Автор: Neznaika <Alex> Статус: Member
> Оно придет к родительскому окну твоего ListBox'a. А я и не заметил, что это wndproc самого контрола. Ну да, в документации английским по белому написано, что WM_NOTIFY коммон контролы посылают родительскому окну (в данном случае диалогу).
Т.е. с сабклассингом заморачиваться ненужно? В главном окне...21.07.08 06:19 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Т.е. с сабклассингом заморачиваться ненужно? В главном окне достаточно по событию NM_CUSTOMDRAW вмешаться в отрисовку контрола?
Получается сценарий такой:
1. ListBox отрисовывает текст своим цветом, уведомляет об этом главное окно через NM_CUSTOMDRAW
2. Я при обработке считываю этот текст, ставлю свой текст и вывожу обратно
Правильно?
Заморачиваться не нужно21.07.08 10:34 Автор: amirul <Serge> Статус: The Elderman
> Т.е. с сабклассингом заморачиваться ненужно? В главном окне > достаточно по событию NM_CUSTOMDRAW вмешаться в отрисовку > контрола? > > Получается сценарий такой: > 1. ListBox отрисовывает текст своим цветом, уведомляет об > этом главное окно через NM_CUSTOMDRAW
Нет, он ничего не рисует, пока ты не обработаешь и не вернешь CDRF_DODEFAULT. Возвращать надо через SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) непосредственно перед return TRUE (это я на всякий случай - для тех, кто MSDN не читает, а ты как вижу не читаешь :-) )
> 2. Я при обработке считываю этот текст, ставлю свой текст и > вывожу обратно
Ты рисуешь в DC все что душа пожелает и возвращаешь статус, что рисовать уже ничего не надо (никакой дефолтной обработки).
> Правильно?
Нет
Я там выше по ветке статьи давал. Там хоть и MFC, но MFC занимается только доставкой сообщений, сами же обработчики почти один в один.
Спасибо за просвещение. Извините за тупость, но вот ещё один...22.07.08 14:31 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Спасибо за просвещение. Извините за тупость, но вот ещё один вопрос.
В родительском окне ListBox’а ставлю обработчик WM_NOTIFY, но при манипуляции с этим ListBox’ом управление в WM_NOTIFY не передаётся.
Сначала думал, что нужно стиль LBS_NOTIFY для окна задать, но потом прочитал, что в этом случае он некоторые сообщения через WM_COMMAND возвращать будет и всё.
Также пробовал добавлять LBS_OWNERDRAWFIXED. В этом случае контент ListBox’а не отрисовывается, но WM_NOTIFY по-прежнему не приходит.
Vedrus, я вот давно пытаюсь тебе внушить мысль юзать в скорбных случаях spy++ от Microsoft. Ты почему его не уважаешь? ;-)23.07.08 07:31 Автор: HandleX <Александр М.> Статус: The Elderman
> Спасибо за просвещение. Извините за тупость, но вот ещё > один вопрос. > В родительском окне ListBox’а ставлю обработчик WM_NOTIFY, > но при манипуляции с этим ListBox’ом управление в WM_NOTIFY > не передаётся.
У меня телепатор плохо настроен. Бери MFC, тебе VS сама покажет список нотификейшенов и сообщений, которое может обработать каждое окно
> Сначала думал, что нужно стиль LBS_NOTIFY для окна задать, > но потом прочитал, что в этом случае он некоторые сообщения > через WM_COMMAND возвращать будет и всё.
Это обычное окно и обычные сообщения ходят к нему обычным образом. Все что не описано в MSDN не существует (к примеру листбокс не будет нотифицировать родительское окно о смене размера или перемещении или изменении селекшена, хотя с последним я не уверен - надо читать доки, но предлагаю все таки это сделать тебе :-) ).
> Также пробовал добавлять LBS_OWNERDRAWFIXED. В этом случае > контент ListBox’а не отрисовывается, но WM_NOTIFY > по-прежнему не приходит.
Блин, я шутил насчет того, что ты не читаешь MSDN, но ты его ДЕЙСТВИТЕЛЬНО НЕ ЧИТАЕШЬ (интересно по тем же причинам, по которым очень не хочется использовать MFC?).
Цытато:
LBS_OWNERDRAWFIXED
Specifies that the owner of the list box is responsible for drawing its contents and that the items in the list box are the same height. The owner window receives a WM_MEASUREITEM message when the list box is created and a WM_DRAWITEM message when a visual aspect of the list box has changed.
Совершенно другая степь. Ну почитай же ты MSDN и семплы. Ну пожалуйтса. Ну очень тебя прошу.
Те примеры, что ты привёл написаны для ListView, а мне нужен...23.07.08 03:58 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Те примеры, что ты привёл написаны для ListView, а мне нужен ListBox.
В MSDN есть список контролов, для которых поддерживается WM_NOTIFY. ListBox'а среди них нет.
Листбокс это тоже принципиально? По виду то он от listview-а не отличается.23.07.08 06:47 Автор: amirul <Serge> Статус: The Elderman
> Те примеры, что ты привёл написаны для ListView, а мне > нужен ListBox. > В MSDN есть список контролов, для которых поддерживается > WM_NOTIFY. ListBox'а среди них нет.
Да, нотификейшены шлют common control-ы (которые comctl32.dll), а листбокс - это нативный win32 контрол (как кнопка, чекбокс и т.д.) он действительно рисуется совершенно не так. Но на codeproject есть примеры и для бокса:
http://www.codeproject.com/KB/combobox/
> Нет, он ничего не рисует, пока ты не обработаешь и не > вернешь CDRF_DODEFAULT. Возвращать надо через > SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) > непосредственно перед return TRUE > Ты рисуешь в DC все что душа пожелает и возвращаешь статус, > что рисовать уже ничего не надо (никакой дефолтной > обработки).
Этого даже я не знал. В мануалах подробно пишется что можно, и нужно делать, но никогда непишется - зачем, и что будет, если этого не сделать.
Потому, не набив себе шишек методом научного тыка, мануалы читать абсолютно бесполезно. Да лопнут от икоты все, кто пишет такие мануалы!!!