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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2013, 09:49   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию BS_CHECKBOX с ручной отрисовкой

здравствуйте.
Хочу создать чекбокс со стилем BS_OWNERDRAW, чтобы нарисовать свою "галочку". Но оказалось, что при наличии стиля BS_OWNERDRAW, свойства чекбокса пропадают. Т.е. нельзя использовать сообщения BM_SETCHECK и BM_GETCHECK.
Как же быть?
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.03.2013, 13:40   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Обрабатывать BM_SETCHECK/BM_GETCHECK самому.
waleri вне форума Ответить с цитированием
Старый 25.03.2013, 13:58   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Обрабатывать BM_SETCHECK/BM_GETCHECK самому.
подробнее. Как именно обрабатывать?
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.03.2013, 09:37   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

никто меня не научит?
BLACK_RAIN вне форума Ответить с цитированием
Старый 28.03.2013, 21:42   #5
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Привет BLACK_RAIN!

При использовании BS_OWNERDRAW вся отрисовка выполняется вручную. То есть сообщения BM_SETCHECK/BM_GETCHECK не посылаются. Но посылаются сообщения WM_DRAWITEM и WM_COMMAND. В сообщении WM_DRAWITEM происходит полная отрисовка , там же можно устанавливать флаги переключения (кустарно в какой нибудь переменной или массиве, если кнопок несколько). В сообщении WM_COMMAND отлавливаются нажатия на кнопку.
stabud вне форума Ответить с цитированием
Старый 29.03.2013, 14:06   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от stabud Посмотреть сообщение
там же можно устанавливать флаги переключения (кустарно в какой нибудь переменной или массиве, если кнопок несколько).
Какой массив нужен? Array [0..100] of boolean подойдет? И как определять, какая кнопка к какому индексу массива относится?
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.03.2013, 17:21   #7
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Какой массив нужен? Array [0..100] of boolean подойдет? И как определять, какая кнопка к какому индексу массива относится?
Я понимаю конечно, что сейчас нет проблем с размером оперативной памяти у большинства пользователей , но размер массива по идее должен быть сопоставлен кол-ву кнопок.

Что касается определения идентификатора кнопки, то в сообщении WM_DRAWITEM , система посылает в параметре LPARAM указатель на структуру DRAWITEMSTRUCT. В ней, во втором поле (CtlID) как раз идентификатор кнопки. Идентификатор будет номером ячейки для массива, в котором вы будете менять (TRUE - галочка стоит, FALSE - галочка снята)

Вы на дельфи пишите? В любом поисковике можно найти код кнопки с пользовательской отрисовкой. Я могу предложить код отрисовки обычной кнопки, правда на FreeBasic, но там чистый WINAPI (разобраться не сложно). Рисовать checkbox по тому же принципу.
stabud вне форума Ответить с цитированием
Старый 29.03.2013, 17:50   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от stabud Посмотреть сообщение
Я понимаю конечно, что сейчас нет проблем с размером оперативной памяти у большинства пользователей , но размер массива по идее должен быть сопоставлен кол-ву кнопок.
спасибо, что уточнили. Когда я определюсь с количеством кнопок, установлю нужный размер массива.
Цитата:
Сообщение от stabud Посмотреть сообщение
в параметре LPARAM указатель на структуру DRAWITEMSTRUCT. В ней, во втором поле (CtlID) как раз идентификатор кнопки. Идентификатор будет номером ячейки для массива, в котором вы будете менять (TRUE - галочка стоит, FALSE - галочка снята)
Вот тут я не понял. CtlID он же вроде содержит ID моей кнопки, который приходит в сообщении WM_COMMAND в LOWORD(LPARAM). Его я задаю при создании кнопки. Обычно это WM_USER+X. Константа WM_USER равна $0400, что уже больше 10. Допустим, сделаю я 10 кнопок. Массив тоже будет размером [0..9]. Каким образом CtlID попадет в промежуток [0..9]? или я чего-то не понял?[/QUOTE]
Цитата:
Сообщение от stabud Посмотреть сообщение
В любом поисковике можно найти код кнопки с пользовательской отрисовкой. Я могу предложить код отрисовки обычной кнопки, правда на FreeBasic, но там чистый WINAPI (разобраться не сложно). Рисовать checkbox по тому же принципу.
Я умею обрабатывать WM_DRAWITEM. Я не знаю, как сделать такой чекбокс.
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.03.2013, 18:37   #9
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Вот тут я не понял. CtlID он же вроде содержит ID моей кнопки, который приходит в сообщении WM_COMMAND в LOWORD(LPARAM). Его я задаю при создании кнопки. Обычно это WM_USER+X. Константа WM_USER равна $0400, что уже больше 10. Допустим, сделаю я 10 кнопок. Массив тоже будет размером [0..9]. Каким образом CtlID попадет в промежуток [0..9]? или я чего-то не понял?
Вы наверно путаете идентификатор и хендл окна. Идентификатор задается при создании кнопки и может быть в диапазоне типа WORD от 0 до 65535.

but=CreateWindowEx(0,"Button","My Button",WS_VISIBLE Or WS_CHILD Or BS_OWNERDRAW,10,10,80,30,hwnd,Cast( HMENU,1),Hinst,0)

В данном случае but - хендл окна. А 1 - идентификатор кнопки. Получаем мы его как вы сказали в сообщении WM_COMMAND , но в LOWORD(WPARAM), а не в LOWORD(LPARAM). Но даже если вы зададите идентификатор равный 1001 , что мешает вычесть 1000?

К примеру массив 1...10
ID = 1001
обращение к массиву array(Loword(wparam)-1000)
stabud вне форума Ответить с цитированием
Старый 29.03.2013, 22:34   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Почитайте на досуге: http://en.wikipedia.org/wiki/Associa...iners_(C%2B%2B)
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с отрисовкой на экране Stilet Компьютерное железо 9 28.11.2010 17:11
Проблемы с отрисовкой в Direct3D Trapper Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 28.07.2009 18:49
Проблема с отрисовкой в PaintBox Делфи VSemV Помощь студентам 7 26.05.2009 13:32
Проблема с отрисовкой дочрних областей. DJ_Rain Win Api 0 30.04.2009 18:31
HELP!!! Проблема с отрисовкой frai Общие вопросы Delphi 1 11.05.2007 21:17