2011-03-12 5 views
3

안녕하세요 누구나 그림을 문자열 표의 배경으로 표시 할 수 있는지 알고 계신지, 아니면 누구든지이 작업을 수행 할 수있는 무료 그리드 구성 요소를 알고 계신 것입니다.배경에 그림이있는 Delphi StringGrid

감사

콜린

답변

12

FBg 양식 클래스 (A TBitmap입니다 당신은 TDrawGrid (또는 TStringGrid), 소유자 그리기를 지원하고

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FBg := TBitmap.Create; 
    FBg.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\Sample.bmp'); 
end; 

을 사용할 수 있습니다 예를 들어), 다음을 수행하십시오.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    r: TRect; 
begin 
    if not (Sender is TStringGrid) then Exit; 
    BitBlt(TStringGrid(Sender).Canvas.Handle, 
     Rect.Left, 
     Rect.Top, 
     Rect.Right - Rect.Left, 
     Rect.Bottom - Rect.Top, 
     FBg.Canvas.Handle, 
     Rect.Left, 
     Rect.Top, 
     SRCCOPY); 
    if gdSelected in State then 
    InvertRect(TStringGrid(Sender).Canvas.Handle, Rect); 
    r := Rect; 
    TStringGrid(Sender).Canvas.Brush.Style := bsClear; 
    DrawText(TStringGrid(Sender).Canvas.Handle, 
      TStringGrid(Sender).Cells[ACol, ARow], 
      length(TStringGrid(Sender).Cells[ACol, ARow]), 
      r, 
      DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS); 
end; 

Sample Screenshot http://privat.rejbrand.se/drawgridbg.png Sample Screenshot http://privat.rejbrand.se/drawgrid2.png Sample Screenshot http://privat.rejbrand.se/drawgrid3.png

+5

좋은 답변이지만 TDrawGrid에서 상속되므로 TStringGrid에서도 작동합니다. – GolezTrol

+0

@GolezTrol : 좋은 지적입니다. –

+0

@David, et al : 나는 잘 모르겠다 : 우선 BitBlt가 소스 비트 맵에없는 픽셀을 읽도록하지 말아야한다고 생각했지만, 함수는이 종류의 입력을 가장 친절한 방법으로 처리 할 수 ​​있습니다. 즉, "잘못된"입력 (문자열의 길이로 'MaxInt'를 지정하는 'Copy'와 같은)을 수정합니다. 이 문제에 대해 저에게 계몽 주실 수 있습니까? –

1

는 네, 가능합니다. TStringGrid는 TDrawGrid에서 상속 받고 모든 드로잉은 자체적으로 수행합니다. OnDrawCell 이벤트를 사용하여 사용자 지정 그리기를 수행 할 수 있습니다.

4

실제로 Andreas Rejbrand의 코드에 대한 그의 논평에서 rossmcm의 분명한 질문에 실제로 답하고 있지만, 원래 질문에 대한 답변도 보완합니다. 다음과 같이 여전히 StringGrid 제어 범위 내에서 그리드 경계를 넘어 이미지를 그리기

을 달성 할 수있다 :

type 
    TStringGrid = class(Grids.TStringGrid) 
    private 
    FGraphic: TGraphic; 
    FStretched: Boolean; 
    function BackgroundVisible(var ClipRect: TRect): Boolean; 
    procedure PaintBackground; 
    protected 
    procedure Paint; override; 
    procedure Resize; override; 
    procedure TopLeftChanged; override; 
    public 
    property BackgroundGraphic: TGraphic read FGraphic write FGraphic; 
    property BackgroundStretched: Boolean read FStretched write FStretched; 
    end; 

    TForm1 = class(TForm) 
    StringGrid: TStringGrid; 
    Image: TImage; 
    procedure FormCreate(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TStringGrid } 

function TStringGrid.BackgroundVisible(var ClipRect: TRect): Boolean; 
var 
    Info: TGridDrawInfo; 
    R: TRect; 
begin 
    CalcDrawInfo(Info); 
    SetRect(ClipRect, 0, 0, Info.Horz.GridBoundary, Info.Vert.GridBoundary); 
    R := ClientRect; 
    Result := (ClipRect.Right < R.Right) or (ClipRect.Bottom < R.Bottom); 
end; 

procedure TStringGrid.Paint; 
begin 
    inherited Paint; 
    PaintBackground; 
end; 

procedure TStringGrid.PaintBackground; 
var 
    R: TRect; 
begin 
    if (FGraphic <> nil) and BackgroundVisible(R) then 
    begin 
    with R do 
     ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom); 
    if FStretched then 
     Canvas.StretchDraw(ClientRect, FGraphic) 
    else 
     Canvas.Draw(0, 0, FGraphic); 
    end; 
end; 

procedure TStringGrid.Resize; 
begin 
    inherited Resize; 
    PaintBackground; 
end; 

procedure TStringGrid.TopLeftChanged; 
begin 
    inherited TopLeftChanged; 
    PaintBackground; 
end; 

{ TForm1 } 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    // Usage: 
    StringGrid.BackgroundGraphic := Image.Picture.Graphic; 
    StringGrid.BackgroundStretched := True; 
end; 

당신이 다음뿐만 아니라 세포의 이미지를 그릴 두 가지 기술을 결합하려는 경우

. 안드레아스가 자식을 선언하는 이벤트를 사용하므로 병합에 큰 어려움을 초래해서는 안됩니다.

+0

tstringgrid 코드를 별도의 단위 (예 : nglncontrol)로 옮기는 것은 단위를 USES 절에 마지막으로 넣거나 형식 선언 (형식 선언 앞에 TStringGrid = nglncontrol.TStringGrid를 입력하는 경우)을 사용하여 제대로 작동합니다). 나는 후자를 사용한다. –

관련 문제