Конференция "Основная" » SetWindowExtEx и смещение координат [D7]
 
  • 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 мучать.
  • han_malign © (05.02.19 11:56) [3]

    >  где получить это смещение?

    очевидно (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);
 
Конференция "Основная" » SetWindowExtEx и смещение координат [D7]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]