Newsgroup: it.comp.programmare.win32
Titolo: Finestre di forma qualsiasi

Salve a tutti, un po' di tempo fa si parlava di creare finestre non
rettangolari, e fin qui niente di difficile, si possono creare region
ellittiche o formate da poligoni etc.. etc.., io invece volevo creare una
finestra di forma qualsiasi prendendo la forma all'avvio dell'applicazione
da una bitmap in bianco e nero!! E ci sono riuscito creando una mare di
region da un pixel e combinandole fra loro, funziona ma l'operazione costa
una 30 di secondi all'avvio dell'applicazione! Non esiste un metodo per
scrivere direttamente su una region? Cioe' per settare ogni singolo pixel
senza fare tutto il casino di cui sopra?
Qualcuno ha qualche idea su come facciano a tal proposito programmi come il
sonique?

 senza fare tutto il casino di cui sopra?
Forse preparando tu direttamente un'apposita struttura RGNDATA
e usandola poi in ExtCreateRegion con primo parametro 0 puoi
andare molto piu` in fretta, bisogna pero` sperimentare.
Alex

senza fare tutto il casino di cui sopra?
Guarda, creare una region a partire da una bitmap credo sia un
problema diffuso, soprattutto per le window non-rettangolari.
Io a tal proposito sono andato a guardare i sorgenti di alcuni
component adatti allo scopo (trovati su Torry), e il metodo migliore
che ho trovato č creare una region non da ogni pixel, ma da ogni linea
orizzontale di pixel contigui.
Di seguito un pezzetto di codice.
TobiX
HDC hdc = CreateCompatibleDC(NULL);
HBITMAP hbmp;      //mi procuro in qualche modo la bitmap 
                   // "maschera" della window
int width,height;  //nonché le sue dimensioni in pixel
COLORREF color;    //e il colore che diventa "trasparente"
HBITMAP hbmp_old = (HBITMAP) SelectObject(hdc,hbmp);
HRGN hrgnWnd, hrgnTmp;
hrgnWnd = CreateRectRgn(-1,-1,0,0); //creo una region fuori dallo
schermo
for (int y=0; y<height; y++) {
   int x=0, startx, endx;
   do {
      //vai (x,y) al primo pixel non-trasparente (startx)
      while (GetPixel(hdc,x,y)==color && x<width)
         x++;
      startx=x;
      //vai (x,y) al primo pixel trasparente (endx)
      while (GetPixel(hdc,x,y)!=color && x<width)
         x++;
      endx=x;
      //abbiamo una linea startx..endx-1 da convertire in regione?
      if (startx!=width) {
         hrgnTmp = CreateRectRgn(
            pos.x+startx, pos.y+y, pos.x+endx, pos.y+y+1);
         CombineRgn(hrgnWnd,hrgnWnd,hrgnTmp,RGN_OR);
         DeleteObject(hrgnTmp);
      }
   } while (x<width);
}
SetWindowRgn(hwnd,hrgnWnd,true);
//hrgnWnd non va piů cancellato o modificato dopo
// essere stato assegnato!
SelectObject(hdc,hbmp_old);
DeleteObject(hbmp);
DeleteDC(hdc);
-- 
TobiX, ovvero piů virtualmente:
to...@iname.com
  -  
www.icq.com/12392232
Super fan di Gen13, Lene Marlin e altri personaggi piů o meno reali.

 orizzontale di pixel contigui.
Grazie Toby, in effetti avevo già implementato questa soluzione (Grazie lo
stesso cmq) a proposito che e' Torry? Un sito di programmazione? Mi dai
l'indirizzo completo?
P.S. Ma secondo te perche' quelli della microsoft non hanno fatto una
gestione piu' simpatica delle region?? Booo? Magari implementando anche
l'alpha blending!!
Ciao!!

 l'alpha blending!!
Questo in Win98 non c'è, ma la buona notizia è che in Win2000 C'E'!!!
Ho letto che puoi associare ad ogni finestra un canale alpha!
PAZZESCO!!!
Della serie NE VEDREMO DELLE BELLE!!!
cià
TobiX
-- 
TobiX, ovvero più virtualmente:
to...@iname.com
  -  
www.icq.com/12392232
Super fan di Gen13, Lene Marlin e altri personaggi più o meno reali.

 Della serie NE VEDREMO DELLE BELLE!!!
Scusate, per alpha blending intendete la "trasparenza percentuale"?
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

Scusate, per alpha blending intendete la "trasparenza percentuale"?
Esattamente. Tipo livelli di Photoshop.
*NON SO* effettivamente come sia programmabile una trasparenza del
genere, se con una bitmap a scala di grigi o con delle region speciali
o cos'altro... ho solo letto in giro che si puň fare.
TobiX
-- 
TobiX, ovvero piů virtualmente:
to...@iname.com
  -  
www.icq.com/12392232
Super fan di Gen13, Lene Marlin e altri personaggi piů o meno reali.

 o cos'altro... ho solo letto in giro che si può fare.
Speriamo che ci vada di c__o e che aggiungano una API tipo
SetTransparencyPercent(HWND hwnd, BYTE percentuale);
;-))


 o cos'altro... ho solo letto in giro che si può fare.
Il canale alpha si puo` vedere come un'altra componente dei colori. C'e`
il canale del rosso, del verde, del blu, poi c'e` il canale alpha che
indica la trasparenza. Quindi cosi` a naso direi che non ci sia nulla di
troppo complicato da fare... se ci pensi buona parte delle API di
Windows accettano gia` i colori a 32 bit, in formato RGBQUAD (uno dei
campi e` indicato come 'reserved', ma probabilmente ora viene usato per
l'alpha).
Chi ha visto Windows 2000 avra` notato quell'effetto di comparsa
"sfumata" dei menu... presumo che lo facciano proprio variando l'alpha
da 255 (trasparenza totale) a 255 (opacita` totale).
... The best way to accelerate a Mac is at -9.8 m/s
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

 SetTransparencyPercent(HWND hwnd, BYTE percentuale);
Il livello di controllo e` molto, molto piu` fine e preciso:
AlphaBlend(HDC hdcDest,
  int nXOriginDest, int nYOriginDest,
  int nWidthDest, int hHeightDest,
  HDC hdcSrc,
  int nXOriginSrc, int nYOriginSrc,
  int nWidthSrc, int nHeightSrc,
  BLENDFUNCTION blendFunction
);
cioe` l'interazione di alpha blending e` fra sotto-rettangoli
(con implicito stretching, se necessario) e fra device contexts
(non fra intere finestre).  La struttura BLENDFUNCTION puo`
specificare vari altri dettagli (nelle beta di NT 5, molti non
erano ancora implementati); inoltre, le bitmap a 32 bit
portano un byte di alpha (0-255) per ogni pixel (accanto
ai classici byte di R, G e B).
Alex