Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 09.12.2016, 11:38   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 483
Репутация: 101
По умолчанию Добавить или убрать стили ListBox

Здравствуйте.
В ходе выполнения программы, нужно у ListBox'а убрать или добавить ему стиль LBS_OWNERDRAWVARIABLE / LBS_OWNERDRAWFIXED / LBS_NOTIFY.
Код:

procedure SetStyle(Handle : hwnd; NewStyle: Cardinal);
begin
    SetWindowLong(Handle,GWL_STYLE, NewStyle);
    SetWindowPos(Handle,0,0,0,0,0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or
                   SWP_FRAMECHANGED);
end;

fStyle := WS_CHILD OR WS_VISIBLE;
      lb := CreateWindowEx(fStyleEx, 'Listbox','',
                  fStyle or WS_VSCROLL or LBS_HASSTRINGS or LBS_NOTIFY,
                               0,0,fWidth,fHeight,
                               fControlWindow,0, HInstance, nil);

// по кнопке						
SetStyle(lb, WS_CHILD OR WS_VISIBLE OR WS_VSCROLL OR LBS_HASSTRINGS OR LBS_NOTIFY OR LBS_OWNERDRAWVARIABLE);

Но это не работает. WM_DRAWITEM не начинает приходить.
И так же LBS_NOTIFY. Если не указать его при создании листбокса, то уведомления не приходят.
И наоборот. Если создать листбокс с нужными стилями, а потом убрать их, то уведомления не перестанут приходить.
BLACK_RAIN вне форума   Ответить с цитированием
Старый 09.12.2016, 12:01   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,134
Репутация: 1564
По умолчанию

Во первых зачем это вообще нужно? Раз уж один раз сделали рисовалку так и рисуйте...

А раз уж так надо, то сделайте два листбокса и прячьте ненужный.
waleri вне форума   Ответить с цитированием
Старый 09.12.2016, 12:27   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 483
Репутация: 101
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Во первых зачем это вообще нужно?
Завернуть ListBox в класс, сделать свойство что-то типа OwnDraw:boolean.
Чтобы потом просто
Код:

lb1 := win32ListBox.Create(owner);
lb1.Add('string 666');
lb1.OwnDraw := true;
lb2 := win32ListBox.Create(owner);
lb2.OwnDraw := false;

Скажете - извращение? Не думаю. Я уже пишу прогу на этом принципе и всё вполне сносно работает.
Но встала вышеописанная проблема. В общем, это не критично. Но разве нельзя изменять эти стили уже после создания контрола? VCL же это умеет вроде (могу ошибаться).
BLACK_RAIN вне форума   Ответить с цитированием
Старый 10.12.2016, 00:41   #4
EUGY
Участник клуба
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Адрес: Мурманск
Сообщений: 913
Репутация: 132
По умолчанию

Можно ваще написать свой листбокс с нуля. И тогда в нем Вы хозяин.
А если берете готовый, то в вашем методе OwnDraw не трудно окно выгрузить, и загрузить по-новой с нужными стилями. Да, придется временно сохранить данные листбокса, но мы же программисты...
EUGY вне форума   Ответить с цитированием
Старый 10.12.2016, 11:14   #5
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,134
Репутация: 1564
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
сделать свойство что-то типа OwnDraw:boolean.
Хорошо, будем как в детском садике - а зачем нужно делать свойство OwnDraw? Единожды сделав прорисовку в чем смысл ее отключения?
waleri вне форума   Ответить с цитированием
Старый 10.12.2016, 11:47   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 483
Репутация: 101
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
а зачем нужно делать свойство OwnDraw? Единожды сделав прорисовку в чем смысл ее отключения?
Чтобы у одного экземпляра она была, а у другого не было. Ну раз нельзя эти стили менять, тогда просто переделаю конструктор класса.

Цитата:
Сообщение от EUGY Посмотреть сообщение
А если берете готовый, то в вашем методе OwnDraw не трудно окно выгрузить, и загрузить по-новой с нужными стилями. Да, придется временно сохранить данные листбокса, но мы же программисты...
ага, и тратить кучу времени на копирование строк.
BLACK_RAIN вне форума   Ответить с цитированием
Старый 10.12.2016, 12:30   #7
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,134
Репутация: 1564
По умолчанию

Ааа, вот оно что...
Ну так создавайте всегда со стилем LBS_OWNERDRAWFIXED а обработчик вызывайте только если установлен OwnDraw, если не установлен рисуйте "стандартно".
Но действительно будет проще изменить конструктор...
waleri вне форума   Ответить с цитированием
Старый 10.12.2016, 12:33   #8
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,679
Репутация: 5909
По умолчанию

Динамическое изменение не каждого стиля даст ожидаемый результат. Можно получить большой облом
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 10.12.2016, 12:37   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 483
Репутация: 101
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Динамическое изменение не каждого стиля даст ожидаемый результат. Можно получить большой облом
например, какие стили?
BLACK_RAIN вне форума   Ответить с цитированием
Старый 10.12.2016, 12:40   #10
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,679
Репутация: 5909
По умолчанию

Не скажу. Просто как-то тоже сталкивался, но давно, не помню ситуацию. Можно в исходниках того же делфи покопаться на счет использования SetWindowLong
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.12.2016 в 12:43.
Аватар вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные стили в одной строке ListBox rota Общие вопросы Delphi 14 26.02.2012 21:48
Добавить/убрать раскладку Stilet Win Api 5 20.07.2011 11:35
как добавить в listbox файлы(пишу с помощью bassplayer)(Listbox+opendialog=play) blackstersl Общие вопросы Delphi 11 09.06.2010 13:23
Чем отличаются стили listBox'a? TwiX Общие вопросы Delphi 2 14.11.2009 02:40
Как в RichView убрать стили? KurtWagner Компоненты Delphi 2 05.02.2009 11:43




09:45.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru