Domanda

C'è un modo per mantenere inattiva una finestra, anche se contiene lo stato attivo? Ho due forme (A e B). Dopo che l'utente interagisce con A, trasferisco nuovamente la messa a fuoco su B. Il risultato dei trasferimenti di messa a fuoco (l'utente che fa clic su A, quindi la messa a fuoco viene trasferita di nuovo su B) è che la forma A lampeggia da attiva a inattiva. Sembra brutto (specialmente su Vista dove A ottiene momentaneamente un'ombra più grande). Come posso rendere Un soggiorno inattivo in modo che questo lampeggiamento non accada?

È stato utile?

Soluzione

Alla fine ho trovato la risposta!

ATTENZIONE: NON abusare della tecnica di questa risposta. Farlo confonderà i tuoi utenti e danneggerà l'esperienza informatica in generale. La tecnica descritta di seguito può essere molto utile in determinate circostanze (ad esempio l'implementazione di comportamenti simili a IntelliSense), ma per favore sii prudente nel tuo utilizzo.

Il messaggio WM_NCACTIVATE viene inviato a un finestra per modificare lo stato della sua area non client (ad es. bordo e barra del titolo) in inattivo o attivo. Il wParam del messaggio indica se lo stato sarà inattivo o attivo. Se wParam è true (un valore di 1), la finestra apparirà attiva. Se wParam è falso (un valore di 0), la finestra apparirà inattiva. Per forzare una finestra a rimanere inattiva o attiva, sovrascrivi wParam impostandolo sul valore corrispondente (0 o 1) e sarai pronto!

private const int WM_NCACTIVATE = 0x0086;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCACTIVATE)
    {
        // Use this to make it always look inactive:
        m.WParam = (IntPtr)0;

        // Alternately, use this to make it always look active:
        m.WParam = (IntPtr)1;
    }

    base.WndProc(ref m);
}

Altri suggerimenti

Stai parlando di cambiare un comportamento predefinito di un modello di interfaccia grafica. Non consiglierei di farlo. Se l'utente sta facendo qualcosa su A, quindi tornando a B non dovrebbe scomparire A? Perché "lampeggia"? Dovrebbe essere un singolo interruttore quando si verifica il cambio di messa a fuoco.

Non è stato possibile capire da cosa descrivi che il focus focus è come:

A- > B
B- > A- > utente click- > B
B- > A

Non sono sicuro se questo aiuta, ma Winforms supporta il concetto di moduli di proprietà. Ad esempio, anche se le barre degli strumenti mobili si trovano all'esterno di una finestra di livello superiore, rimangono attive anche quando la finestra di livello superiore è attiva (e viceversa). Allo stesso modo, vuoi che l'utente sia in grado di interagire con il tuo modulo A, senza disattivare il modulo B.

Per raggiungere questo obiettivo, sembra che sia necessario chiamare b.AddOwnedForm (a) prima di mostrare a .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top