2009-09-16 14 views
13

Sto cercando di determinare la visibilità di un controllo finestra che è stata nascosta o abilitata con CWnd :: ShowWindow(). (o :: ShowWindow (hWnd, nCmdShow))come trovare lo stato SW_SHOW/SW_HIDE di una finestra

Non posso semplicemente usare :: IsWindowVisible (hWnd) come il controllo si trova su un foglio di tabulazione, che a sua volta può essere spento, causando IsWindowVisible per restituire FALSE.

C'è un modo per ottenere lo stato della finestra SW_SHOW/HIDE (o altri) o devo usare il valore di retun di ShowWindow() e resettare di conseguenza?

edit: come il controllo è attivato (o disattivato) per mostrare, ma non può essere attualmente visibile, come la scheda è acceso ot, penserei che è stato SW_SHOW rimarrebbe la stessa, anche se la finestra stessa non è effettivamente acceso. Se non sono realistico nelle mie aspettative, va bene.

Quindi, in realtà sto cercando 'possibile questa finestra/controllo visualizzeranno'

+0

Quindi quale risultato si prevede se il controllo si trova in una scheda nascosta? –

risposta

6

Utilizzare GetWindowPlacement. Riempie la struttura WINDOWPLACEMENT, che ha il campo showCmd.

showcmd
Specifica mostra lo stato corrente della finestra. Questo membro può essere uno dei seguenti valori.

+0

un po 'più accurato di quello di Jdehaan sebbene fosse il primo ... – geocoin

+1

Ho scoperto che se hai una finestra di dialogo con i controlli contrassegnati come "Visibile: Falso" e non fai niente altrimenti chiamiamo 'ShowWindow' su di essi,' GetWindowPlacement' su quei controlli restituirà ancora 'SW_SHOWNORMAL' nel campo' showCmd'. L'approccio 'GetWindowLong (wnd, GWL_STYLE)' funziona correttamente. – StilesCrisis

-1

Non so se c'è un adeguato metodo diper questo compito, ma vorrei provare WindowFromPoint Function.

Osservazioni

la funzione WindowFromPoint non recupera un handle per un disabile finestra nascosta o , anche se il punto è all'interno della finestra. Un'applicazione deve utilizzare la funzione ChildWindowFromPoint per una ricerca non restrittiva.

Ad esempio, convertirei le coordinate degli angoli del controllo in schermate e quindi cercare di ottenere il controllo da quei punti.

+0

Ciò potrebbe causare risultati imprevisti con controlli come caselle di gruppo che possono sovrapporsi ai loro fratelli e sembrano visualizzarli visivamente. Si romperà anche se c'è un popup non collegato che si trova nel posto sbagliato nello schermo nel momento sbagliato. – BrendanMcK

+0

@ Brendan, hai ragione su questo. Avrei dovuto dire che non è un metodo affidabile. –

2

Vorrei usare GetWindowPlacement, tuttavia non sono sicuro di aver capito cosa vuoi. Riempie una struttura WINDOWPLACEMENT e quindi utilizza il membro showCmd.

+0

questo suona come quello che sto cercando. (sei entrato prima di Kirill) Lo proverò – geocoin

11

Chiama GetWindowLong(handle, GWL_STYLE), controllare il valore restituito per la presenza di stile WS_VISIBLE.

+2

sicuramente è lo stesso di IsWindowVisible - che ho già detto mi stava dando il risultato sbagliato (per questa situazione) – geocoin

+4

MSDN è il tuo amico (http://msdn.microsoft.com/en-us/library/ms633530(v= vs.85) .aspx) - IsWindowVisible controlla lo stile WS_VISIBLE per la finestra e tutti gli antenati ("Se la finestra specificata, la sua finestra genitore, la sua finestra genitore del genitore e così via, hanno lo stile WS_VISIBLE, il valore restituito è diverso da zero Altrimenti, il valore restituito è zero. "), Ma questo controlla solo lo stato della finestra. Quindi considera questa visibilità "locale" di quell'HWND rispetto al suo genitore (che suona come quello che stavi cercando); mentre IsWindowVisible è il risultato "globale" netto. – BrendanMcK

+1

Questo è l'approccio giusto da usare; 'GetWindowPlacement' non è preciso. Ho scoperto che se si ha una finestra di dialogo con controlli contrassegnati come "Visibile: Falso" e altrimenti non si chiama 'ShowWindow' su di essi,' GetWindowPlacement' su quei controlli restituirà ancora 'SW_SHOWNORMAL' nel campo' showCmd' . – StilesCrisis

0

GetWindowPlacement() la funzione funzionerà solo se la finestra è ingrandita o ridotta a icona. In caso contrario, membro showcmd tornerà SW_SHOWNORMAL anche quando la finestra è nascosta, come sottolineato in questa risposta StackOverflow: WINDOWPLACEMENT's showCmd... always 1?

è possibile utilizzare la funzione booleana più semplice IsWindowVisible() per ottenere, se la finestra specificata è in uno stato visibile o meno .

0

Se si tratta di un dialogo multi-tab e non un controllo, poi sovrascrivere come

void MyClass::OnShowWindow(BOOL bShow, UINT nStatus) 
{ 
    m_nCmdShow = bShow; 
    CDialog::OnShowWindow(bShow, nStatus); 
} 

In BEGIN_MESSAGE_MAP, aggiungere ON_WM_SHOWWINDOW().

m_nCmdShow ora ha lo stato se la finestra è SW_SHOW o SW_HIDE.

Problemi correlati