|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.04.2018, 04:14 | #1 |
Пользователь
Регистрация: 03.04.2018
Сообщений: 11
|
Subclass Paint Button Control
Здравствуйте.
Ищу помощь в теме о замене процедуры отрисовки для Window Controls (в данный момент начну с Button Control, т.к. подготовил пример). Суть - полностью заменить отрисовку стандартных контролов, любым способом(в дальнейшем хочу использовать данный код для вывода графики на поверхности типа DirectX или OpenGL). Нашёл несколько вариантов: 1) Добавление флага OwnerDraw, и в оконной процедуре обработать WM_DRAWITEM, отрисовав с помощью ф. BitBlt() своё изображение, при том что там же можно поменять поверхность вывода. Однако такой способ мне не очень симпатичен. 2) Subclassing WM_PAINT процедуры для конкретного контрола (т.к. планирую заменить отрисовку не только для кнопок, но и для других контролов, то данный метод может служить примером). И так вот код для PUSHBUTTON кнопки, однако он работает не очень правильно. После нажатия на кнопку (LEFTBUTTONDOWN) кнопка всё ещё рисует стандартным способом то, что должна по дефолту (хотя я разсчитывал, что данное сообщение пришлёт повторный WM_PAINT и отловив состояние, я бы перерисовал по своему). Код:
Последний раз редактировалось ArhiCoder; 04.04.2018 в 04:28. |
04.04.2018, 04:16 | #2 |
Пользователь
Регистрация: 03.04.2018
Сообщений: 11
|
Код:
*П.С. Если нарушил правила форума о длине кода, или чему либо ещё - прошу прощенья, ибо это моё первое появление на этом форуме, и ещё не вник во все правила. Последний раз редактировалось ArhiCoder; 04.04.2018 в 04:23. |
04.04.2018, 12:58 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
BM_SETSTATE рисует кнопку сам.
Самый простой выход - вставить обработчкик BM_SETSTATE, который будет вызывать InvalidateRect(hWnd, NULL, FALSE) и дальше вызывать gDef[2]. Самый правильный выход - реализовать весь функционал кнопки самому (те. пересылать все в DefWindowProc). |
04.04.2018, 14:05 | #4 |
Пользователь
Регистрация: 03.04.2018
Сообщений: 11
|
Вот что меня и удивило, что данная команда не вызывает WM_PAINT.
Т.е. по логике ("в идеальном мире"), оно должно же быть. Весьма странно что майкрософт внедрили процедуру рисования таким образом.. Я так понимаю что и для других типов контролов будут такие же логически не очень правильные моменты. А есть ли где либо полное описание того, как в стандарте сделано всё это самими майкрософтами? Т.е. каскад команд и сам код того как это реализовано по дефолту? Не могли бы вы пояснить, что вы имеете ввиду? Т.е. в чём принципиальное отличие того, что я заменю лишь часть кода (отрисовки) от того, что я как понимаю, вы предлагаете полностью заменить все процедуры. (В таком случае не проще ли реализовать с нуля свой CustomControl, и сделать логически правильную цепочку команд) |
04.04.2018, 14:12 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Нет, такого нигде нет и быть не должно - это implementation detail. Сегодня сделано так а завтра переделаем иначе. Для кнопок сказано, что BM_SETSTAТЕ меняет состояние а если хотите рисовать сами - BS_OWNERDRAW. Все остальное от лукавого.
Об этом и речь, просто он должен иметь класс "BUTTON" и вести себя как ем... button... Если делаете для своих программ, тогда конечно можно называть как угодно и реализовать любой функционал любым способом. |
04.04.2018, 14:28 | #6 |
Пользователь
Регистрация: 03.04.2018
Сообщений: 11
|
Весьма странно, учитывая что весь мир всегда ссылается на эталон (даже в области программирования есть стандарты, например HTTP, хоть он и меняется со временем, но он есть и он опубликован), а тут его нет, и он даже не представлен.
Ладно, я понял.. такова политика частного сектора, принудить ни кто не может, поэтому делаем что хотим. =) Ну тогда это уже не CustomControl, т.к. прийдётся делать через сабклассирование, т.е. то как начал это делать я. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как создать инсталлер этого самого Paint'a. Какие файлы,библиотеки использует Paint? Чтобы я мог закинуть их и создать установщик | M1ZL-S | Windows | 7 | 31.07.2017 19:23 |
Если Button 1 и Button 2 нажаты - Button 3 стала активной, как? | FleXik | Общие вопросы Delphi | 25 | 11.03.2015 13:52 |
Как привязать компоненту TComboBox к Button, чтобы при нажатии Button, данные из ComboBox вводились в TstringGrid | Marta_ | Помощь студентам | 2 | 15.10.2011 01:02 |
Paint | Артэс | Win Api | 4 | 30.11.2008 02:09 |
paint | ben95 | Общие вопросы Delphi | 1 | 30.03.2008 09:27 |