各位朋友,帮忙看看坐标转换的问题,我的目的是实现线条放大两倍(P1(0,0),P2(50,50)),但是无法实现?var
  DC, MemDC: HDC;
  MemBitmap, OldBitmap: HBITMAP;
  TmpRect:TRect;
  Zoom:Real;
begin
  Zoom := 2;
  TmpRect.Left  :=0;
  TmpRect.Top   :=0;
  TmpRect.Right :=Round(200*Zoom);
  TmpRect.Bottom:=Round(200*Zoom);
  try
    DC := GetDC(0);
    MemBitmap := CreateCompatibleBitmap(DC,TmpRect.Right,TmpRect.Bottom);
  finally
    ReleaseDC(0, DC);
  end;  MemDC := CreateCompatibleDC(0);
  OldBitmap := SelectObject(MemDC, MemBitmap);
  try
    try
      SetMapMode(MemDC, MM_ANISOTROPIC);//MM_ISOTROPIC
      SetWindowExtEx(MemDC, 200, 200, nil);
      SetViewPortExtEx(MemDC,TmpRect.Right,TmpRect.Bottom, nil);      SelectObject (MemDC, GetStockObject (WHITE_PEN));
      MoveToEx(MemDc,0,0,0);
      LineTo(MemDc,50,50);
    finally
      //TmpCvs.Free;
    end;    DC := GetDC(Handle);
    BitBlt(Dc, 0, 0, 200,200, MemDC, 0, 0, SRCCOPY);
  finally
    ReleaseDC(Handle,Dc);
    SelectObject(MemDC, OldBitmap);
    DeleteDC(MemDC);
    DeleteObject(MemBitmap);
  end;
end;后来我在不使用内存位图的情况下,又可以实现放大操作
     SetMapMode(Canvas.Handle, MM_ISOTROPIC);//MM_ISOTROPIC
    SetWindowExtEx(Canvas.Handle, 100, 100, nil);
    SetViewPortExtEx(Canvas.Handle,400 ,400 , nil);    Canvas.Pen.Style := psSolid;
    Canvas.moveto(0,0);
    Canvas.lineto(50,50);
为什么呢?

解决方案 »

  1.   

    修改成如下可以缩放了!
    var
      DC, MemDC,SavedDC: HDC;
      MemBitmap, OldBitmap: HBITMAP;
      NewPen,OldPen:Integer;
      Zoom:Integer;
    begin
      Zoom := StrToInt(edtZoom.Text);
      try
        DC := GetDC(0);
        MemBitmap := CreateCompatibleBitmap(DC,800,600);
      finally
        ReleaseDC(0, DC);
      end;  MemDC := CreateCompatibleDC(Canvas.Handle);
      OldBitmap := SelectObject(MemDC, MemBitmap);
      try
        SavedDC := SaveDC(MemDC);
        try
          SetMapMode(MemDC, MM_ANISOTROPIC);
          SetWindowExtEx(MemDC, 100, 100, nil);
          SetViewPortExtEx(MemDC,Zoom,Zoom, nil);      SelectObject(MemDC,GetStockObject(BLACK_BRUSH)) ;
          SelectObject(MemDC,GetStockObject(WHITE_PEN));
          NewPen:= CreatePen(PS_SOLID,1,clWhite);
          OldPen := SelectObject(MemDc,NewPen);      MoveToEx(MemDc,0,0,0);
          LineTo(MemDC,50,50);
        finally
          SelectObject(MemDc,OldPen);
          DeleteObject(NewPen);
          RestoreDC(MemDC, SavedDC);    
        end;    DC := GetDC(Handle);
        BitBlt(Dc, 20, 50, 200,200, MemDC, 0, 0, SRCCOPY);
      finally
        ReleaseDC(Handle,Dc);
        SelectObject(MemDC, OldBitmap);
        DeleteDC(MemDC);
        DeleteObject(MemBitmap);
      end;