View Full Version : Nuovo tipo di finestra MessageBox
gusamorim
20-02-2006, 09:24
Salve,
qualcuno sa come si implementano quelle finestre di notifica che scorrono dal basso verso l'alto nella parte in basso a destra della barra delle applicazioni?
Le utilizzano programmi come "Download Accelerator" e alcuni antivirus per notificare dei messaggi senza bloccare gli applicativi in esecuzione (a differenza della classica MessageBox).
Vorrei sapere se c'è qualche libreria o controllo OCX, oppure se bisogna farlo a mano, a prescindere dal linguaggio usato.
Spero di essermi spiegato.
Grazie.
Salve,
qualcuno sa come si implementano quelle finestre di notifica che scorrono dal basso verso l'alto nella parte in basso a destra della barra delle applicazioni?
Le utilizzano programmi come "Download Accelerator" e alcuni antivirus per notificare dei messaggi senza bloccare gli applicativi in esecuzione (a differenza della classica MessageBox).
Vorrei sapere se c'è qualche libreria o controllo OCX, oppure se bisogna farlo a mano, a prescindere dal linguaggio usato.
Spero di essermi spiegato.
Grazie.
Io l'ho sempre fatto a mano. Per Linux (KDE) ho fatto direttamente una libreria (KAnimateBox, spero la mettano nelle kdelibs :D), per windows non ho fatto una libreria altrimenti te la passerei, ma sono sicuro che se cerchi con google qualcosa la trovi (magari una dll o un controllo ActiveX più che un .ocx).
Comunqe non è che sia così difficile animare una messagebox, puoi farlo tranquillamente a mano senza troppa fatica ;)
Non è un nuovo tipo di finestra, se ci pensi bene è una finestra normale che viene a poco a poco mostrata (o ridimensionata) fino a mostrarsi tutta.
Basta un timer (SetTimer, WM_TIMER) e SetWindowPos: posizioni la tua finestra in basso a destra, sotto la barra delle applicazioni, crei un timer e nel timer incrementi ogni volta la posizione verticale della finestra. Distruggi il timer quando hai finito. Stessa cosa al contrario quando devi nasconderlo. :)
gusamorim
20-02-2006, 11:05
Grazie a -fidel- e kk3z per i suggerimenti,
visto che ci sono: come si procede per personalizzare il look di una finestra in WinXP?
Voglio dire p.es. per cambiare l'aspetto della barra del titolo, dei pulsanti ingrandimento/riduzione ecc.
Io utilizzo C++ (Borland o MS), ma anche qualche suggerimento in VB6 mi farebbe comodo.
Non è un nuovo tipo di finestra, se ci pensi bene è una finestra normale che viene a poco a poco mostrata (o ridimensionata) fino a mostrarsi tutta.
Basta un timer (SetTimer, WM_TIMER) e SetWindowPos: posizioni la tua finestra in basso a destra, sotto la barra delle applicazioni, crei un timer e nel timer incrementi ogni volta la posizione verticale della finestra. Distruggi il timer quando hai finito. Stessa cosa al contrario quando devi nasconderlo. :)
Attenzione!! Se vuoi implementare il messaggio a scomparsa con una dialog box il tuo metodo è ok, MA se lo vuoi implementare con una MessageBox la cosa cambia di molto! Infatti, le funzioni "MessageBox(...)" e "MessageBoxEx(...)" NON permettono di spostare la finestra. Per spostarla hai bisogno di ottenere l'handle alla messagebox, e questo handle lo ottieni installando un hook nella hook chain di windows ( SetWindowsHookEx(WH_CBT, ...) eccetera). Quando poi sei nella hook procedure, allora hai l'handle alla messagebox e puoi usare SetWindowPos(...) ;)
EDIT: con questo metodo puoi anche facilmente modificare l'aspetto della messagebox fornita dalle API di windows, così da rendere inutile la creazione di una nuova finestra di dialogo solo per mostrare un messaggio a scomparsa. E' più comodo mi pare sfruttare le messagebox fornite già da windows e personalizzarle più che creare una nuova finestra apposta ;)
Grazie a -fidel- e kk3z per i suggerimenti,
visto che ci sono: come si procede per personalizzare il look di una finestra in WinXP?
Voglio dire p.es. per cambiare l'aspetto della barra del titolo, dei pulsanti ingrandimento/riduzione ecc.
Io utilizzo C++ (Borland o MS), ma anche qualche suggerimento in VB6 mi farebbe comodo.
Eh non è un discorso molto semplice purtroppo. Con Windows XP, Se vuoi "limitarti" alla possibilità di rendere la tua finestra coerente con lo stile in uso sul sistema, devi forzare il sistema ad usare la libreria ComCtrl32.dll versione 6 (XP ha di default sia la versione 5 che la 6): per fare questo devi aggiungere un manifest file nella cartella del tuo programma. Questo file viene creato in automatico se crei un progetto .NET (mi pare), se invece vuoi farlo a mano (se programi in delphi o in C++ API o MFC ad esempio) ti basta mettere nella cartella del tuo programma questo file:
NomeMiaApplicazione.exe.manifest
contenuto del file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>Scrivi qui la descrizione della tua applicazione</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Prova ad eseguire la tua applicazione e vedi la differenza ;)
Se invece vuoi creare uno stile tutto tuo (ad esempio tipo MusicMatch...) allora ti rimando alla Msdn perchè il discorso è piuttosto lungo.
Attenzione!! Se vuoi implementare il messaggio a scomparsa con una dialog box il tuo metodo è ok, MA se lo vuoi implementare con una MessageBox la cosa cambia di molto! Infatti, le funzioni "MessageBox(...)" e "MessageBoxEx(...)" NON permettono di spostare la finestra. Per spostarla hai bisogno di ottenere l'handle alla messagebox, e questo handle lo ottieni installando un hook nella hook chain di windows ( SetWindowsHookEx(WH_CBT, ...) eccetera). Quando poi sei nella hook procedure, allora hai l'handle alla messagebox e puoi usare SetWindowPos(...) ;)
EDIT: con questo metodo puoi anche facilmente modificare l'aspetto della messagebox fornita dalle API di windows, così da rendere inutile la creazione di una nuova finestra di dialogo solo per mostrare un messaggio a scomparsa. E' più comodo mi pare sfruttare le messagebox fornite già da windows e personalizzarle più che creare una nuova finestra apposta ;)
No infatti io intendevo proprio che non è un MessageBox nè una finestra uacciuariua che fa tutto da sola, ma è una semplice finestra (un dialogbox, l'esempio più facile). Non mi sognerei neanche di farlo con il MessageBox o con un dialogbox modal, dato che per trovarne l'handle bisognerebbe fare tutto l'ambaradan di cui hai parlato :)
Non mi sognerei neanche di farlo con il MessageBox o con un dialogbox modal, dato che per trovarne l'handle bisognerebbe fare tutto l'ambaradan di cui hai parlato :)
:) Convengo che per creare una finestrella che appare piano piano e poi scompare il metodo più semplice è quello di creare una dialog box senza bordi e farla animare con un timer che controlla la posizione della finestra.
Animare una messagebox però risulta molto conveniente perchè, una volta padroneggiato il meccanismo delle hook procedures, posso creare una messagebox personalizzata con poca fatica: l'unica difficoltà è appunt intercettare la chiamata alla funzione MessageBox() delle API di windows, personalizzarla poi è facilissimo, e ti permette di sfruttare tutto il codice scritto dagli uomini Microsoft invece di diseganre tutto a mano ;) Risparmio di codice = circa 80% :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.