Newsgroup: it.comp.programmare.win32
Titolo: ShowInTaskbar

In VB esiste la proprietą ShowInTaskbar (TRUE/FALSE). Nasconde o visualizza
i "pulsanti" che appaiono sulla taskbar di Windows. (quei classici pulsanti
allungati che clickandoci su massimizzano o minimizzano l'applicazione. Non
parlo dei pulsanti sulle dialog ma di quelli sulla barra in basso).
Volevo sapere se esiste una proprietą o API simile in C (win32) che mi
consente di nasconderli (non tutti, solo quello della mia applicazione).
Vi ringrazio anticipatamente
Ciao

 wrote in message 8grmto$jho$1...@nslave2.tin.it...

Il bottone non e` mostrato in taskbar se la finestra e` "owned" da
un'altra finestra e quest'ultima non e` visibile (e neppure se la
finestra e` essa stessa non visibile); questa e` la regola di Win32.
Quindi, per nascondere il pulsante-in-taskbar relativo a una tua
finestra, ponila "owned" da un'apposita tua finestrella invisibile
che non avra` appunto altro che questo ruolo di "nascondibottoni".
L'API da usare e` SetParent.
Alex

> L'API da usare e` SetParent.
Caro Alex, ma il Parent e l'Owner non sono due cose diverse??
Se tocco il Parent di una finestra, questa diventa Child del suo Parent, ...
o no?
Ciao, Davide.

 o no?
SetParent *NON* cambia lo stile della finestra: se non era WS_CHILD,
non lo diventa!
Alex

 non lo diventa!
pero' io ho preso una finestra della shell (gestione risorse), tramite il
suo Handle, ho fatto un SetParent e la finestra e' diventata Child di un
pannello presente su una mia form, il tutto senza andare di persona ad
impostare lo stile a WS_CHILD, poiche' SetParent e' un'API e della finestra
dell'explorer avevo solo l'Handle, non una struttura dati riconosciuta
direttamente dalle VCL (TWinControl per intenderci), devo pensare che forse,
imparentando qualcosa ad un TWinControl, le VCL rendano CHILD quel qualcosa,
dietro le quinte...
Davide.

 dietro le quinte...
Interessante!  In teoria, non dovrebbe funzionare cosi`... se veramente hai
preso, della gestione-risorse, la finestra top-level (con toolbar e tutto).
Pero`, era un poco che non esperimento con queste cose e so che sono state
abbastanza toccate di recente (per esempio, non si dovrebbe fare piu` la
API SetWindowLong sul campo owner/parent); la documentazione continua a dire
che SetParent non cambia lo stile, ma bisognerebbe sperimentare per vedere
se e` ancora vero.  Qualche semplice prova sembra confermare che NON lo e`.
Comunque, il concetto-base e`: vengono mostrate con bottoni in taskbar tutte
e sole le finestre top-level (che non abbiano il bit di stile tool-window)
che sono visibili (non nascoste) _E_ non possedute da altra finestra
top-level
nascosta (non visibile).  Per cambiare lo stato di esistenza/inesistenza del
bottone in taskbar, bisogn agire su questi parametri.  Se SetParent funziona
ancora come da documentazione, essa e` esattamente l'API giusta da usare
(come
owner si usera`, per nascondere i bottoni in taskbar, una finestrella
apposita,
top-level, nascosta).  Altrimenti, si puo` provare SetWindowLong.
Questa e` la funzione di metti/togli-bottoni-in-taskbar che pare funzionare
(in diretta contraddizione alla documentazione...:-):
void Btt(HWND hWnd)
{
   if(GetWindowLong(hWnd, GWL_HWNDPARENT)) {
       SetWindowLong(hWnd, GWL_HWNDPARENT, 0);
   } else {
       static HWND hParent;
       if(!hParent)
            hParent = CreateWindow(szWindowClass, "HiddenParent",
WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst,
NULL);
       SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)hParent);
   }
}
Chiamata su di una finestra top-level che stia visualizzando il bottone in
taskbar, lo toglie; se gia` tolto, lo rimette.  Questa crea al volo la
finestra di "genitore/proprietario nascosto" e quindi ha bisogno che siano
globali una stringa szWindowClass e un'istanza hInst, ma naturalmente si
puo` facilmente generalizzare.
Alex

 preso, della gestione-risorse, la finestra top-level (con toolbar e
tutto).
Ma scusa, se hai ammesso che le API considerano il Parent il "contenitore"
di una finestra da un punto di vista grafico/gerarchico, perche' non
dovrebbe funzionare cosi'?
Io ho grabbato la VERA finestra di gestione risorse, con tanto di toolbars,
caption bar, treeview delle directory e listview dei files...
ho preso il tutto e l'ho imparentato in un pannello, ricordi, ne abbiamo
parlato si e no un mese fa in un thread che avevo chiamato "Ho grabbato
l'explorer!"
Davide...


Ma se la finestrella dovesse aprirsi proprio sulle icone magari, non potrei
accedervi con il muose ?
Altri metodi pių eleganti non esistono ? Spiego a cosa mi serve la cosa:
dovrei in pratica porre come icona il mio programma nella taskbar. Sono
riuscito a creare l'icona ma quando minimizzo l'applicazione resta appunto
il bottone.
Scusatemi l'insistenza e la diffidenza.
ciao
thanks

Non ho capito inoltre come devo fare.
Ecco la struttura del prog.
Winmain(....)
{
...
makeintresource(...DIALOG);
}
BOOL CALLBACK dialogProc(...);
{
....
}
Dove la vado a piazzare l'altra finestra ? Io ho provato cosě ma non va
Winmain(....)
{
...
makeintresource(...DIALOG2);
}
BOOL CALLBACK dialog2Proc(...);
{
if (msg == WM_SHOWWINDOW)
{
        makeintresource(...DIALOG);
}
}
BOOL CALLBACK dialogProc(...);
{
....
}
DIALOG l'ho impotato come Child
DIALOG2 come OverlappedWindow
Dov'č il problema ?
Ciao
rigrazie

 Dov'è il problema ?
La tua presentazione mi appare confusa, comunque di Child non
dovrebbe essercene in giro neanche mezzo, forse e` quello.
Alex

 wrote in message 8gttah$dd$1...@nslave1.tin.it...

Se minimizzi resta il bottone; se invece ti nascondi il bottone
sparisce.  Se non ti da fastidio che il bottone si veda mentre
sei visibile tu, allora il trucco dell'owned non ti serve.
Alex

 dovrebbe funzionare cosi'?
Perche` solo le finestre con WS_CHILD hanno "un contenitore"; quelle
non-child (popup o overlapped) no, possono invece avere "un padrone".
Apparentemente la SetParent nell'attuale implementazione viola questa
semantica, poiche` non cambia lo stile (non mette il WS_CHILD) pero`
impone il comportamento (entro-contenitore) tipico di WS_CHILD.  Boh.
Per fortuna che la SetWindowLong (che la documentazione dice di NON
usare!) sembra invece funzionare come desiderato.
Alex

 wrote in message
8gusg1$nv7$1...@nslave2.tin.it...


 sapresti indicare quella esatta ?
Questa, con le correzioni di cui sopra, e` una di tante sequenze
accettabili, ce ne sono anche molte altre.
Alex

 wrote in message
8h0pp7$430$1...@serv1.iunet.it...




 restituisce sempre 0. Dove potrebbe essere il problema.
Usa GetLastError per controllare il codice di errore quando
una chiamata ad API fallisce, come qui ti fallisce CreateWindow.
Vedrai che hai un parametro sbagliato.
Alex

 wrote in message
8h36rg$bhh$1...@serv1.iunet.it...
