Condividi:        

Librerie VCL

Discussioni e opinioni costruttive sul mondo dell'informatica.
Per la soluzione di problemi specifici fare riferimento alle sezioni di assistenza!

Moderatori: aurelio37, Anthony47, axelrox

Librerie VCL

Postdi rayden » 04/02/03 14:33

Ho bisogno di conoscere il modo per ridisegnare la grafica delle librerie VCL, so che si può fare, ma non so come.

Se qualcuno ha qualche idea o sa come fare posti...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Sponsor
 

Postdi zello » 04/02/03 15:58

Non so una cippa delle VCL. Con l'SDK, la cosa che mi verrebbe in mente sarebbe:
- fare il subclassing della window procedure del controllo con una mia procedura
- in questa procedura, gestire i messaggi WM_PAINT e WM_NCPAINT (più altri minori) disegnando il tubo che mi pare a me, senza passare i messaggi alla procedura originaria
- passare tutti gli altri alla proc. originaria.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi rayden » 04/02/03 18:33

ecco appunto, sono pienamente capace di sovraccaricare le funzioni di Paint dei componenti, il mio poblema è usare WM_PAINT e WM_NCPAINT
una volta che ho sovraccaricato le funzioni di stampa come faccio a stampare ciò che voglio? Mi spiego qale il problema? Sovraccarico le funzioni, ma non sono capace di creare il codice nella funzione per ristampare tutto.

Es. in C++Builder uso il codice seguente:

TControlCanvas *TVCanvas;

/*nella sezione public dello stesso file aggiungere il distruttore del componente e un nuova funzione di disegno:*/

__fastcall TComponente::~TComponente();
virtual void __fastcall Disegna(TMessage &Message);

/*infine nella sezione published aggiungere:*/

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_PAINT, TMessage, Disegna);
END_MESSAGE_MAP(TComponente)

/*Nel file del componente, invece, aggiungere le seguenti righe nel costruttore del componente:/*

TVCanvas = new TControlCanvas();
TVCanvas->Control = this;
TVCanvas->Brush->Style = bsClear;

/*nel distruttore del componente invece*/

delete TVCanvas;

/*aggiungere infine la funzione Disegna/*

void __fastcall TComponente::Disegna(TMessage &Msg)
{
TComponent::Dispatch(&Msg);//mettere al posto di TComponent
//la classe da cui si deriva il
//componente

//inserire qui le varie funzioni per ridisegnare il componente
// quali sono le funzioni per ridisegnare il componente? Questo il problema
}
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi zello » 04/02/03 19:41

Di solito, usando l'SDK, il codice che uso per "disegnare" qualcosa è il seguente:
Codice: Seleziona tutto
/*
big WindowProc switch, con hWnd che è la finestra, wP->WPARAM
lP-> LPARAM
*/
case WM_PAINT:
{
   PAINTSTRUCT ps;
   HDC hDC=BeginPaint(hWnd,&ps);
   //Bon, ho il DC->posso fare ciò che voglio, copiare una bitmap con
   //BitBlt, piuttosto che usare le varie DrawXXX o GDI+
   //(per inciso: mai usato GDI+, se ti capita dimmi le tue impressioni)
   EndPaint(hWnd,&ps);
   return 0; //ho processato il messaggio
}


Tieni conto che PAINTSTRUCT contiene anche il RECT di cui fare l'update (vale a dire: se hai "fretta", puoi disegnare anche solo ciò che è dentro il RECT, il resto non è cambiato)
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi rayden » 04/02/03 19:44

ecco spiegami meglio il comando di copia della bitmap...dovrebbe essere più semplice così...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi zello » 05/02/03 13:51

Sono senza documentazione adesso (e BitBlt ha un *fiume* di argomenti), quindi te la tratteggio a lunghe linee:
- da qualche parte nel programma crei un HDC in memoria, compatibile con lo schermo, usando CreateCompatibleDC(NULL);
- nella stessa parte carichi dalle risorse (LoadBitmap, LoadImage) o crei dal nulla (CreateCompatibleBitmap) la bitmap
- associ la bitmap al DC in memoria con SelectObject, salvando ciò che ti ritorna la funzione.
- in WM_PAINT, semplicemente trasferisci con BitBlt il contenuto del DC in memoria nel DC ottenuto da BeginPaint (qualcosa tipo BitBlt(hDC,x,y,width,height,hDCInMemoria,0,0,SRCCOPY); )
- prima di uscire dal programma, deselezioni la bitmap riselezionando la bitmap precedente (valore di ritorno della SelectObject), la distruggi (DeleteObject), distruggi l'HDC in memoria (DeleteDC)
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi rayden » 05/02/03 16:44

ok, faccio qualche test e vi faccio sapere...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00


Torna a Discussioni


Topic correlati a "Librerie VCL":


Chi c’è in linea

Visitano il forum: Nessuno e 26 ospiti