Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1144698408
Галинка
2006-04-10 23:46
2006.05.14
Ищу книгу


2-1146025378
Юрик
2006-04-26 08:22
2006.05.14
Как сделать бегущую строку???


4-1140359306
Nick Denry
2006-02-19 17:28
2006.05.14
Как получить кусочек Background a?


2-1145705208
FunkyByte
2006-04-22 15:26
2006.05.14
Несколько вопросов про потоки и сообщения


2-1145793355
inri13666
2006-04-23 15:55
2006.05.14
System menu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский