2013-10-31 4 views
0

필자는 약간의 TCard (사용자 정의 컴포넌트)를 가지고 있고 다시 그리기에서 카드에 몇 개의 텍스트를 그립니다. 동일한 컴포넌트가 맨 아래와 맨 위에 사용되었습니다. 그러나 아래쪽 TCards는 텍스트를 그릴 때 텍스트의 흰색 배경을 넣습니다. 상단의 tcards는 그렇지 않습니다.이 작업이 완료된 장소 나 이유가 확실하지 않습니다. enter image description here 둘 다 동일한 페인트를 사용합니다.텍스트 배경을 제거하는 방법?

확인 맨 아래 카드를 추가하여 시작합니다. 다음과 같이 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() 방법에서

답변

3

을 알려 주시기 바랍니다 .. 즉,이에 대한 모든 코드 생각, 텍스트를 그리기 전에, Canvas.Brush.Style := bsClear을 설정하거나 SetBkMode(Canvas.Handle, TRANSPARENT) 전화 직접. 현재 배경 그래픽이없는 경우에만 Brush.Style을 설정하고 배경 그래픽이 있으면 텍스트를 모두 그립니다.

현재로서는 Graphic <> nil에 대한 테스트로는 배경이 지정되었는지 여부를 확인할 수 없습니다. Graphic <> nil 일 때 Graphic.Empty을 확인해야합니다.

대신을 시도해보십시오

procedure Tcard.Paint; 
begin 
    Canvas.Brush.Style := bsClear; 

    if (FBackground.Graphic <> nil) and (not FBackground.Graphic.Empty) then 
    begin 
    Canvas.StretchDraw(ClientRect, FBackground.Graphic); 
    end else 
    begin 
    Canvas.Pen.Style := psDash; 
    Canvas.Rectangle(ClientRect); 
    end; 

    if (not ownercard) then 
    begin 
    if (not CSpell) then 
    begin 
     SetLpower(IntToStr(CPower)); //if monster card 
     SetLDefence(IntToStr(CDef)); //if monster card 
    end; 
    SetLCost(IntToStr(CCost)); 
    SetLText(CText); 
    end; 
end; 
+0

덕분에 나는이 시도를 줄 것이다. 그래픽에 관해서는, 그것이 비어 있건 없건간에 ... 그 배경 이미지를 그린 것처럼 .. 문제가 안된다.하지만 결과가 어떨지 시험해 보라. D –

+0

비 - 그래픽 '그래픽'은 비어있는 데이터를 포함 할 수있다. 그릴 것이 아무것도 없기 때문에'Graphic.Empty'를 확인해야합니다. –

+2

[왜 물어 봤습니까] (http://stackoverflow.com/q/19439202/757830)? – NGLN

관련 문제