Einzelnen Beitrag anzeigen

Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 22. Apr 2005, 12:23
Habs jetzt mit dem weiter unten angegebenen Code hinbekommen - mit dem Problem, das die Grafik das erzeugte Metafile nicht komplett ausfüllt. Die Grafik "hängt" links oben in dem Metafile, aber rechts und unten ist ein größerer Bereich nicht belegt. Was muss ich denn einstellen/berechnen, damit die Grafik das Metafile komplett ausfüllt?

Vielen Dank für eure Hilfe!

Delphi-Quellcode:
function GetFlowChartMetaFile(FC: TdxFlowChart): TMetafile;
var
  H, W, NewW: Integer;
  AAlign: TAlign;
  ABorder: TBorderStyle;
  SInfo: TScrollInfo;
  R: TRect;
  mCanvas: TMetaFileCanvas;
begin
  Result := TMetaFile.Create;
  mCanvas := TMetaFileCanvas.Create(Result,0);
  try
    H := FC.Height;
    W := FC.Width;
    AAlign := FC.Align;
    ABorder := FC.BorderStyle;
    SendMessage(FC.Parent.Handle, WM_SETREDRAW, 0, 0);
    SendMessage(FC.Handle, WM_SETREDRAW, 0, 0);
    FC.Align := alNone;
    FC.BorderStyle := bsNone;
    SInfo.cbSize := SizeOf(SInfo);
    SInfo.fMask := SIF_RANGE;
    if GetScrollInfo(FC.Handle, SB_HORZ, SInfo) then
      NewW := SInfo.nMax - SInfo.nMin + 1
    else
      NewW := 0;
    if GetScrollInfo(FC.Handle, SB_VERT, SInfo) then
      FC.ClientHeight := SInfo.nMax - SInfo.nMin + 1;
    if NewW > 0 then
      FC.ClientWidth := NewW;
    //
    Result.Width := FC.ClientWidth;
    Result.Height := FC.ClientHeight;
    //Result.mmWidth := FC.ClientWidth;
    //Result.mmHeight := FC.ClientHeight;
    mCanvas.Brush := FC.Brush;
    mCanvas.FillRect(FC.ClientRect);
    mCanvas.Lock;
    try
      FC.PaintTo(mCanvas.Handle, 0, 0);
    finally
      mCanvas.Unlock;
      FC.Width := W;
      FC.Height := H;
      FC.BorderStyle := ABorder;
      FC.Align := AAlign;
      SendMessage(FC.Parent.Handle, WM_SETREDRAW, 1, 0);
      SendMessage(FC.Handle, WM_SETREDRAW, 1, 0);
      R := FC.Parent.ClientRect;
      Windows.InvalidateRect(FC.Parent.Handle, @R, FALSE);
      R := FC.ClientRect;
      Windows.InvalidateRect(FC.Handle, @R, FALSE);
      mCanvas.Free;
    end;
  except
    Result.Free;
  end;
end;
Gruss
Jan (Herbie)
Jan Herbert
  Mit Zitat antworten Zitat