eXeL@B —› Программирование —› Красивые кнопочки и окошки в кряках и кейгенах |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 04 мая 2011 09:50 · Поправил: ARCHANGEL · Личное сообщение · #1 Всем привет, долбаюсь уже неделю с отрисовкой изображений на кнопках. Смотрел чужие сорцы, дизасмил проги, в общем, на сегодня ситуация такова. Имеются изображения кнопок для трёх состояний - обычное, на кнопку наведен курсор, кнопка нажата (WM_LBUTTONDOWN). В ресурсы добавляю кнопку, потом начинаю её сабклассить. Предварительно изображения из ресурсов через LoadImage загружаются. Всё ок, но посылка через SendMessage сообщения STM_SETIMAGE не перерисовывает кнопку. А это, как вы понимаете, очень печально. Товарищи, в чём же причина такого поведения? Проект прилагается. Контрол имеет свойство BS_BITMAP, поэтому, как и прочёл в МСДН, должно перерисовываться. В других сорцах ничего особенного больше не делают, а кнопки перерисовываются. 0009_03.05.2011_EXELAB.rU.tgz - sGUI.rar ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 04 мая 2011 10:14 · Поправил: Av0id · Личное сообщение · #2 |
|
Создано: 04 мая 2011 10:16 · Личное сообщение · #3 забыл про приватность c6db_03.05.2011_EXELAB.rU.tgz - button_bmp.7z | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 04 мая 2011 13:39 · Поправил: HandMill · Личное сообщение · #4 Я раньше приводил пример для тебя, где кнопки обрезались по региону, там как раз все события обрабатывались как тебе нужно. Ну раз ты просишь ещё, то вот пожалуйста. Пошуршал в гугле на тему сабклассинга кнопок, наткнулся на 664b_04.05.2011_EXELAB.rU.tgz - ButtonsTemplateApp2008.7z ----- все багрепорты - в личные сообщения | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 04 мая 2011 14:29 · Личное сообщение · #5 |
|
Создано: 04 мая 2011 15:17 · Личное сообщение · #6 ARCHANGEL пишет: Что я не так делаю? всё. Начиная от проектирования структуры проекта: * один каталог со свалкой файлов * в release творится то же самое * с проектом были выложены ненужные файлы стиля написания кода, очень не люблю видеть такое: Code:
обрати внимание на количество отправки сообщений STM_SETIMAGE, для элемента управления IDC_BUTTON1, у тебя их всего 2 и оба направлены на попытку отрисовать изображение HBITMAP Close3, у кнопки IDC_BUTTON1 не выставлен стиль OwnerDraw(а без этого с самодельными, симпотишными кнопками можно завязывать) в свойствах ресурса(ведь мы собираемся вывести "красивенькую" кнопочку, тоесть без "краёв от системного компонента", не так ли?) к кнопке IDC_BUTTON2 не увидел никакого связанного кода. Хз что ещё можно сказать по поводу твоего кода, имхо проще набросать/загуглить минимальный пример с отрисовкой кнопки, использующей стиль BS_BITMAP и без OwnerDraw ----- все багрепорты - в личные сообщения |
|
Создано: 04 мая 2011 15:31 · Личное сообщение · #7 HandMill пишет: ...у тебя их всего 2 и оба направлены на попытку отрисовать изображение HBITMAP Close3 Да, и ни один не работает. Почему? ведь мы собираемся вывести "красивенькую" кнопочку, тоесть без "краёв от системного компонента", не так ли? Да, но на данном этапе уже хоть что-то увидеть бы, пусть даже с краями. к кнопке IDC_BUTTON2 не увидел никакого связанного кода. Ну да, его там пока нет. Этот проект должен представлять из себя программу управления другим экзешником, который является консольным приложением. Но пока я не стал писать его полностью, остановился на том, что не рисуются кнопки. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 04 мая 2011 16:07 · Поправил: HandMill · Личное сообщение · #8 |
|
Создано: 04 мая 2011 16:42 · Поправил: gloomdemon · Личное сообщение · #9 HandMill Не BS_SETIMAGE, а BM_SETIMAGE =)) С BS_ начинаются названия стилей. ARCHANGEL И да как написали выше, у баттонов не стоит стиль BS_BITMAP, через свойства надо Bitmap->True. Вместо SendDlgItemMessageA лучше уж использовать SendMessage(CloseBtnHwnd, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM) Close3), раз хендл к кнопке есть. ЗЫ А код просто ужасен, ни форматирования, ничего. |
|
Создано: 04 мая 2011 16:51 · Личное сообщение · #10 |
|
Создано: 04 мая 2011 17:08 · Личное сообщение · #11 |
|
Создано: 04 мая 2011 17:10 · Личное сообщение · #12 |
|
Создано: 04 мая 2011 22:53 · Личное сообщение · #13 With Windows XP, if the bitmap passed in the STM_SETIMAGE message contains pixels with nonzero alpha, the static control takes a copy of the bitmap. This copied bitmap is returned by the next STM_SETIMAGE message. The client code may independently track the bitmaps passed to the static control, but if it does not check and release the bitmaps returned from STM_SETIMAGE messages, the bitmaps are leaked. Просто скопировал. |
|
Создано: 05 мая 2011 10:00 · Личное сообщение · #14 Товарищи. Свершилось чудо - вчера (я уже у себя в календаре обвёл этот день красным ) кнопки отрисовались. Огромнейшее спасибо, HandMill. Очень помог. Теперь пара оффтоп-вопросов. gloomdemon Что значит - нет форматирования? Он, что, в строчку весь написан, что ли? Что вы этим хотели сказать? int Готовый пример, правда на асме, смотрел от Dr.Carbon из SnD. Там всё без надобности усложнено, как мне показалось. Т.е. там поверх конопок рисуется статик, который принимает сообщения, через CreateWindowEx он создается поверх области кнопки, а потом через SendMessage передаёт главному окну WM_COMMAND с параметрами якобы нажатой кнопки. Это позволяет в памяти объекта окна хранить HBITMAP картинок-состояний, а не юзать глобальные переменные, но, мне кажется, что реально полезно это только в случае прорисовки окон непрямоугольной формы. Теперь пара пояснений, почему не работало (если кому неинтересно, просто не читайте дальше). Во-первых, вначале не был выставлен флаг BS_BITMAP, потом юзалось STM_SETIMAGE, что для кнопок не давало результата. Более того, я пробовал и BM_SETIMAGE, но т.к. у кнопок не стоял BS_BITMAP, то это не дало результата. Последний штрих стал возможен благодаря сорцам, которые выложил HandMill. Оттуда я позаимствовал обработку WM_MOUSELEAVE и настройку этого сообщения через предварительно вызванный TrackMouseEvent. И с минимальным объёмом кода в сабклассинговой функции получил отрисовку кнопок. Из всего, что я видел до этого, это - наиболее простой способ. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 05 мая 2011 10:52 · Личное сообщение · #15 |
|
Создано: 05 мая 2011 12:12 · Личное сообщение · #16 |
|
Создано: 05 мая 2011 13:12 · Личное сообщение · #17 zeppe1in Да, видел я и такие реализации. Но где-то прочитал, что такой расклад может подтормаживать перерисовку, т.е. окно будет реагировать с опозданием, ведь на при слишком частом чтении позиции курсора цикл обработки сообщений главного окна будет выполняться не так быстро, что приведёт к замедленной реакции на события. Правда, сам лично не проверял, а написать (особенно на заборах) много чего можно. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 05 мая 2011 17:20 · Личное сообщение · #18 ARCHANGEL Rockphorr В общем то да, это бесконечная тема. Но, к примеру, в функции DialProc, между switch (uMsg) и до конца функции (собственно почти весь код приложения), я из форматирования ничего кроме табов не увидел, все одной простыней, в том числе и без отступов между параметрами функций, это считается нормальным? Осталось еще перед = и после не делать пробелов и все, финиш. |
|
Создано: 05 мая 2011 17:45 · Личное сообщение · #19 gloomdemon пишет: В общем то да, это бесконечная тема. Но, к примеру, в функции DialProc, между switch (uMsg) и до конца функции (собственно почти весь код приложения), я из форматирования ничего кроме табов не увидел, все одной простыней, в том числе и без отступов между параметрами функций, это считается нормальным? Код очень даже читабельный, кому надо тот поймет. Все пишут код как им удобно, а ни как это на картинках учебников. Я допустим несколько лет назад написал инлайнер армадиллы (до сих пор рабочий) на блокноте(более 800 строк ассемблерного кода) и там не было ни какого форматирования и тогда мне это было удобно. |
|
Создано: 05 мая 2011 18:17 · Личное сообщение · #20 Vovan666, зря вы так. Года 3 назад я состряпал проектик приблизительно в 10к сток (это ни в коем случае не много для одного проекта!), вот после этого я прекрасно понял зачем нужно форматирование и повторно прочитал по этому делу рекомендации из книжки по плюсам, стараюсь уделять внимание статьям с хабры по поводу оформления кода(есть несколько годных). Сейчас стараюсь формировать структуру проектов (изначально) максимально удобно форматируемой и следить за оформлением своего кода. Возможно у меня не очень хорошо получается, но во всяком случае я для себя уяснил такое правило: форматирование кода не роскошь, а предмет необходимости. Если код хорошо оформлен - в нём приятно ковыряться, а значит не лень будет вернуться к его редактированию(при необходимости) по прошествии какого-то времени. ----- все багрепорты - в личные сообщения |
|
Создано: 05 мая 2011 19:14 · Личное сообщение · #21 Vovan666 пишет: Код очень даже читабельный Ни разу он не читабельный. Откройте в блокноте sGUI.cpp и попробуйте понять что происходит в case WM_INITDIALOG . Vovan666 пишет: Все пишут код как им удобно, а ни как это на картинках учебников Ну кто же спорит, а кто то ж*пу после того как в туалет сходил не вытирает и не моет, ведь так удобно, вытирать еще зачем-то, мало ли что там в книгах по гигиене пишут. Если вдруг гости придут или на улицу выйти, то да, можно и помыть. |
|
Создано: 05 мая 2011 20:02 · Личное сообщение · #22 |
|
Создано: 05 мая 2011 20:03 · Личное сообщение · #23 |
|
Создано: 05 мая 2011 20:41 · Личное сообщение · #24 Vovan666 Нет, вы всего лишь привыкли все писать подряд без выделения блоков, и разделения параметров в функциях, а может быть и вообще без форматирования. Каждому свое, пример я уже привел выше, так же как и в разных проектах свои правила написания кода и использования возможностей ЯП. ЗЫ Не знаю при чем тут VS, я говорил о блокноте, а код на который нажать Compile и готово, да еще и работает, это показатель хорошего уровня программиста, способного думать головой. |
|
Создано: 05 мая 2011 21:24 · Личное сообщение · #25 |
|
Создано: 06 мая 2011 04:04 · Личное сообщение · #26 |
|
Создано: 06 мая 2011 09:14 · Личное сообщение · #27 |
|
Создано: 07 мая 2011 23:24 · Поправил: Rockphorr · Личное сообщение · #28 |
|
Создано: 16 июля 2011 00:25 · Личное сообщение · #29 |
|
Создано: 16 июля 2011 00:50 · Личное сообщение · #30 ressa пишет: Уважаемые, на тутсе выкладывали эффект, который на канале ехелаба называли "амеба", никак не могу найти, был бы рад за помощь в нем и ему подобным. Эффект заключается в том, что на фоне идут "помехи" и хаотично расплывается пятно, действительно схожее с амебой. Заранее благодарен. http://forum.tuts4you.com/showtopic=22702 | Сообщение посчитали полезным: ressa |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Красивые кнопочки и окошки в кряках и кейгенах |