-
K-1000 © (30.01.19 18:44) [0]привет всем
делаю графический редактор на подобии Paint.
остановился на масштабировании холста.
в сети нашёл такой код масштабирования:procedure SetCanvasZoomFactor(Canvas: TCanvas; AZoomFactor: Integer);
var
i: Integer;
begin
SetStretchBltMode(Canvas.Handle, HALFTONE);
SetMapMode(Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(Canvas.Handle, AZoomFactor, AZoomFactor, nil);
SetViewportExtEx(Canvas.Handle, 100, 100, nil);
end;
всё работает хорошо, но только когда я рисую линии они смещены в сторону.
как это исправляется? где получить это смещение? -
K-1000 © (31.01.19 00:30) [1]Модераторы, перенесите пожалуйста тему в "Основное"
-
Сапёр (02.02.19 16:58) [2]Почему нельзя масштабировать битмап или векторные координаты примитивов? Лучше же, чем HDC мучать.
-
> где получить это смещение?
очевидно (Get/Set)(Window/Viewport)OrgEx
> как это исправляется?
- никак, там со смещением какой то глюк, вероятно связанный с ошибкой округления целочисленного вычисления.
Пробуй SetWorldTransform...
SetGraphicsMode(DC, GM_ADVANCED);
with _xform do begin
eM11:= AZoomFactor;
eM12:= 0.0;
eM21:= 0.0;
eM22:= AZoomFactor;
eDx:= XOffset;
eDy:= YOffset;
end;
SetWorldTransform(DC, _xform);
GetBrushOrgEx(DC, pt);
SetStretchBltMode(DC, HALFTONE);
SetBrushOrgEx(DC, pt.x, pt.y, @pt);