Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Требуется наарисовать эллипсградиентный и с увеличивающейся прозр   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.069 c
15-1145425106
syte_ser78
2006-04-19 09:38
2006.05.14
динамический счетчик


2-1145768049
Holod
2006-04-23 08:54
2006.05.14
График


10-1118810923
Магнум
2005-06-15 08:48
2006.05.14
"The RPC server is unavailable"


6-1137928873
Юрий Ж.
2006-01-22 14:21
2006.05.14
[?]NET SEND


1-1141510569
Adolf
2006-03-05 01:16
2006.05.14
Запихнуть таблицу из MS Word в Delphi