Newsgroup: it.comp.programmare.win32
Titolo: Rettangolo trasparente su grafico [LUNGO]

Salve a tutti...
	ho assoluto bisogno di aiuto, perché non riesco a trovarte una via 
di uscita. Avevo già illustrato il problema in un mio post precedente, 
ma vorrei essere più specifico.
Ho un grafico di sistribuzione dove ogni crocetta rappresenta un 
dipendente. Devo dare la possibilità di zoomare su un gruppo di 
dipendenti. Per farlo l'utente disegna un rettangolo sul grafico e 
l'area selezionata viene ingrandita.
Il problema è che non riesco a disegnare questo rettangolo 
semitrasparente, in modo che comunque si riescano a vedere le crocette 
sotto il rettangolo.
Vi riporto un po' di codice....
Al primo click sul grafico viene creata una finestra
che sarà il mio rettangolo
SetCapture(hWndDlg);
 
			   rettangoloSele.x = LOWORD(lParam);
			   rettangoloSele.y = HIWORD(lParam);
			   if(hZoom)
					SendMessage(hZoom,WM_CLOSE,0,0);
			   hZoom = CreateWindow(
			   "ZOOMCORR",               
			   "",
               WS_POPUP | WS_VISIBLE, 
			   rettangoloSele.x,
			   rettangoloSele.y, 
			   1,  
			   1,
			   hInd,
			   0,
			   hInst,                 
			   0); 
 
			   EnableWindow(hZoom,TRUE);
			   dis_rett = 1;
			   break;
al trascinamento del mouse (WM_MOUSEMOVE insieme al wparam MK_LBUTTON) 
ridimensiono il rettangolo/finestra
if (wParam==MK_LBUTTON && dis_rett == 1)
			  {
 
 
 
				  MoveWindow(hZoom, 
								x1,
								y1, 
								larg, 
								alt, 
								TRUE);
 
 
				  UpdateWindow(hZoom);
 
Questa è la procedura di disegno della finestra ZOOMCORR:
LRESULT CALLBACK ZOOMCORR(HWND hWndDlg, UINT Message, WPARAM wParam, 
LPARAM lParam)
{
 
	PAINTSTRUCT psz;
	HDC  dcZ;
	RECT rettz;
	HBRUSH hbz;
	switch(Message)
	{
 
		case WM_PAINT:
			memset(&psz, 0x00, sizeof(PAINTSTRUCT));
			dcZ = BeginPaint(hWndDlg, &psz);
 
 
			SetBkMode(dcZ, TRANSPARENT);
 
			GetClientRect(hWndDlg,&rettz);
			hbz = CreateSolidBrush(col[2]);
 
			FillRect(dcZ,&rettz,hbz);
 
 
			BitBlt(dcZ,
				 rettz.left,
				 rettz.top,
				 rettz.right-rettz.left,
				 rettz.bottom-rettz.top,
				 dcGrafico,
				 rettangoloSele.x,
				 rettangoloSele.y,
				 MERGEPAINT);
 
			EndPaint(hWndDlg, &psz);
			break;
 
 
		case WM_CLOSE:
			EnableWindow(hInd,TRUE);
			SetFocus(hInd);  
			DestroyWindow(hWndDlg);
 
			break;
 
 
 
		default:
			return( DefWindowProc( hWndDlg, Message, wParam, 
lParam ));
 
       }
	   return 0L;
}
Come vedete uso il BitBlt per impostare la trasparenza. Ma con continui 
insuccessi....
Mi avevano suggerido la funzione SetLayeredWindowAttribute o qualcosa 
del genere...il fatto è che non mi riconosce la funzione nonostante 
abbia incluso i file giusti e le librerie. E comunque mi sembra che 
funzioni solo con win2000 ed è un limite che purtroppo non posso dare...
Spero che qualcuno possa aiutarmi....
Ciao
Lorenzo

 ha scritto nel messaggio 
news:MPG.1c6b054d9...@news.libero.it...
Salve a tutti...
ho assoluto bisogno di aiuto, perché non riesco a trovarte una via
di uscita. Avevo già illustrato il problema in un mio post precedente,
ma vorrei essere più specifico.
Ho un grafico di sistribuzione dove ogni crocetta rappresenta un
dipendente. Devo dare la possibilità di zoomare su un gruppo di
dipendenti. Per farlo l'utente disegna un rettangolo sul grafico e
l'area selezionata viene ingrandita.
Il problema è che non riesco a disegnare questo rettangolo
semitrasparente, in modo che comunque si riescano a vedere le crocette
sotto il rettangolo.
Vi riporto un po' di codice....
<snip..>
Perché non disegni un rettangolo direttamente sulla finestra del grafico?
Usi la modalità XOR.
Quindi ad ogni movimento lo ridisegni in xor alle vecchie coordinate e 
quello si cancella, poi lo disegni alla nuova posizione.