Здравствуйте господа раздаботчики !
Решил в свободное время смоделировать [URL=http://www.gistoolkit.com/forum/messages/forum2/topic1746/message9533/#message9533]знак градиентой заливкой[/URL]
Так как рисовать используя объекты нереентабельно всвязи с длительным временем отрисовки (знак получается "тяжёлым") решил воспользоватся этим параметром:
[CODE] PImgContext = ^TImgContext;
TImgContext = packed record
Length : Integer; // Длина структуры для контроля (64 байт)
DC : THandle; // Контекст устройства вывода (для памяти в UNIX = 0)
View : Integer; // Тип отображения VT_SCREEN, VT_PRINT (maptype.h)
HView : THandle; // Идентификатор параметров устройства (не изменять)
Size : TSize; // Размер области отображения
Scale : Single; // Масштаб отображения относительно базового масштаба карты (для немасштабируемых объектов при увеличении карты всегда равен 1)
ScaleMethod : Integer; // Способ масштабирования (0 - картографический, 1 - чертежный, метод "лупы")
PixelX : Double; // Коэффициент пересчета микрон в пикселы устройства по горизонтали
PixelY : Double; // Коэффициент пересчета микрон в пикселы устройства по вертикали
SinAngle : Double; // Sin угла поворота карты // 19/09/01
CosAngle : Double; // Cos угла поворота карты
Angle : Double; // Угол поворота карты (против часовой стрелки)
Reserv1 : Integer; // Резерв = 0
Reserv2 : Integer; // Резерв = 0
end;[/CODE]
В частности:
DC : THandle; // Контекст устройства вывода (для памяти в UNIX = 0)
Всё работает отлично:
КОД:
[CODE]procedure DrawEllipse(DC : TCanvas; cPos : TImlPoint; Ra,Rb,Angle,offset : double;
InColor, OutColor : TColor);
var bc, pc : TColor;
i : integer;
dRx, dRY : double;
O : double;
begin
//RotateCanvas(DC.Handle, cPos, -angle);
pc:=DC.Pen.Color;
bc:=DC.Brush.Color;
dRx:= 0.1*Ra/2; dRy:= 0.1*Rb/2;
O:=(offset-50)/12;
for i:=10 downto 1 do
begin
DC.Brush.Color := SelectColor(InColor,OutColor,i,10);
DC.Pen.Color := DC.Brush.Color;
DC.Ellipse(Rect(Round(cPos.X-dRx*i+o*i),Round(cPos.Y-dRy*i),
Round(cPos.X+dRx*i+o*i),Round(cPos.Y+dRy*i)));
end;
// RotateCanvas(DC.Handle, cPos, angle);
DC.Brush.Color:=bc;
DC.Pen.Color := pc;
end;[/CODE]
НО функция RotateCanvas - закоментирована по причине:
Если я, начинаю вращать Канву, хендл которой передаётся мне структурой TImgContext вот таким вот образом:
[CODE]procedure RotateCanvas(DC : HDC; Center: TImlPoint; Angle : double);
var xForm : TXForm;
C : TPoint;
R,A : double;
begin
R := sqrt(sqr(Center.X)+sqr(Center.Y));
A := imlGetAngle(0,0, Center.X,Center.Y);
xForm.eM11 := cos(angle);
xForm.eM12 := sin(angle);
xForm.eM21 := -xForm.eM12;
xForm.eM22 := xForm.eM11;
xForm.eDx := -(R*cos(A+angle)-Center.X);
xForm.eDy := -(R*sin(A+angle)-Center.Y);
SetGraphicsMode(DC,GM_ADVANCED);
SetWorldTransform(DC, xForm);
end;[/CODE]
Всё окно карты становится чёрным.
Причина в строке кода [B]SetGraphicsMode(DC,GM_ADVANCED);[/B]
Вопрос, как выйти с ситуации?
П.С. При прорисовке на всех контекстах графики (HDC) подобного эффекта не наблюдается (даже если контексты сторонние и находятся в других приложениях)
Решил в свободное время смоделировать [URL=http://www.gistoolkit.com/forum/messages/forum2/topic1746/message9533/#message9533]знак градиентой заливкой[/URL]
Так как рисовать используя объекты нереентабельно всвязи с длительным временем отрисовки (знак получается "тяжёлым") решил воспользоватся этим параметром:
[CODE] PImgContext = ^TImgContext;
TImgContext = packed record
Length : Integer; // Длина структуры для контроля (64 байт)
DC : THandle; // Контекст устройства вывода (для памяти в UNIX = 0)
View : Integer; // Тип отображения VT_SCREEN, VT_PRINT (maptype.h)
HView : THandle; // Идентификатор параметров устройства (не изменять)
Size : TSize; // Размер области отображения
Scale : Single; // Масштаб отображения относительно базового масштаба карты (для немасштабируемых объектов при увеличении карты всегда равен 1)
ScaleMethod : Integer; // Способ масштабирования (0 - картографический, 1 - чертежный, метод "лупы")
PixelX : Double; // Коэффициент пересчета микрон в пикселы устройства по горизонтали
PixelY : Double; // Коэффициент пересчета микрон в пикселы устройства по вертикали
SinAngle : Double; // Sin угла поворота карты // 19/09/01
CosAngle : Double; // Cos угла поворота карты
Angle : Double; // Угол поворота карты (против часовой стрелки)
Reserv1 : Integer; // Резерв = 0
Reserv2 : Integer; // Резерв = 0
end;[/CODE]
В частности:
DC : THandle; // Контекст устройства вывода (для памяти в UNIX = 0)
Всё работает отлично:
КОД:
[CODE]procedure DrawEllipse(DC : TCanvas; cPos : TImlPoint; Ra,Rb,Angle,offset : double;
InColor, OutColor : TColor);
var bc, pc : TColor;
i : integer;
dRx, dRY : double;
O : double;
begin
//RotateCanvas(DC.Handle, cPos, -angle);
pc:=DC.Pen.Color;
bc:=DC.Brush.Color;
dRx:= 0.1*Ra/2; dRy:= 0.1*Rb/2;
O:=(offset-50)/12;
for i:=10 downto 1 do
begin
DC.Brush.Color := SelectColor(InColor,OutColor,i,10);
DC.Pen.Color := DC.Brush.Color;
DC.Ellipse(Rect(Round(cPos.X-dRx*i+o*i),Round(cPos.Y-dRy*i),
Round(cPos.X+dRx*i+o*i),Round(cPos.Y+dRy*i)));
end;
// RotateCanvas(DC.Handle, cPos, angle);
DC.Brush.Color:=bc;
DC.Pen.Color := pc;
end;[/CODE]
НО функция RotateCanvas - закоментирована по причине:
Если я, начинаю вращать Канву, хендл которой передаётся мне структурой TImgContext вот таким вот образом:
[CODE]procedure RotateCanvas(DC : HDC; Center: TImlPoint; Angle : double);
var xForm : TXForm;
C : TPoint;
R,A : double;
begin
R := sqrt(sqr(Center.X)+sqr(Center.Y));
A := imlGetAngle(0,0, Center.X,Center.Y);
xForm.eM11 := cos(angle);
xForm.eM12 := sin(angle);
xForm.eM21 := -xForm.eM12;
xForm.eM22 := xForm.eM11;
xForm.eDx := -(R*cos(A+angle)-Center.X);
xForm.eDy := -(R*sin(A+angle)-Center.Y);
SetGraphicsMode(DC,GM_ADVANCED);
SetWorldTransform(DC, xForm);
end;[/CODE]
Всё окно карты становится чёрным.
Причина в строке кода [B]SetGraphicsMode(DC,GM_ADVANCED);[/B]
Вопрос, как выйти с ситуации?
П.С. При прорисовке на всех контекстах графики (HDC) подобного эффекта не наблюдается (даже если контексты сторонние и находятся в других приложениях)