Newsgroup: it.comp.programmare.win32
Titolo: [C++ Builder] Metafile

Ho dei problemi con la grafica del C++ Builder 6 Professional.
Che differenza c'e' tra una Bitmap e un Metafile?
Per allocare una bitmap scrivo:
Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
Per allocare un metafile e' corretto scrivere cosi?
Graphics::TPicture *MetaFile=new Graphics::TPicture;
Se compilo NON da errore, pero' quando uso StretchDraw() se scrivo
StretchDraw(R,MetaFile->Bitmap)
non da errore ma NON appare nulla.
Inoltre ho notato che se uso CopyRect() su una TImage sulla TImage si
verifica un fastidioso SFARFALLIO, mi sembra che con il C++ Builder 3
lo sfarfallio NON c'era, e' un difetto della versione 6 del C++ Builder?
Ringrazio tutti coloro che mi risponderanno.

 e' un difetto della versione 6 del C++ Builder?
Ne dubito.
HTH,
-- 
Stefano Frosio
www.esse-effe.com
 

 problema, altrimenti si possono solo fare supposizioni.
Il codice e' il seguente, l'intenzione e' disegnare un rettangolo XOR.
Per disegnare i 4 segmenti del rettangolo uso 4 Rect(), esiste un
sistema migliore?
x1=MouseStartX; y1=MouseStartY;
x2=X; y2=Y;
R1=Rect(x1,y1,x2,y1+1);
R2=Rect(x1,y2,x2,y2-1);
R3=Rect(x1,y1,x1-1,y2);
R4=Rect(x2,y1,x2+1,y2);
ImageFoglio->Canvas->CopyMode=cmDstInvert;
ImageFoglio->Canvas->CopyRect(R1,ImageFoglio->Canvas,R1);
ImageFoglio->Canvas->CopyRect(R2,ImageFoglio->Canvas,R2);
ImageFoglio->Canvas->CopyRect(R3,ImageFoglio->Canvas,R3);
ImageFoglio->Canvas->CopyRect(R4,ImageFoglio->Canvas,R4);

 sistema migliore?
ImageFoglio->Canvas->Rectangle(x1, y1, x2, y2);
-- 
Stefano Frosio
www.esse-effe.com
 

 ImageFoglio->Canvas->Rectangle(x1, y1, x2, y2);
Ma in quel modo il rettangolo non viene combinato con uno XOR con il
contenuto di "ImageFoglio" sottostante il rettangolo.
E' possibile disegnare segmenti (anche diagonali) che si combinino
con uno XOR con il contenuto sottostante?

 con uno XOR con il contenuto sottostante?
Basta impostare opportunamente la proprietą TPen::Mode, ad 
esempio:
ImageFoglio->Canvas->Pen->Mode = pmXor;


 ImageFoglio->Canvas->Pen->Mode = pmXor;
Grazie.
Credo di aver risolto il piccolo problema con Polyline(), pero' il
fastidioso SFARFALLIO continua a esserci, c'e' un modo per eliminarlo?

 eliminarlo?
Senza sapere nulla del tuo programma e senza un esempio di 
codice *compilabile* che riproduca il difetto non č facile 
aiutarti. In generale č sempre meglio "disegnare" in memoria e 
poi copiare il canvas a video (sul form, su una TImage o dove 
stai visualizzando tu). Spesso perņ servono accorgimenti 
specifici.
-- 
Stefano Frosio
www.esse-effe.com
 

 servono accorgimenti specifici.
Di seguito riporto l'intero programma.
Quando si clicca su "ImageFoglio" e si sposta il mouse tenendo premuto
il pulsante del mouse viene disegnato un rettangolo xor.
Mentre viene disegnato il rettangolo si verifica lo sfarfallio.
//--------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Etichette_main.h"
//--------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
AnsiString  Azione="";
Graphics::TMetafile *MetaFile=new Graphics::TMetafile;
int   MouseX,MouseY,MouseStartX,MouseStartY;
int   VecchioX,VecchioY;
bool  PrimaVolta=true;
//--------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
   : TForm(Owner)
{
}
//--------------------------------------------------------------
void __fastcall TMainForm::Esci1Click(TObject *Sender)
{
   Application->Terminate();
}
//-------------------------------------------------------------
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
   MainForm->Top=0;
   MainForm->Left=0;
   MainForm->Width=1024;
   MainForm->Height=737;
   DisegnaFoglio();
}
//--------------------------------------------------------------
void TMainForm::DisegnaFoglio()
{
int   x,y;
   ImageFoglio->Canvas->Brush->Color=clWhite;
   ImageFoglio->Canvas->FillRect(Rect(0,0,
      ImageFoglio->Width,ImageFoglio->Height));
   ImageFoglio->Canvas->Rectangle(Rect(0,0,
      ImageFoglio->Width,ImageFoglio->Height));
   for (x=12;x<970;x+=12)
      for (y=12;y<545;y+=12)
         ImageFoglio->Canvas->Pixels[x][y]=clBlack;
}
//--------------------------------------------------------------
void __fastcall TMainForm::ImmaginiClick(TObject *Sender)
{
   ImageFoglio->Cursor=crCross;
}
//--------------------------------------------------------------
void __fastcall TMainForm::BitBtn7Click(TObject *Sender)
{
   ImageFoglio->Cursor=crCross;
   if (!OpenPictureDialog1->Execute()) return;
   MetaFile->LoadFromFile(OpenPictureDialog1->FileName);
   Azione="Immagine";
}
//--------------------------------------------------------------
void __fastcall TMainForm::ImageFoglioClick(TObject *Sender)
{
int   MouseX0,MouseY0;
   if (Azione=="Immagine")
   {
      MouseX0=MouseX; MouseY0=MouseY;
      ImageFoglio->Canvas->Pen->Color=clBlack;
      ImageFoglio->Canvas->Brush->Color=clBlack;
      ImageFoglio->Canvas->FrameRect(Rect(MouseX0,MouseY0,
         MouseX,MouseY));
   }
}
//--------------------------------------------------------------
void TMainForm::DisegnaRettangoloXor(int X,int Y)
{
int   x1,y1,x2,y2;
TPoint points[5];
   if (PrimaVolta)
   {
      ImageFoglio->Canvas->Brush->Color=clBlack;
      ImageFoglio->Canvas->Pen->Mode=pmCopy;
      ImageFoglio->Canvas->FrameRect(Rect(
         MouseStartX,MouseStartY,X,Y));
      VecchioX=X; VecchioY=Y;
      PrimaVolta=false;
      return;
   }
   else
   {
      x1=MouseStartX; y1=MouseStartY;
      x2=VecchioX; y2=VecchioY;
      points[0]=Point(x1,y1);
      points[1]=Point(x2,y1);
      points[2]=Point(x2,y2);
      points[3]=Point(x1,y2);
      points[4]=Point(x1,y1);
      ImageFoglio->Canvas->Pen->Mode=pmNotXor;
      ImageFoglio->Canvas->Polyline(points,4);
      x1=MouseStartX; y1=MouseStartY;
      x2=X; y2=Y;
      points[0]=Point(x1,y1);
      points[1]=Point(x2,y1);
      points[2]=Point(x2,y2);
      points[3]=Point(x1,y2);
      points[4]=Point(x1,y1);
      ImageFoglio->Canvas->Pen->Mode=pmNotXor;
      ImageFoglio->Canvas->Polyline(points,4);
      VecchioX=X; VecchioY=Y;
   }
}
//-------------------------------------------------------------
void __fastcall TMainForm::ImageFoglioMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
   MouseX=X;
   MouseY=Y;
   if (Azione=="Trascinamento")
   {
      DisegnaRettangoloXor(X,Y);
   }
}
//------------------------------------------------------------
void __fastcall TMainForm::ImageFoglioMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   MouseStartX=X; MouseStartY=Y;
   Azione="Trascinamento";
}
//--------------------------------------------------------------
void __fastcall TMainForm::ImageFoglioMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
TRect R;
   Azione="";
   PrimaVolta=true;
   R=Rect(MouseStartX,MouseStartY,X,Y);
   ImageFoglio->Canvas->CopyMode=cmSrcCopy;
   ImageFoglio->Canvas->StretchDraw(R,MetaFile);
}
//-----------------------------------------------------------------

 Di seguito riporto l'intero programma.
S� infatti, non � n� un esempio n� tantomeno compilabile.
Comunque ho estratto quasi tutto e ho provato: riesco a 
disegnare i rettangoli senza avere sfarfallii di alcun tipo. 
Evidentemente c'� qualcos'altro che causa il difetto...
-- 
Stefano Frosio
www.esse-effe.com
 

 qualcos'altro che causa il difetto...
Puoi dirmi che versione del C++ Builder usi?
Mi sembra che con il C++ Builder 3 lo sfarfallio NON c'era, si tratta
di un difetto della versione 6?

 si tratta di un difetto della versione 6?
Avevi lo stesso dubbio la scorsa volta e la versione non 
c'entrava nulla. Prova a semplificare il codice per individuare 
la causa dello sfarfallio, oppure, ripeto, prepara (partendo da 
zero) un esempio *semplice* e *compilabile* che riproduca il 
difetto. Anche perch� vedendo la parte che hai postato qualche 
dubbio mi viene, per esempio mi pare che usi Polyline per 
disegnare un rettangolo...
-- 
Stefano Frosio
www.esse-effe.com
 

 per disegnare un rettangolo...
E' come immaginavo, ho compilato il programma sotto C++ Builder 3 e lo
sfarfallio NON c'e'.
Te che versione del C++ Builder usi?

 Te che versione del C++ Builder usi?
Ho provato con diverse versioni. Il problema � che il tuo 
programma ha diversi punti critici/ambigui. I pochi suggerimenti 
che ti ho dato mi pare siano stati ignorati. Insomma, se in un 
caso funziona e in un altro no verificherei come prima cosa il 
programma stesso. Tutto questo ovviamente IMVHO.
-- 
Stefano Frosio
www.esse-effe.com
 

 IMVHO.
Scusa ma hai provato con la versione 6?
Che significa "IMVHO" ?