필자는 약간의 TCard (사용자 정의 컴포넌트)를 가지고 있고 다시 그리기에서 카드에 몇 개의 텍스트를 그립니다. 동일한 컴포넌트가 맨 아래와 맨 위에 사용되었습니다. 그러나 아래쪽 TCards는 텍스트를 그릴 때 텍스트의 흰색 배경을 넣습니다. 상단의 tcards는 그렇지 않습니다.이 작업이 완료된 장소 나 이유가 확실하지 않습니다. 둘 다 동일한 페인트를 사용합니다.텍스트 배경을 제거하는 방법?
확인 맨 아래 카드를 추가하여 시작합니다. 다음과 같이 TCard의 재 페인트가 바닥 에 카드를 보여줍니다
// gets all your starting cards and puts them into the corret rows.
procedure TFGame.GetStartingCards;
const
ManaTypes : array [0..3] of string = ('Lava','Water','Dark','Nature');
var
i: integer;
z:integer;
Cards: TObjectList<Tcard>;
begin
// showmessage('list being created');
Cards := TObjectList<TCard>.Create;
z:=0;
// add all tcards (Desgin) to this list in order Lava,water,dark,nature
cards.Add(cardLava1);
cards.Add(cardlava2);
cards.Add(cardlava3);
cards.Add(cardlava4);
cards.Add(cardwater1);
cards.Add(cardwater2);
cards.Add(cardwater3);
cards.Add(cardwater4);
cards.Add(carddark1);
cards.Add(carddark2);
cards.Add(carddark3);
cards.Add(carddark4);
cards.Add(cardnature1);
cards.Add(cardnature2);
cards.Add(cardnature3);
cards.Add(cardnature4);
//get data from DB
for i := 0 to Length(ManaTypes) - 1 do
begin
// showmessage('getting manna types');
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('SELECT TOP 4 * FROM Cards WHERE Color = "'+ManaTypes[i]+'" ORDER BY Rnd(-(1000*ID)*Time())');
open;
end;
//return the result of everything for giving mana type..
if adoquery1.RecordCount = 0 then
Showmessage('Error no cards in db');
adoquery1.First;
while not adoquery1.Eof do
begin
///showmessage('writeing query to card '+inttostr(z));
cards[z].Cname := adoquery1.FieldByName('Name').AsString;
cards[z].Ccost := adoquery1.Fieldbyname('Cost').AsInteger;
cards[z].Ctext := adoquery1.FieldByName('Text').AsString;
cards[z].Ccolor := adoquery1.FieldByName('Color').AsString;
cards[z].Cinplay := false; //in the play area
if adoquery1.fieldbyname('Power').asstring <> '' then
cards[z].Cpower := adoquery1.FieldByName('Power').AsInteger;
if adoquery1.fieldbyname('Def').asstring <> '' then
cards[z].Cdef := adoquery1.FieldByName('Def').AsInteger;
if adoquery1.FieldByName('Type').AsString = 'Spell' then
cards[z].Cspell := true
else
cards[z].Cspell := false;
if adoquery1.FieldByName('Target').AsString = 'yes' then
cards[z].SetTargetTrue
else
cards[z].settargetfalse;
//based on color change background
if cards[z].Ccolor = 'Lava' then
cards[z].Background.loadfromfile(maindir+'\pics\lava.png');
if cards[z].Ccolor = 'Water' then
cards[z].Background.loadfromfile(maindir+'\pics\water.png');
if cards[z].Ccolor = 'Dark' then
cards[z].Background.loadfromfile(maindir+'\pics\dark.png');
if cards[z].Ccolor = 'Nature' then
cards[z].Background.loadfromfile(maindir+'\pics\nature.png');
adoquery1.Next;
cards[z].repaint;
z:=z+1;
end;
end;
end;
..
{TCard paint procedure}
//------------------------------------------------------------
procedure Tcard.Paint;
//------------------------------------------------------------
begin
Canvas.StretchDraw(ClientRect, FBackground.Graphic);
if FBackground.Graphic = nil then
begin
Canvas.Brush.Style := bsClear;
Canvas.Pen.Style := psDash;
Canvas.Rectangle(ClientRect);
end ;
if (FBackground.Graphic <> nil) and (ownercard = false) then
begin
if (CSpell = false) then
begin
SetLpower(inttostr(CPower)); //if monster card
SetLDefence(inttostr(CDef)); //if monster card
end;
SetLCost(inttostr(CCost));
setLText(CText);
end;
end;
모든 도면 번호에
/shows the form and sets up the cards.
procedure TFGame.FormShow(Sender: TObject);
var i: integer;
num : TValue;
db: widestring;
begin
Maindir := label1.Caption; //sets main dir
db:= maindir;
waitingforatarget := false;
//Sets all oponents cards.
OCardRed.background.loadfromfile(Maindir+'\pics\backcard.jpg');
//..........
//sets yoru cards
Cardlava1.background.loadfromfile(Maindir+'\pics\backcard.jpg');
Cardlava1.Repaint;
//....
getstartingcards;
end;
getstartingcards은 .. 이런 식이다. 이 번호는 센터 번호이지만 모두 동일 함
{Sets and draws the cost to the TCard}
//-------------------------------------------------------------
procedure TCard.SetLCost(value :string); //cost
//-------------------------------------------------------------
begin
if fbigcard = false then
begin
canvas.font.size := 8;
Canvas.textout(19,1,inttostr(CCost));
end
else
begin
canvas.font.size := 12;
canvas.font.color := TColor($FFFFFF);
Canvas.textout(65,7,inttostr(CCost));
canvas.Font.Color := CLBlack;
end;
end;
,451,515,
난 당신이 내가 놓친 거지 뭔가를 필요로하는 경우 나 감사 에게 글렌
구성 요소의Paint()
방법에서
덕분에 나는이 시도를 줄 것이다. 그래픽에 관해서는, 그것이 비어 있건 없건간에 ... 그 배경 이미지를 그린 것처럼 .. 문제가 안된다.하지만 결과가 어떨지 시험해 보라. D –
비 - 그래픽 '그래픽'은 비어있는 데이터를 포함 할 수있다. 그릴 것이 아무것도 없기 때문에'Graphic.Empty'를 확인해야합니다. –
[왜 물어 봤습니까] (http://stackoverflow.com/q/19439202/757830)? – NGLN