Форум программистов, компьютерный форум, киберфорум
Alex_pac
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Delphi Простая градиентная заливка на WinApi

Запись от Alex_pac размещена 10.11.2012 в 05:05
Показов 11387 Комментарии 0
Метки delphi, winapi

Процедура градиентной заливки из 2 цветов

http://msdn.microsoft.com/en-u... 85%29.aspx << сабж

На самом деле можно еще заливать треугольником и не только 2 цветами, а гораздо больше, но в целях простоты только прямоугольник и 2 цвета стандарта TColor

А теперь о подводных камнях.

1) процедура в Delphi 7 объявлена неверно. Об этом тут >> http://edn.embarcadero.com/ru/article/38354

Раз она объявлена неверно, то принудительно объявим ее заново

Delphi
1
2
3
function GradientFill(DC: HDC; Vertex: Pointer; //PMyTriVertex
  dwNumVertex: ULONG; pMesh: Pointer;
  dwNumMesh, dwMode: ULONG): BOOL; stdcall; external 'Msimg32.dll';
2) Стуктура в Delphi 7 также имеет неверный формат:

Собственное объявление типов

Delphi
1
2
3
4
5
6
7
8
9
10
11
type
  MyCOLOR16 = Word;
  PMyTriVertex = ^TMyTriVertex;
  TMyTriVertex = packed record
    x: Longint;
    y: Longint;
    Red: MyCOLOR16;
    Green: MyCOLOR16;
    Blue: MyCOLOR16;
    Alpha: MyCOLOR16;
  end;
3) в Delphi XE это уже исправили, однако чтобы не тащить за собой типы PMyTriVertex которые нужны в Delphi 7, все равно вынуждены Принудительно объявлять GradientFill из 'Msimg32.dll' чтобы Vertex был задан как Pointer

Результат:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// совместимо с Delphi 7 - XE
 
function GradientFill(DC: HDC; Vertex: Pointer; //PMyTriVertex
  dwNumVertex: ULONG; pMesh: Pointer;
  dwNumMesh, dwMode: ULONG): BOOL; stdcall; external 'Msimg32.dll';
 
procedure Gradient2D(h: HWND; x1,y1:integer; color1: TColor; x2,y2:integer; color2:TColor; Vertical: boolean = false);
type
  MyCOLOR16 = Word;
  PMyTriVertex = ^TMyTriVertex;
  TMyTriVertex = packed record
    x: Longint;
    y: Longint;
    Red: MyCOLOR16;
    Green: MyCOLOR16;
    Blue: MyCOLOR16;
    Alpha: MyCOLOR16;
  end;
var
  t:array[0..1] of TMyTriVertex;
  tt: PMyTriVertex;
  g:TGradientRect;
  mode: Cardinal;
begin
  t[0].x:=x1;
  t[0].y:=y1;
  t[0].Red:=round((GetRValue(color1)/255)*65535);
  t[0].Green:=round((GetGValue(color1)/255)*65535);
  t[0].Blue:=round((GetBValue(color1)/255)*65535);
  t[0].Alpha:=0;
  t[1].x:=x2;
  t[1].y:=y2;
  t[1].Red:=round((GetRValue(color2)/255)*65535);
  t[1].Green:=round((GetGValue(color2)/255)*65535);
  t[1].Blue:=round((GetBValue(color2)/255)*65535);
  t[1].Alpha:=0;
  g.UpperLeft:=0;
  g.LowerRight:=1;
  tt:=@t[0];
  if Vertical then mode := GRADIENT_FILL_RECT_V else mode := GRADIENT_FILL_RECT_H;
  GradientFill(h,tt,2,@g,1,mode);
end;
Использование

Delphi
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Цвета расчитаны через APE Цветик
  Gradient2D(Canvas.Handle,0,0,14772545,100,100,16711935,false);
  Gradient2D(Canvas.Handle,100,0,14772545,200,100,16711935,true);
end;
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 1270
Размер:	15.0 Кб
ID:	1477
Вложения
Тип файла: zip gradient2.zip (392.5 Кб, 507 просмотров)
Метки delphi, winapi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru