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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 10:38   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Добавить или убрать стили 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, 11:01   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

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

Цитата:
Сообщение от 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 вне форума Ответить с цитированием
Старый 09.12.2016, 23:41   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

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

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

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

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

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

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

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

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные стили в одной строке 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 01:40
Как в RichView убрать стили? KurtWagner Компоненты Delphi 2 05.02.2009 10:43