информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаПортрет посетителяАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Линуксовый ботнет, распространяющийся... 
 Конец поддержки Internet Explorer 
 Рекордное число уязвимостей в 2021 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
А-а-а. 18.07.08 21:03  Число просмотров: 1320
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Оно придет к родительскому окну твоего ListBox'a.
А я и не заметил, что это wndproc самого контрола. Ну да, в документации английским по белому написано, что WM_NOTIFY коммон контролы посылают родительскому окну (в данном случае диалогу).
<programming>
[Win32] Как на Visual C++ сделать разноцветный ListBox? 17.07.08 08:52  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Все примеры, которые я нашёл, в написаны для Delphi. Там проблем нет – событие Owner Draw и т.д.

А как то же самое сделать в C++ на API? Предполагаю, что нужно использовать саблклассинг окон, но дальше этого предположения пока не продвинулся.

Если перехватывать сообщение WM_PAINT, то получается нужно на себя всю отрисовку брать. Есть ли какое-нибудь WM_XXX сообщение, которое возвращает координаты региона, на который установлен курсор?
[Win32] Во первых использовать MFC 17.07.08 10:00  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Во вторых скачать отсюда
http://www.codeproject.com/KB/list/
подходящий класс

В третьих просто добавить его в свой проект.
Вот примеры классов:
http://www.codeproject.com/KB/list/lvcustomdraw.aspx
http://www.codeproject.com/KB/list/xlistctrl.aspx
http://www.codeproject.com/KB/list/skinlist.aspx

На любой вкус.

> Все примеры, которые я нашёл, в написаны для Delphi. Там
> проблем нет – событие Owner Draw и т.д.
>
> А как то же самое сделать в C++ на API? Предполагаю, что
> нужно использовать саблклассинг окон, но дальше этого
> предположения пока не продвинулся.

Если УЖ ОЧЕНЬ не хочется использовать MFC (интересно почему?), то просто поставить в сабклассе обработчик на WM_NOTIFY/NM_CUSTOMDRAW. В обработчике первым делом сделать

LPNMLVCUSTOMDRAW lpNMCustomDraw = (LPNMLVCUSTOMDRAW) lParam;

---

А дальше все как в первой ссылке (которая lvcustomdraw.aspx)

> Если перехватывать сообщение WM_PAINT, то получается нужно
> на себя всю отрисовку брать. Есть ли какое-нибудь WM_XXX
> сообщение, которое возвращает координаты региона, на
> который установлен курсор?

OnPaint перехватывать не надо. Common control-ы отрисовывают каждый айтем через нотификации.
Да, мне уж очень не хочется использовать mfc. я понимаю, что... 17.07.08 12:56  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Да, мне УЖ ОЧЕНЬ не хочется использовать MFC. Я понимаю, что здесь его использование было бы целесообразным, но хочется чистое API.

Вставил эти сообщения в сабкласс. Перемещаюсь по строкам ListBox’а, а от него 0 реакции (Ставлю брекпоинт на строчку с break). Вот мой код. В чём косяк?

LRESULT CALLBACK SubWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
	case NM_CUSTOMDRAW:
	case WM_NOTIFY:
		break;
    default:
        return CallWindowProc(oldProc, hwnd, msg, wParam, lParam);
    }
    return 0;
}

---
NM_xxx - это код нотификейшена 17.07.08 22:06  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Он приходит в NMHDR::code
А почему не пришел WM_NOTIFY - бог весть.
Ну а всё-таки, из-за чего wm_notify может не приходить? я... 18.07.08 05:10  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Ну а всё-таки, из-за чего WM_NOTIFY может не приходить? Я пробовал окно и в ресурсах и через CreateWindow создавать, но ни на него, ни на WM_COMMAND, оно в сабклассе не реагирует, хотя корректно загружается (например, на WM_LBUTTONDOWB реагирует исправно).

Список “Listbox” создаю со стилем LBS_NOTIFY, но на мышь и клавиатуру ноль реакции.
Wm_notify - оно к тебе и не придет никогда 18.07.08 17:23  
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Оно придет к родительскому окну твоего ListBox'a.
А-а-а. 18.07.08 21:03  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Оно придет к родительскому окну твоего 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
<"чистая" ссылка> <обсуждение закрыто>
Ну кажется тебе, что контролы что-то там не шлют, ну загрузи ты Spy++ и ПОСМОТРИ, в конце концов! Он же ИДЁТ В СОСТАВЕ Visual Studio!!!

Скоро начну ругаться, блин -))
Какие манипуляции, какое управление? 22.07.08 22:28  
Автор: amirul <Serge> Статус: 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/

Вот например
http://www.codeproject.com/KB/combobox/listboxexByEricSanchez.aspx

Тот же случай.
Бекграунд выбираем в wm_ctlcolor, айтемы рисуем в wm_drawitem, бордюр (со скроллами) - в wm_ncpaint

В общем читай статью.
amirul, спасибо. вариант с wm_drawitem подошёл. всё... 24.07.08 07:25  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
amirul, спасибо. Вариант с WM_DRAWITEM подошёл. Всё работает.
HandleX, учту.
Хорошо объяснил! 22.07.08 04:17  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>

> Нет, он ничего не рисует, пока ты не обработаешь и не
> вернешь CDRF_DODEFAULT. Возвращать надо через
> SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult)
> непосредственно перед return TRUE > Ты рисуешь в DC все что душа пожелает и возвращаешь статус,
> что рисовать уже ничего не надо (никакой дефолтной
> обработки).

Этого даже я не знал. В мануалах подробно пишется что можно, и нужно делать, но никогда непишется - зачем, и что будет, если этого не сделать.

Потому, не набив себе шишек методом научного тыка, мануалы читать абсолютно бесполезно. Да лопнут от икоты все, кто пишет такие мануалы!!!
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach