Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Плохое поведение градиента в Delphi   Найти похожие ветки 

 
Агент Х-СОМ ©   (2005-06-04 21:22) [0]

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

Мне надо было создать градиентную панель. Для реализации задачи я решил создать компонент-наследник TPaintBox, создав ему дополнительные свойства BeginColor, EndColor, Direction, NumOfColors. NumOfColors изначально был не более 255. Быстернько наваяв компонент своим алгоритмом, я вставил его на форму и получил, так сказать, не совсем то, что хотел: вместо плавного градиента, к которому я счтремился я получил градиент ребристый, в котором цвета переходят не плавно, а как-то блоками (бывает, что попадаются не те оттенки цвета). Я попробовал увеличить NumOfColors - не помогло. Чужие алгоритмы выдавали примерно тот же результат.

Тогда я попробовал нарисовать панельку в фотошопе и поместь бмпэху в стандартный Image. Как ни странно, бмпэха в имэйдже выглядела примерно также. Странно, ведь компонент TImage корректно отображают всю 24-битную палитру. Таким же образом рисунок отображает Paint, но ACDSee видит все корректно. При этом градиент, созданный моим алгоритм (уже смешанным с чужими алгоритмами) сохраняется в таком же кривом формате.

Вопрос в следующем: что энто за ботва и как с ней бороться? Ведь ребристый градиент - энто как-то не серьезно.

З.Ы. суть алгоритма в том, что сначала заполняется массив промежуточных цветов, а потом рисуются линии на Канвасе.
Вот каким образом идет заполнение массива:

procedure TGradientBox.CalColor;
var
 BeginRGB: array[0..2] of Byte;
 RGBDifference: array[0..2] of Integer;
 i: Integer;
 R, G, B: Byte;
 startRGB, RGBDiff : integer;
begin
 BeginRGB[0] := GetRValue(ColorToRGB(FBeginColor));
 BeginRGB[1] := GetGValue(ColorToRGB(FBeginColor));
 BeginRGB[2] := GetBValue(ColorToRGB(FBeginColor));

 RGBDifference[0] := GetRValue(ColorToRGB(FEndColor)) - BeginRGB[0];
 RGBDifference[1] := GetGValue(ColorToRGB(FEndColor)) - BeginRGB[1];
 RGBDifference[2] := GetBValue(ColorToRGB(FEndColor)) - BeginRGB[2];

 for i := 0 to NbCouleursMax do begin
   R := BeginRGB[0] + MulDiv(i, RGBDifference[0], FNumberOfColors - 1);
   G := BeginRGB[1] + MulDiv(i, RGBDifference[1], FNumberOfColors - 1);
   B := BeginRGB[2] + MulDiv(i, RGBDifference[2], FNumberOfColors - 1);
   Colors[i] := RGB(R, G, B);
 end;        
end;


 
Sun bittern ©   (2005-06-04 21:29) [1]

Можешь использовать готовую реализацию от MS - Gdi Plus

GdiPlus.dll поставляется с WinXP, но данная библиотека будет работать и под Win98. Заголовочный файл к библиотеке можешь найти на DelphiGFX. Примеры можно найти в MSDN или в инете.


 
Агент Х-СОМ ©   (2005-06-05 21:30) [2]

Большое спасибо за совет - попробую этот вариант


 
Чапаев ©   (2005-06-06 10:46) [3]

> GdiPlus.dll поставляется с WinXP, но данная библиотека будет работать и под Win98.
То есть? Если я возьму gdiplus.dll из-под ХР и перенесу на 98+, то её можно будет использовать?


 
Агент Х-СОМ ©   (2005-06-06 18:20) [4]


> То есть? Если я возьму gdiplus.dll из-под ХР и перенесу
> на 98+, то её можно будет использовать?

Как я понимаю, то еси взять библиотеку и поместить ее вместе с прогой (или заменить в системной папке), то библиотека обработается корректно



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.039 c
3-1116167047
кофейник
2005-05-15 18:24
2005.06.29
Перенос базы на другой сервер


5-1088037452
xerx
2004-06-24 04:37
2005.06.29
потомок ListView


14-1117599953
emfw
2005-06-01 08:25
2005.06.29
Стоимость АИС


14-1117631264
Kerk
2005-06-01 17:07
2005.06.29
Тополинный пух...


9-1111489083
Xeno
2005-03-22 13:58
2005.06.29
Деформация





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский