Форум: "WinAPI";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизТребуется наарисовать эллипсградиентный и с увеличивающейся прозр Найти похожие ветки
← →
Nick Denry © (2006-02-16 16:56) [0]градиентный и с увеличивающейся прозрачностью от центра окружности, вписанной в этот эллипс (наверное).
т.е. есть изображение, на нем белое пятно, его необходимо повторить программно.
Как можно такого добиться?
пример изображения http://www.nickdenry.narod.ru/images/btn_down.png
← →
Игорь Шевченко © (2006-02-16 17:06) [1]Сделать битмап и положить его на кнопку.
← →
Nick Denry © (2006-02-16 17:20) [2]Игорь Шевченко © (16.02.06 17:06) [1]
Забыл добавить - элипс должен быть произвольго рамера.
Насчет битмапа я тоже думал, но надо сделать такой "блик" для кнопок как скажем 90х29, так и для 24х24 (сама кнопка рисуется процедурными градиентами из описания закрашиваемых областей), т.е. свободно принимает любой размер.
Я понимаю, что задача наверняка сложная, но фотошоп как-то ведь такой блик нарисовал? :)
← →
Игорь Шевченко © (2006-02-16 17:58) [3]Nick Denry © (16.02.06 17:20) [2]
> но фотошоп как-то ведь такой блик нарисовал?
Грубо говоря, одна известная фирма так и поступает, рисует фотошопом или чем-то иным битмапы, а потом при необходимости растягивает их до нужного размера с помощью StretchBlt с соответственно установленным режимом (SetStretchBltMode)
← →
Nick Denry © (2006-02-17 12:38) [4]Ага, понятно.
А лучше нарисовать большой битмап (преполагается что рамеры кнопок будут варьироваться от 150*150 до 18*18) и сжимать его или маленький, но растягивать?
Одна известная фирма - это MS? :)))
А вообще, есть ли функция для рисования эллиптического градиента (GradientFill вроде бы только Triangle и Rect может заполнять, или круговой градиент из этих самых треугольников и строится?)
Или только руками эллипсы разного цвета?
и еще оффтоп - не хочеу новую тему начинать, как организовать 2йную буффеизацию правильно?
Т.е. сначала где-то в памяти отрисовать, а потом BitBlt сделать, например.
← →
Игорь Шевченко © (2006-02-17 13:00) [5]Nick Denry © (17.02.06 12:38) [4]
> А лучше нарисовать большой битмап (преполагается что рамеры
> кнопок будут варьироваться от 150*150 до 18*18) и сжимать
> его или маленький, но растягивать?
Лучше нарисовать три разного размера, подобрав оптимально размеры, чтобы сжатие/растяжение несильно искажало картинку.
> Одна известная фирма - это MS?
Да, конечно.
> А вообще, есть ли функция для рисования эллиптического градиента
> (GradientFill вроде бы только Triangle и Rect может заполнять,
> или круговой градиент из этих самых треугольников и строится?
> )
> Или только руками эллипсы разного цвета?
Это Фэнь Юань тебе гораздо подробнее расскажет, я не помню.
> и еще оффтоп - не хочеу новую тему начинать, как организовать
> 2йную буффеизацию правильно?
>
> Т.е. сначала где-то в памяти отрисовать, а потом BitBlt
> сделать, например.
CreateCompatibleDC, CreateBitmap или LoadImage, SelectObject
← →
Sapersky (2006-02-17 15:15) [6]а потом при необходимости растягивает их до нужного размера с помощью StretchBlt
Угу, то, что на картинке - это вообще круглый градиент, растянутый горизонтально. Если присмотреться, заметно.
Процедура генерации круглого градиента есть в FastLIB. За 2 минуты переделал её на "честный" эллипсоидный (8 bpp):
procedure RenderLightmap8(Bmp : TFastDIB; SizeX, SizeY : Integer);
var
x,y,yy,rx,ry,fx,fy,i: Integer;
pb: PByte;
begin
rx := Bmp.Width shr 1; ry := Bmp.Height shr 1;
fx := Round(65536/(SizeX/((256/(SizeX/2))*2)));
fy := Round(65536/(SizeY/((256/(SizeY/2))*2)));
// оставил как в оригинале, хотя можно слегка :) упростить, конечно
for y:=0 to Bmp.Height-1 do begin
pb := Bmp.Scanlines[y];
yy := (y-ry)*(y-ry);
for x:=0 to Bmp.Width-1 do
begin
i:=((x-rx)*(x-rx)*fx + yy*fy) shr 16;
if i>255 then i:=255;
i:=i xor -1; // инвертирование
pb^:=i;
Inc(pb);
end;
end;
end;
Для TBitmap должно работать практически без изменений.
Если нужен "чистый API", то FastLIB вполне допустим, т.к. не использует ничего кроме windows.pas:
http://prdownloads.sourceforge.net/skinner/FastLib.zip?download
← →
Nick Denry © (2006-02-17 17:13) [7]Всем спасибо за ответы.
Скорее всего буду делать несколько PNG - формат поддерживает альфа-канал, и имеет
возможность StretchBlt с хорошим растяжением/сжатием :)
А картинку, которую я привел - друг рисовал в Photoshop"e не то с помощью кисточки, не то это эффект линз.
← →
Игорь Шевченко © (2006-02-17 17:19) [8]
> Скорее всего буду делать несколько PNG
Все равно, перед выводом через BitBlt придется в битмап преобразовывать, или я не успеваю за современным развитием и формат PNG спокойно воспринимается контекстами устройств ?
← →
Nick Denry © (2006-02-17 17:58) [9]Игорь Шевченко © (17.02.06 17:19) [8]
Нет все нормально, просто есть класс TPNGObject в рамках JEDI (кажется converting APIs), если не ошибаюсь, (который может использовать только "апишные" юниты), соответственно есть функции (TPNGObject.Draw и т.д.) - они сами преобразуют в битмап.
+ Есть св-во handle, которое содержит хендл соответсвующего битмапа, каким-то образом с сохранением альфа-канала.
Вроде все так сказал.
← →
Nick Denry © (2006-02-17 18:02) [10]да и формат сам хорошо довольно сжат
← →
Nick Denry © (2006-02-17 23:23) [11]Игорь Шевченко © (17.02.06 13:00) [5]
У меня еще вопрос по двойной буфферизации:
делаю так:
в глобальных переменных описаны след. переменные:
...
var
tdc : HDC;
tbmp : HBITMAP;
...
далее, в процедуре обработки сообщений кнопки в WM_CREATE пишу:
...
WM_CREATE:
begin
...
GetClientRect(btn, btn_client_rect); //Клиентская област кнопки
btn_client_rect.Left := ns_ltc_img.Width ;// -5 пикселей от вехнего левого угла по горизонтали
btn_client_rect.Top := ns_ltc_img.Height; // -5 пикселей от вехнего левого угла по вертикали
btn_client_rect.Right := btn_client_rect.Right - ns_rtc_img.Width; //тоже от нижнего правого угла
btn_client_rect.Bottom := btn_client_rect.Bottom - ns_rbc_img.Height;
tdc := CreateCompatibleDC(0); //memory dc
tbmp := CreateCompatibleBitmap(GetDC(btn), btn_client_rect.Right , btn_client_rect.Bottom); // цветной битмап
SelectObject(tdc, tbmp); //как положено
DrawRectGradient(tdc,RGB(158,199,230),RGB(136, 177, 211), btn_client_rect); //градиент
...
дальше в WM_PAINT:
begin
....
BeginPaint
...
BitBlt(ps.hdc, ns_ltc_img.Width, ns_ltc_img.Height, btn_client_rect.Right,
btn_client_rect.Bottom, tdc, ns_ltc_img.Width, ns_ltc_img.Height,
SRCCOPY);
...
EndPaint
end;
Перерисовка НИЧЕМ не отличается от отрисовки сразу на контекст.
Я что-то неправильно делаю или это BitBlt такая медленная?
Самая плохая перерисовка - при изменении размеров окна....
Как быть?
← →
Nick Denry © (2006-02-17 23:25) [12]кнопка - обычное окно
← →
Игорь Шевченко © (2006-02-18 00:31) [13]
> Самая плохая перерисовка - при изменении размеров окна.
> ...
А зачем при этом кнопки перерисовывать ? Их размер тоже меняется ?
← →
Nick Denry © (2006-02-18 12:42) [14]Нет, размер кнопок не меняется.
Тогда я подумал, а почему происходит перерисовка кнопок и как не перерисовывать дочерние окна при перерисовки главного окна?
Главное окно созданно как
CS_HREDRAW+CS_VREDRAW и WS_OVERLAPPEDWINDOW
кнопки - CS_HREDRAW+CS_VREDRAW и WS_CHILD+WS_VISIBLE
Установка WS_CLIPCHILDREN главому окну не помогает.. :(
И создание кнопок со классом CS_OWNDC тоже.
Не перерисовывается только, если главное окно созданно как CS_OWNDC,
только по-моему это не правилно.
← →
аноним (2006-02-18 19:57) [15]хе ) похоже немного на Office12 стиль =) уж не для TBX ли темку пишешь?
← →
Nick Denry © (2006-02-18 20:45) [16]аноним (18.02.06 19:57) [15]
Что такое TBX? Я пишу проект обучающей программы.
Кнопки кстати, цветонезависимые, т.е. градиент берется из значений серого, а
цвет задается через Hue/Saturation типа как Colorize в Photoshop :)
← →
Nick Denry © (2006-02-20 14:12) [17]Вопрос [14] остается открытым
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.014 c