이곳에서 도움많이 받고 있는 초보입니다.
먼저 edit에 어떤 문자를 입력하고
이것을 별도의 창에 일테면shape나 스트링그리드같은거..
흑색으로 일종의 '전광판' 같이 글자를 뿌려줄수 있는 방법이 있을까요
그래서 그글자의 픽셀데이터를 추출하고자 합니다.
가로세로100개의 cell을 만들어놓고
edit에 입력된글자를 칸을흑색으로(다른색도 됨)채우면서 문자처럼 보이게하고
채워진 칸의 픽셀데이터를 추출할수 있는 방법이 궁금합니다.
답변 좀 부탁합니다.
그래서 만들어 보았습니다.
구현 방법은 간단합니다.
가로 세로 100Pixel 짜리 canvas에 글자를 적당한 크기로 출력합니다.
캔바스의 Pixel 하나를 읽어서 흰색이 아니면 Cell에 검정을 흰색이면 아무것도 출력 안하면 됩니다.
간단하죠...? 즐거운 시간 되십시요.
<< 소스 나갑니다. >>
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ExtCtrls, StdCtrls;
type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
Image1 : TImage;
StringGrid1 : TStringGrid;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
I: Integer;
J: Integer;
R : TRect;
begin
With Image1.Canvas do
Begin
Font.Assign( Edit1.Font );
end;
Image1.Canvas.Brush.Color := clWhite;
R := Rect(1,1,100,100);
Image1.Canvas.FillRect( R );
Windows.DrawText( Image1.Canvas.Handle,
PChar(Edit1.Text),
Length( Edit1.Text ),
R,
DT_WORDBREAK or DT_CENTER );
for I := 0 to Image1.Width do
for J := 0 to Image1.Height do
Begin
if Image1.Canvas.Pixels[ I, J ] <> clWhite then
StringGrid1.Cells[I,J]:= 'B'
Else
StringGrid1.Cells[I,J]:= '';
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Image1 := TImage.Create( Self );
Image1.Width := 100;
Image1.Height := 100;
Image1.Left := 24;
Image1.Top := 43;
Image1.Parent := Form2;
StringGRid1 := TStringGrid.Create( Self );
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
StringGrid1.Left := 10;
StringGrid1.Top := 151;
StringGrid1.Width := 409;
StringGrid1.Height := 305;
StringGrid1.ColCount := 100;
StringGrid1.RowCount := 100;
StringGrid1.DefaultColWidth := 3;
StringGrid1.DefaultRowHeight := 2;
StringGrid1.DefaultDrawing := False;
StringGrid1.OnDrawCell := StringGrid1DrawCell;
StringGrid1.Parent := Form2;
end;
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if TStringGrid( Sender ).Cells[ ACol, ARow ] = 'B' then
TStringGrid( Sender ).Canvas.Brush.Color := clBlack
Else
TStringGrid( Sender ).Canvas.Brush.Color := clWhite;
TStringGrid( Sender ).Canvas.FillRect( Rect );
end;
end.