Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Красивые кнопочки и окошки в кряках и кейгенах
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 04 мая 2011 10:14 · Поправил: Av0id
· Личное сообщение · #2

вот, может поможет, внутри:
- ownerdraw кнопка с подгрузкой из ресурсов bmp
- ownerdraw кнопка с подгрузкой из ресурсов gif

еще я выкладывал недавно патчер с ownerdraw кнопками тупо на фреймах (но он на фасме)
http://exelab.ru/f/action=vthread&forum=6&topic=17721&page=0#8



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 04 мая 2011 10:16
· Личное сообщение · #3

забыл про приватность

c6db_03.05.2011_EXELAB.rU.tgz - button_bmp.7z

| Сообщение посчитали полезным: ARCHANGEL

Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 04 мая 2011 13:39 · Поправил: HandMill
· Личное сообщение · #4

Я раньше приводил пример для тебя, где кнопки обрезались по региону, там как раз все события обрабатывались как тебе нужно. Ну раз ты просишь ещё, то вот пожалуйста. Пошуршал в гугле на тему сабклассинга кнопок, наткнулся на это. Затем прикрутил приводимый там исходник к своему проекту(в аттаче), правда пришлось повозиться с обработкой группы сообщений WM_MOUSEMOVE / WM_MOUSELEAVE / WM_MOUSEHOVER при сабклассинге, что бы было реагирование на событие "указатель мыши над кнопкой", но вроде бы получилось.

664b_04.05.2011_EXELAB.rU.tgz - ButtonsTemplateApp2008.7z

-----
все багрепорты - в личные сообщения


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 04 мая 2011 14:29
· Личное сообщение · #5

За примеры, конечно, большое спасибо. Но почему в моём примере (который я выложил) кнопка не перерисовывается? Что я не так делаю?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 04 мая 2011 15:17
· Личное сообщение · #6

ARCHANGEL пишет:
Что я не так делаю?

всё. Начиная от проектирования структуры проекта:

* один каталог со свалкой файлов
* в release творится то же самое
* с проектом были выложены ненужные файлы

стиля написания кода, очень не люблю видеть такое:
Code:
  1.                  break;
  2.          case WM_LBUTTONDOWN:           
  3.                  SetCapture(hwndDlg);

обрати внимание на количество отправки сообщений STM_SETIMAGE, для элемента управления IDC_BUTTON1, у тебя их всего 2 и оба направлены на попытку отрисовать изображение HBITMAP Close3, у кнопки IDC_BUTTON1 не выставлен стиль OwnerDraw(а без этого с самодельными, симпотишными кнопками можно завязывать) в свойствах ресурса(ведь мы собираемся вывести "красивенькую" кнопочку, тоесть без "краёв от системного компонента", не так ли?) к кнопке IDC_BUTTON2 не увидел никакого связанного кода. Хз что ещё можно сказать по поводу твоего кода, имхо проще набросать/загуглить минимальный пример с отрисовкой кнопки, использующей стиль BS_BITMAP и без OwnerDraw

-----
все багрепорты - в личные сообщения





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 04 мая 2011 15:31
· Личное сообщение · #7

HandMill пишет:
...у тебя их всего 2 и оба направлены на попытку отрисовать изображение HBITMAP Close3

Да, и ни один не работает. Почему?

ведь мы собираемся вывести "красивенькую" кнопочку, тоесть без "краёв от системного компонента", не так ли?

Да, но на данном этапе уже хоть что-то увидеть бы, пусть даже с краями.

к кнопке IDC_BUTTON2 не увидел никакого связанного кода.

Ну да, его там пока нет. Этот проект должен представлять из себя программу управления другим экзешником, который является консольным приложением. Но пока я не стал писать его полностью, остановился на том, что не рисуются кнопки.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 04 мая 2011 16:07 · Поправил: HandMill
· Личное сообщение · #8

ARCHANGEL пишет:
Да, и ни один не работает. Почему?

отому что нужно отправлять сообщение BM_SETIMAGE. То которое отправляется у тебя, STM_SETIMAGE, предназначено для статических элементов управления, вроде картинок.

gloomdemon, опечатался, да

-----
все багрепорты - в личные сообщения




Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 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), раз хендл к кнопке есть.

ЗЫ
А код просто ужасен, ни форматирования, ничего.



Ранг: 17.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 04 мая 2011 16:51
· Личное сообщение · #10

А может лучше PostMessage делать?



Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 04 мая 2011 17:08
· Личное сообщение · #11

Usulgurt
Можно и его, но вообще, по хорошему, SendMessage с BM_SETIMAGE возвращает HBITMAP предыдущей картинки, которая если не нужна, очищается через DeleteObject.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 04 мая 2011 17:10
· Личное сообщение · #12

ARCHANGEL
Есть готовый пример BMPButton класса на сях. Надо? Или есть дикое желание построить свой велосипед?



Ранг: 17.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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.

Просто скопировал.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 05 мая 2011 10:52
· Личное сообщение · #15

Что значит - нет форматирования? Он, что, в строчку весь написан, что ли? Что вы этим хотели сказать?

стиль написания кода и форматирование сорцов - тема являющаяся непаханым полем для бесплодных дисскусий и холиваров, если у участников нет цели написать совместный проект




Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

Создано: 05 мая 2011 12:12
· Личное сообщение · #16

ARCHANGEL пишет:
Оттуда я позаимствовал обработку WM_MOUSELEAVE

А мне помнится я реверсил какойто кейген, чтобы замутить такое. Это был кейген MozgC, и там стоял таймер который проверял где находится мышь, я сделал также

-----
zzz





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 05 мая 2011 13:12
· Личное сообщение · #17

zeppe1in
Да, видел я и такие реализации. Но где-то прочитал, что такой расклад может подтормаживать перерисовку, т.е. окно будет реагировать с опозданием, ведь на при слишком частом чтении позиции курсора цикл обработки сообщений главного окна будет выполняться не так быстро, что приведёт к замедленной реакции на события. Правда, сам лично не проверял, а написать (особенно на заборах) много чего можно.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 05 мая 2011 17:20
· Личное сообщение · #18

ARCHANGEL
Rockphorr

В общем то да, это бесконечная тема. Но, к примеру, в функции DialProc, между switch (uMsg) и до конца функции (собственно почти весь код приложения), я из форматирования ничего кроме табов не увидел, все одной простыней, в том числе и без отступов между параметрами функций, это считается нормальным? Осталось еще перед = и после не делать пробелов и все, финиш.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 05 мая 2011 17:45
· Личное сообщение · #19

gloomdemon пишет:
В общем то да, это бесконечная тема. Но, к примеру, в функции DialProc, между switch (uMsg) и до конца функции (собственно почти весь код приложения), я из форматирования ничего кроме табов не увидел, все одной простыней, в том числе и без отступов между параметрами функций, это считается нормальным?

Код очень даже читабельный, кому надо тот поймет. Все пишут код как им удобно, а ни как это на картинках учебников. Я допустим несколько лет назад написал инлайнер армадиллы (до сих пор рабочий) на блокноте(более 800 строк ассемблерного кода) и там не было ни какого форматирования и тогда мне это было удобно.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 05 мая 2011 18:17
· Личное сообщение · #20

Vovan666, зря вы так. Года 3 назад я состряпал проектик приблизительно в 10к сток (это ни в коем случае не много для одного проекта!), вот после этого я прекрасно понял зачем нужно форматирование и повторно прочитал по этому делу рекомендации из книжки по плюсам, стараюсь уделять внимание статьям с хабры по поводу оформления кода(есть несколько годных). Сейчас стараюсь формировать структуру проектов (изначально) максимально удобно форматируемой и следить за оформлением своего кода. Возможно у меня не очень хорошо получается, но во всяком случае я для себя уяснил такое правило: форматирование кода не роскошь, а предмет необходимости. Если код хорошо оформлен - в нём приятно ковыряться, а значит не лень будет вернуться к его редактированию(при необходимости) по прошествии какого-то времени.

-----
все багрепорты - в личные сообщения




Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 05 мая 2011 19:14
· Личное сообщение · #21

Vovan666 пишет:
Код очень даже читабельный


Ни разу он не читабельный. Откройте в блокноте sGUI.cpp и попробуйте понять что происходит
в case WM_INITDIALOG .

Vovan666 пишет:
Все пишут код как им удобно, а ни как это на картинках учебников


Ну кто же спорит, а кто то ж*пу после того как в туалет сходил не вытирает и не моет, ведь так удобно, вытирать еще зачем-то, мало ли что там в книгах по гигиене пишут. Если вдруг гости придут или на улицу выйти, то да, можно и помыть.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 05 мая 2011 20:02
· Личное сообщение · #22

Вполне читабельно для экзампла. Отступы есть, выравнивание есть. Нет разрывов блоков, но кода немного, поэтому всё понятно, не знаю что тут в коде такого страшного.

-----
Yann Tiersen best and do not fuck




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 05 мая 2011 20:03
· Личное сообщение · #23

gloomdemon
Либо я дурак не взращенный на Visual Studio, которая весь код за тебя пишет, либо вы привыкли к коду на который нажать Compile и готово!?
Вам описать каждую строчку после WM_INITDIALOG?



Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 05 мая 2011 20:41
· Личное сообщение · #24

Vovan666
Нет, вы всего лишь привыкли все писать подряд без выделения блоков, и разделения параметров в функциях, а может быть и вообще без форматирования. Каждому свое, пример я уже привел выше, так же как и в разных проектах свои правила написания кода и использования возможностей ЯП.

ЗЫ
Не знаю при чем тут VS, я говорил о блокноте, а код на который нажать Compile и готово, да еще и работает, это показатель хорошего уровня программиста, способного думать головой.



Ранг: 17.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 мая 2011 21:24
· Личное сообщение · #25

В Visual Studio Ctrl K,F - форматирование кода



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 06 мая 2011 04:04
· Личное сообщение · #26

Ну надо же. А я думал, уж на крекекзелабе никогда не будет холиваров по поводу форматирования кода...

Usulgurt, +1 (Ctrl-A, Ctrl-K,F)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 06 мая 2011 09:14
· Личное сообщение · #27

Хорош уже холиварить не по сабжу, ближе к теме.



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 07 мая 2011 23:24 · Поправил: Rockphorr
· Личное сообщение · #28

ARCHANGEL был на васме товарисч kero он очень не плохо вкурил как работают стандартные механизмы оформления и рисования окон
если поискать то может найдете его исходники с описаниями



Ранг: 49.8 (посетитель), 56thx
Активность: 0.090
Статус: Участник

Создано: 16 июля 2011 00:25
· Личное сообщение · #29

Уважаемые, на тутсе выкладывали эффект, который на канале ехелаба называли "амеба", никак не могу найти, был бы рад за помощь в нем и ему подобным. Эффект заключается в том, что на фоне идут "помехи" и хаотично расплывается пятно, действительно схожее с амебой. Заранее благодарен.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 16 июля 2011 00:50
· Личное сообщение · #30

ressa пишет:
Уважаемые, на тутсе выкладывали эффект, который на канале ехелаба называли "амеба", никак не могу найти, был бы рад за помощь в нем и ему подобным. Эффект заключается в том, что на фоне идут "помехи" и хаотично расплывается пятно, действительно схожее с амебой. Заранее благодарен.

http://forum.tuts4you.com/showtopic=22702

| Сообщение посчитали полезным: ressa
. 1 . 2 . >>
 eXeL@B —› Программирование —› Красивые кнопочки и окошки в кряках и кейгенах
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати