|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] GDI+ рисование на статике-перерисовка "заново" |
|
|
C/C++ - [решено] GDI+ рисование на статике-перерисовка "заново"
|
Старожил Сообщения: 467 |
Профиль | Отправить PM | Цитировать Как можно нарисовав на статике одно изображение с прозрачностью, зарисовать его другим, тоже с прозрачностью, тоесть удалить первое изображение?
(если рисовать сразу поверх первого изображения, то прозрачные части первого совмещаются с прозрачными второго) Я думаю, может сначала зарисовать белым фоном, но то как то кустарно выйдет... |
|
------- Отправлено: 10:43, 25-01-2010 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата crashtuak:
|
|
Отправлено: 13:33, 25-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Нет, не мерцание. Вот вся ситуация: на окне программы я нарисовал картинку, положил на окно программы Static, далее в статике я нарисовал полупрозрачное изображение. Далее я хочу стереть нарисованное изображение в Static, и на его место нарисовать другое полупрозрачное изображение(если не стереть старое, то два изображения просто накладываются одно на другое).
|
------- Отправлено: 14:00, 25-01-2010 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать В смысле UpdateWindow сделать (перерисовать фон перед отрисовкой изображения на нём)? я не понял, можно кусочек кода? (со скриншотом)
|
Отправлено: 15:52, 25-01-2010 | #4 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать
Ф-ция OnPaint:
VOID OnPaint(HDC hdc, int imagee) { if (imagee==2){ Graphics graphics(hdc); Image image(L"E:\\TMP2\\button.png"); graphics.DrawImage(&image, 0, 0); } if (imagee==3){ Graphics graphics(hdc); Image image(L"E:\\TMP2\\button2.png"); graphics.DrawImage(&image, 0, 0); } } Скриншот(как должно быть): Тоесь мне надо отрисовать button.png, и по ходу выполнения программы на место button.png (именно на место, а не поверх) отрисовать button2.png. |
|
------- Отправлено: 17:48, 25-01-2010 | #5 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Понадобится объект, который ограничивает область действия.
Варианты: 1) использовать обрезку (clipping with region) - годится для простых форм (без прозрачности, с не сильно замысловатыми границами) оказывается второй способ прокатывает только для GDI и Direct3D |
Последний раз редактировалось pva, 25-01-2010 в 23:36. Отправлено: 23:20, 25-01-2010 | #6 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать pva, мне надо именно с прозрачностью, и с замысловатыми границами...
|
------- Отправлено: 07:52, 26-01-2010 | #7 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Придумал вот так-на форме два статика, в каждом своя картинка. По ходу выполнения кода я скрываю один статик, а показываю второй, НО нарисованное остается, надо либо перетянуть окно, либо изменить его размеры, что бы оно обновилось... А как можно окно обновить программно?
|
------- Отправлено: 12:27, 26-01-2010 | #8 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать crashtuak, например вызвать InvalidateRect в первом параметре указав хендл статика, который нужно перерисовать (тем самым форсировав событие WM_PAINT для этого окна). Или UpdateWindow, про который вспоминал pva в 4м сообщении темы. Ещё вариант с подмигиванием - скрыть и отобразить окно.
pva, если бы второй способ работал, это бы было бы решением для темы *GdiPlus*| маски прозрачности? Считаю что для того, что б добиться результата со второго скрина от crashtuak, как раз и нужно применять маску. Да вот похоже такой встроенной функции в GDIplus нет, так что остаётся вариант по пиксельной обработки (а он достаточно медленный). Два изображения имеют одинаковые размеры, во втором, где проходят чёрные линии (линии маски), в первом по этим же координатам пиксели должны становится прозрачными. Вот только пока не знаю, как задать конкретному пикселю в изображении, что он должен быть прозрачным. Понемногу осваиваюсь с прямой работой с GDIplus (до этого имел дело через .NET врапер). Уже функцию с темы exe в скринсейвер на GdiPlus перенёс. |
Последний раз редактировалось Admiral, 26-01-2010 в 13:59. Отправлено: 13:47, 26-01-2010 | #9 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Admiral, ни InvalidateRect ни UpdateWindow не помогает. Отрисовывается как надо только, например, при расположении какого нибудь другого окна над окном нашей программы...
-------------------------------------------------------------------- Извеняюсь, InvalidateRect обновило окно... |
------- Последний раз редактировалось crashtuak, 26-01-2010 в 14:21. Отправлено: 14:04, 26-01-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] Как удалить папку "Моя музыка","Мои Картинки", "Мое видео"? | verdix | Microsoft Windows 2000/XP | 3 | 03-10-2009 23:46 | |
Debian/Ubuntu - [решено] Пропали кнопки "свернуть","закрыть","во весь екран" в папках | Alex.sys | Общий по Linux | 5 | 02-04-2009 11:13 | |
Приоритет в диспетчере: "реального времени", "средний", "выше среднего" | alhimik PC | Хочу все знать | 3 | 28-11-2006 05:29 | |
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") | submaster | Microsoft Windows NT/2000/2003 | 5 | 13-09-2006 12:29 | |
Можно ли ставить "GDI+" на русский win'98 ? | Fire Dragon | Microsoft Windows 95/98/Me (архив) | 0 | 18-03-2005 18:58 |
|