JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=490092adc7bdd1c8125bd3699eac1199Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[C#, Pro] "Prevent Steal Focus"

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 13.08.2007, 11:34    Titel: [C#, Pro] "Prevent Steal Focus" Antworten mit Zitat

Ich hoffe, mir kann auch mal jemand helfen (^_^);

Ich habe folgendes Problem:
Während ich das Ereignis "DropDown" einer ComboBox verarbeite, um der ComboBox Einträge hinzuzufügen öffne ich ein Statusfenster (asyncron, also anderer Thread) mit einer entsprechenden Wartemeldung (animiert, deshalb ich unter anderem der andere Thread notwendig).
Dabei werden im Hauptthread die SQL-Server-Instanzen im Netzwerk gesucht (und auch gefunden, das ich nicht mein Problem) und den Items der ComboBox hinzugefügt. Ist der Prozess der Serversuche abgeschlossen, schließt sich das Statusfenster und der Zusatzthread wird beendet. - Alles kein Problem.
Leider ist danach die DropDownbox gleich wieder geschlossen. Sie flackert nach verlassen des Statusfensters kurz auf und verschwindet sofort wieder.
Das Problem ist wahrscheinlich das Statusfenster, da es während der Suchaktion den Focus von der ComboBox stielt.
Genau dass muss ich aber verhindern, um den Benutzer der Combobox nicht ein 2. mal zu zwingen, den DropDown auszulösen. (Die Serverliste wird gecached, das Statusfenster wird also nur einmal angezeigt)
Jetzt habe ich leider vergeblich nach einem Ereignis gesucht, mit dem ich ggf. den Verlust des Focus während der Verarbeitung der Suchaktion verhindere.
Ich suche also jemand, der mir eine Idee liefert, mit der ich den Focusverlust kompensieren kann.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 13.08.2007, 13:35    Titel: Antworten mit Zitat

Das Problem ist sogar noch größer:
Leider kann ich die Auflistung der ComboBox während des Ereignisses "DropDown" nicht so bearbeiten, wie ich es gerne hätte.
Ein einfaches
CPP:
comboBox1.Items.Clear();
löst bereits eine Exception aus (leider sogar, wenn ich im selben Thread - also Syncron - bleibe).
Nur sind Clear() / Add() aber genau die Funktionen, die ich verwenden wollte, um die Items in der Auflistung zu ändern, welche von der ComboBox angezeigt werden sollen Sad

Ich kann den Ansatz also wahrscheinlich komplett über Bord werfen...
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 13.08.2007, 16:40    Titel: Antworten mit Zitat

Ok. 2. Problem gelöst:
Wenn ich ein
CPP:
comboBox1.BeginUpdate();
und ein
CPP:
comboBox1.EndUpdate();
um die Clear() / Add()-Aktion rumbaue, funktioniert das hinzufügen / entfernen wieder richtig. Bleibt noch das Problem des verlorenen Focuses.

Jemand eine Idee dazu?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.08.2007, 19:54    Titel: Antworten mit Zitat

Könnte nicht folgendes klappen. Du fängst einfach den LostFocus Event ab und setzt den Focus einfach wieder auf dein Control, bzw klappst es wieder aus, Nachteil wäre dann wohl der störende Auf und wieder Einklappeffekt und auch die doppelte DropDown Behandlung.

Alternativ könntest du dir auch das ComboBox Control ableiten und die entsprechenden Focushandling Methoden überladen.

Persönlich würde ich zur 2ten Variante tendieren.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 13.08.2007, 20:16    Titel: Antworten mit Zitat

Es war beides nicht Notwendig:
Vorschlag 1 ist nicht möglich, weil das "LostFocus"-Ereignis (alias Leave) keinen CancelEventArgs enthält, und damit der Focus verloren geht. Ich könnte ihn zwar nachher wieder draufsetzen aber dann wird das DropDownFeld trotzdem eingeklappt...
Vorschlag 2 hab ich mir auch schon überlegt.
Ich stoße leider immer öfters an echte Grenzen von WinForms und habe schon das eine oder andere Control komplett neu geschrieben (nicht nur abgeleitet und erweitert)
Für die Combobox wollte ich den Weg allerdings nicht gehen, die funktionierte bisher zufriedenstellend...
Ich habe mich dann für Variante 3 Entschieden:
ShowNoActivate()...
Ich hab das Statusfenster mit ShowNoActivate angezeigt. Da es TopMost ist, wird es angezeigt, das Dropdown behält aber den Focus...
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum