Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] GDI+ рисование на статике-перерисовка "заново"

Ответить
Настройки темы
C/C++ - [решено] GDI+ рисование на статике-перерисовка "заново"

Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25


Конфигурация

Профиль | Отправить PM | Цитировать


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

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 10:43, 25-01-2010

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата crashtuak:
но то как то кустарно »
Если имеется ввиду мелькание при заливке, то можно включить двойную буфферизацию. Либо сделать изображение непрозрачным сразу

Отправлено: 13:33, 25-01-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Нет, не мерцание. Вот вся ситуация: на окне программы я нарисовал картинку, положил на окно программы Static, далее в статике я нарисовал полупрозрачное изображение. Далее я хочу стереть нарисованное изображение в Static, и на его место нарисовать другое полупрозрачное изображение(если не стереть старое, то два изображения просто накладываются одно на другое).

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 14:00, 25-01-2010 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


В смысле UpdateWindow сделать (перерисовать фон перед отрисовкой изображения на нём)? я не понял, можно кусочек кода? (со скриншотом)

Отправлено: 15:52, 25-01-2010 | #4


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
hdc = BeginPaint(hhstatic1, &ps);
OnPaint(hdc, 2);
OnPaint(hdc, 3);
EndPaint(hhstatic1, &ps);
Ф-ция 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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Понадобится объект, который ограничивает область действия.
Варианты:
1) использовать обрезку (clipping with region) - годится для простых форм (без прозрачности, с не сильно замысловатыми границами)
2) использовать чёрно-белое изображение смешивания (маску). Суть: в чёрный экран копируем A*image1 + (1-A)*image2, где A - изображение, на котором пиксели вне границ кнопки имеют белый цвет, в границах - чёрный; (1-A) - инвентированное A; image1 - изображение фона (кнопки); image2 - фон с наложенной сверху полупрозрачной картинкой (Скриншот "как выходит")
оказывается второй способ прокатывает только для GDI и Direct3D

Последний раз редактировалось pva, 25-01-2010 в 23:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:20, 25-01-2010 | #6


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


pva, мне надо именно с прозрачностью, и с замысловатыми границами...

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 07:52, 26-01-2010 | #7


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Придумал вот так-на форме два статика, в каждом своя картинка. По ходу выполнения кода я скрываю один статик, а показываю второй, НО нарисованное остается, надо либо перетянуть окно, либо изменить его размеры, что бы оно обновилось... А как можно окно обновить программно?

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 12:27, 26-01-2010 | #8


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


crashtuak, например вызвать InvalidateRect в первом параметре указав хендл статика, который нужно перерисовать (тем самым форсировав событие WM_PAINT для этого окна). Или UpdateWindow, про который вспоминал pva в 4м сообщении темы. Ещё вариант с подмигиванием - скрыть и отобразить окно.

pva, если бы второй способ работал, это бы было бы решением для темы *GdiPlus*| маски прозрачности?
Считаю что для того, что б добиться результата со второго скрина от crashtuak, как раз и нужно применять маску. Да вот похоже такой встроенной функции в GDIplus нет, так что остаётся вариант по пиксельной обработки (а он достаточно медленный).
Два изображения имеют одинаковые размеры, во втором, где проходят чёрные линии (линии маски), в первом по этим же координатам пиксели должны становится прозрачными.
Вот только пока не знаю, как задать конкретному пикселю в изображении, что он должен быть прозрачным.

Понемногу осваиваюсь с прямой работой с GDIplus (до этого имел дело через .NET врапер).
Уже функцию с темы exe в скринсейвер на GdiPlus перенёс.
читать дальше »
Код: Выделить весь код
void GeneratorTsvetnyhPolos_GdiPlus(HDC *hDc, RECT *rectBar, int OffSet)
{
	Graphics g(*hDc);
	g.SetPageUnit(UnitPixel);	

	g.FillRectangle(new SolidBrush(Color(255, 255, 255, 255)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 196, 196, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 0, 196, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 0, 196, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 196, 0, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 196, 0, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 0, 0, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
	rectBar->left = rectBar->right;
	rectBar->right += OffSet;
	g.FillRectangle(new SolidBrush(Color(255, 0, 0, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
}

Последний раз редактировалось Admiral, 26-01-2010 в 13:59.


Отправлено: 13:47, 26-01-2010 | #9


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Admiral, ни InvalidateRect ни UpdateWindow не помогает. Отрисовывается как надо только, например, при расположении какого нибудь другого окна над окном нашей программы...
--------------------------------------------------------------------
Извеняюсь, InvalidateRect обновило окно...

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Последний раз редактировалось crashtuak, 26-01-2010 в 14:21.


Отправлено: 14:04, 26-01-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] GDI+ рисование на статике-перерисовка "заново"

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Как удалить папку "Моя музыка","Мои Картинки", "Мое видео"? 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




 
Переход