Hallo,
seit den Anfängen von Windows stört es mich, dass die Maus sich "irgendwo" befindet, aber nicht in der Nähe des aktivierten Controls (z.B. beim OK-Button der MessageBox).
Für eigene Programme setze ich die <b>Maus</b> immer dorthin, wo der Benutzer arbeiten soll, vorzugsweise dann, wenn <b>ActiveControl</b> geändert wird. Dazu biete ich die folgende Routine an:
<u>Variante 1: in jedem Formular vorsehen</u>
protected void ControlActivate(Control ctl, bool bActive) {
Point pCtl = new Point(ctl.Left, ctl.Top);
Control con = ctl.Parent;
while ( !(con is Form) ) {
pCtl.X += con.Left; pCtl.Y += con.Top; con = con.Parent; }
Point loc = this.PointToScreen(pCtl);
// Mausposition wird bei Buttons zentriert gesetzt, sonst links oben
if (ctl is Button) { loc.X += ctl.Width/2; loc.Y += ctl.Height/2; }
else { loc.X += 16; loc.Y += 8; }
Cursor.Position = loc;
// bei Bedarf das Control zum aktiven machen
if (bActive) {
// das kann z.B. bei unsichtbaren Controls auch schief gehen
try { this.ActiveControl = ctl; }
catch { ; }
} }
<u>Variante 2: in einer DLL im Namespace System.Windows.Forms</u>
Erzeuge in einer Assembly für diesen Namespace eine beliebige Klasse (z.B. ControlsEx) und definiere dort diese Methode:
static public void ...
Dann ist <i>this</i> zu ersetzen durch <i>ctl.FindForm()</i>.
Bei dieser Variante steht diese Methode "immer" zur Verfügung.
Viel Erfolg bei der Nutzung! Jürgen
seit den Anfängen von Windows stört es mich, dass die Maus sich "irgendwo" befindet, aber nicht in der Nähe des aktivierten Controls (z.B. beim OK-Button der MessageBox).
Für eigene Programme setze ich die <b>Maus</b> immer dorthin, wo der Benutzer arbeiten soll, vorzugsweise dann, wenn <b>ActiveControl</b> geändert wird. Dazu biete ich die folgende Routine an:
<u>Variante 1: in jedem Formular vorsehen</u>
protected void ControlActivate(Control ctl, bool bActive) {
Point pCtl = new Point(ctl.Left, ctl.Top);
Control con = ctl.Parent;
while ( !(con is Form) ) {
pCtl.X += con.Left; pCtl.Y += con.Top; con = con.Parent; }
Point loc = this.PointToScreen(pCtl);
// Mausposition wird bei Buttons zentriert gesetzt, sonst links oben
if (ctl is Button) { loc.X += ctl.Width/2; loc.Y += ctl.Height/2; }
else { loc.X += 16; loc.Y += 8; }
Cursor.Position = loc;
// bei Bedarf das Control zum aktiven machen
if (bActive) {
// das kann z.B. bei unsichtbaren Controls auch schief gehen
try { this.ActiveControl = ctl; }
catch { ; }
} }
<u>Variante 2: in einer DLL im Namespace System.Windows.Forms</u>
Erzeuge in einer Assembly für diesen Namespace eine beliebige Klasse (z.B. ControlsEx) und definiere dort diese Methode:
static public void ...
Dann ist <i>this</i> zu ersetzen durch <i>ctl.FindForm()</i>.
Bei dieser Variante steht diese Methode "immer" zur Verfügung.
Viel Erfolg bei der Nutzung! Jürgen