안녕하세요 누구나 그림을 문자열 표의 배경으로 표시 할 수 있는지 알고 계신지, 아니면 누구든지이 작업을 수행 할 수있는 무료 그리드 구성 요소를 알고 계신 것입니다.배경에 그림이있는 Delphi StringGrid
감사
콜린
안녕하세요 누구나 그림을 문자열 표의 배경으로 표시 할 수 있는지 알고 계신지, 아니면 누구든지이 작업을 수행 할 수있는 무료 그리드 구성 요소를 알고 계신 것입니다.배경에 그림이있는 Delphi StringGrid
감사
콜린
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
는 네, 가능합니다. TStringGrid는 TDrawGrid에서 상속 받고 모든 드로잉은 자체적으로 수행합니다. OnDrawCell 이벤트를 사용하여 사용자 지정 그리기를 수행 할 수 있습니다.
실제로 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;
당신이 다음뿐만 아니라 세포의 이미지를 그릴 두 가지 기술을 결합하려는 경우
. 안드레아스가 자식을 선언하는 이벤트를 사용하므로 병합에 큰 어려움을 초래해서는 안됩니다.tstringgrid 코드를 별도의 단위 (예 : nglncontrol)로 옮기는 것은 단위를 USES 절에 마지막으로 넣거나 형식 선언 (형식 선언 앞에 TStringGrid = nglncontrol.TStringGrid를 입력하는 경우)을 사용하여 제대로 작동합니다). 나는 후자를 사용한다. –
좋은 답변이지만 TDrawGrid에서 상속되므로 TStringGrid에서도 작동합니다. – GolezTrol
@GolezTrol : 좋은 지적입니다. –
@David, et al : 나는 잘 모르겠다 : 우선 BitBlt가 소스 비트 맵에없는 픽셀을 읽도록하지 말아야한다고 생각했지만, 함수는이 종류의 입력을 가장 친절한 방법으로 처리 할 수 있습니다. 즉, "잘못된"입력 (문자열의 길이로 'MaxInt'를 지정하는 'Copy'와 같은)을 수정합니다. 이 문제에 대해 저에게 계몽 주실 수 있습니까? –