Il linguaggio di programmazione Delphi
 

Problema form e Windows 10

microges@gmail.com 10 Lug 2017 09:42
Ciao a tutti,

allora spiego... ho la necessità di visualizzare un messaggio a centro schermo
ma devo fare in modo che il resto dello schermo non sia cliccabile a prescindere
da quello che c'è sotto.

Fino ad ora facevo cosi':

Sulla FormCreate del messaggio creavo una form vuota a pieno schermo senza bordo
impostando Brush.Style := bsClear e funziona bene da Windows XP a Windows 7 ma
con Windows 10 (almeno la versione Professional) no, nel senso che visualizza la
form completamente nera e non trasparente dando un effetto allucinante spece se
devo visualizzare più messaggi in sequenza.

Allora, mi sono detto, provo a copiare lo sfondo in una bitmap e la metto a
pieno schermo (sempre nella form che creo nella FormCreate) ma pure questa non
funziona, ovvero lo sfondo non viene copiato.

Per catturare lo sfondo uso questa funzione (che lavora bene su Win XP/2000/7)

Function GetScreenShot : TBitmap;
Var
Desktop : HDC;
DC : Cardinal;
BMP : TBitMap;
begin
Result := Nil;

BMP := TBitmap.Create;
BMP.Width := Screen.Width;
BMP.Height := Screen.Height;

DC := GetDesktopWindow;
Desktop := GetDC(DC);

try
BitBlt(BMP.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, Desktop, 0, 0,
SRCCOPY);

BMP.Modified := True;
Result := BMP;
finally
ReleaseDC(DC, Desktop);
end;
end;

Ragazzi ho terminato le idee. Qualche anima pia mi potrebbe dare una mano?

Grazie a tutti
David Guadagnini 10 Lug 2017 09:43
Dimenticavo uso Delphi 2006 e non posso cambiarlo
David Guadagnini 11 Lug 2017 11:08
Vabbè alla fine ho risolto (sembra) con un trucchetto prelevato da un gruppo
dedicato a Lazarus. Per chi interessi faccio cosi':

1)Creo la form a pieno schermo, senza bordo ne titolo
2)La rendo trasparente modificando gli attributi in WS_EX_LAYERED e dandogli una
trasparenza di 1 (a 0 non funziona) usando la funzioncina sotto
3)Mostro la form con show

La funzione per rendere trasparente una form è la seguente:

Procedure SetTransparentForm(AHandle : THandle; AValue : byte = 0);
Var
Info : TOSVersionInfo;
begin
Info.dwOSVersionInfoSize := SizeOf(Info);
GetVersionEx(Info);

if (Info.dwPlatformId = VER_PLATFORM_WIN32_NT) and (Info.dwMajorVersion >= 5)
then
begin
SetWindowLong(AHandle, GWL_EXSTYLE, GetWindowLong(AHandle, GWL_EXSTYLE)
or WS_EX_LAYERED);

//Make form transparent
SetLayeredWindowAttributes(AHandle, 0, AValue, LWA_ALPHA);
end;
end;

Dove AHandle è l'handle della form e come Avalue passo 1

bye

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.