2009-07-13 23 views
0

Ich habe einen Dialog aus einer Vorlage erstellt. Es hat aufgeführten Kontrollen in der Vorlage in der folgenden Reihenfolge:Wie mit Beschleunigern für deaktivierte Steuerelemente umgehen?

  • einige irrelevant Kontrollen
  • ein Etikett mit einem Beschleuniger
  • ein Bearbeitungsfeld
  • OK (sie es Alt-A ist so tun) und Abbrechen Tasten

Normalerweise, wenn ich getroffen Alt-A- der keybord Fokus auf das Bearbeitungsfeld übertragen wird - nur bei Bedarf . Allerdings muss ich manchmal das Bearbeitungsfeld deaktivieren.

Wenn ich Alt-A wenn das Bearbeitungsfeld deaktiviert ist der Effekt ist, dass die OK-Taste gedrückt wird, und das ist definitiv nicht das, was ich will. Ich würde es vorziehen, in diesem Fall nichts zu unternehmen. Was könnte ich tun, um dies zu umgehen?

Antwort

0

Ich bin nicht so vertraut mit MFC, so versuche ich, ganz allgemein zu beantworten:

Soweit ich es heraus machen kann, was passiert ist, dass Sie einen so genannten Beschleuniger Konflikt. A ist der accel-Schlüssel für das Bearbeitungsfeld und - ich vermute hier - die Apply-Schaltfläche.

Die Lösung besteht darin, diese Situation zu vermeiden. Mehrdeutige Accel-Keys sind eine PITA für Benutzer, wie Sie selbst entdeckt haben. In KDE haben wir daher einen Automatismus, der accel-Schlüssel zur Laufzeit basierend auf einigen Heuristiken zuweist. Das ist oft genug, obwohl es gelegentlich zu suboptimalen Ergebnissen führt.

Wenn Sie eine Form des Formular-Designers verwenden, um die Steuerelemente visuell auszulegen, haben diese Tools in der Regel eine Möglichkeit, um auf Konflikte mit Accel-Schlüsseln zu prüfen. Ansonsten würde ich in den alten Tagen auf alle accel-Tasten klicken, um zu testen, ob sie wie erwartet funktionieren.

Aber die Quintessenz ist: Lassen Sie doppelte Accel-Schlüssel im selben Umfang passieren.

+1

Ich dupliziere nichts. Das Problem ist, dass der Beschleuniger die nächste nicht deaktivierte Steuerung auslöst. Wenn die Editbox aktiviert ist, ist dies das nächste nicht deaktivierte Steuerelement. Wenn es deaktiviert ist, wird die Schaltfläche OK zum nächsten nicht deaktivierten Steuerelement. – sharptooth

0

Wenn Sie das Bearbeitungsfeld aktivieren/deaktivieren, können Sie das Beschriftungssteuerelement auch mit dem Beschleuniger aktivieren/deaktivieren oder einfach den Beschleuniger auf dem Etikett hinzufügen/entfernen, indem Sie den Fenstertext ändern. Beides sollte Ihnen das gewünschte Verhalten geben.

+0

Wenn Sie das Label deaktivieren, wird es ausgegraut - das ist in meinem Fall nicht angebracht. Und den Text zu optimieren ist schrecklich - ich muss mich an die Position des Ampersand-Symbols für jeden Etikettentext erinnern, den ich auf diese Weise zwicke. Schrecklich, aber würde funktionieren. – sharptooth

+0

Wenn Sie Zeichenfolgenressourcen für die Beschriftungen verwenden, legen Sie den Wert mit dem kaufmännischen Und-Zeichen fest und verwenden Sie diese Option, wenn sie aktiviert ist, und entfernen Sie beim Deinstallieren einfach das kaufmännische Und-Zeichen. Keine Erinnerung an Positionen erforderlich. –

+0

Ich habe tatsächlich die Bezeichnungen als statische Steuerelemente in der Dialogvorlage definiert. Wenn ich diesen Weg gehe, muss ich mich daran erinnern, wo das kaufmännische Und war, so dass der Beschleuniger wieder funktionsfähig wird, wenn ich die abhängige Steuerung aktiviere. – sharptooth

0

Ich habe es gerade versucht und es schien zu funktionieren ... obwohl es eine hinterhältige Methode ist.

Geben Sie nach dem Bearbeitungssteuerelement eine Schaltfläche ein (beliebig skaliert). Ändern Sie die Eigenschaft auf der Schaltfläche auf "Besitzer zeichnen", implementieren Sie jedoch keine Zeichnungslogik. Stellen Sie außerdem sicher, dass die Tab-Reihenfolge unmittelbar nach dem Bearbeitungssteuerelement festgelegt ist.

Dies hat den Effekt, dass die Schaltfläche beim Ausführen unsichtbar wird. Wenn das Bearbeitungssteuerelement deaktiviert ist, wird die unsichtbare Schaltfläche wirklich ohne Wirkung ausgelöst.

HINWEIS: Sie können WS_VISIBLE nicht einfach aus der Schaltfläche entfernen (oder diese anderweitig ausblenden oder deaktivieren), da dies das Steuerelement möglicherweise unsichtbar macht, aber auch verhindert, dass das Steuerelement in der Aktivierreihenfolge ist.

Mit dieser Methode wird der Fokus (wie auf einer unsichtbaren Schaltfläche) ausgeblendet, wenn Sie auf das Beschleuniger-Symbol klicken, wenn das Bearbeitungssteuerelement deaktiviert ist.Wenn Ihnen das nicht gefällt, fügen Sie der neuen unsichtbaren Schaltfläche einen Handler hinzu, um den Fokus dorthin zu setzen, wo Sie ihn haben möchten, falls das Bearbeitungssteuerelement deaktiviert ist. Auf diese Weise ruft der Beschleuniger den Button auf, ruft den Handler auf, der den Fokus auf den gewünschten Bereich zurückstellt.

Hoffe, das hilft!

0

Es ist eine lange Zeit her, seit ich in MFC und Windows SDK gearbeitet habe, aber aus Sicht der Architektur sollte es einen Event-Handler geben, in den Sie sich einklinken können. Pflegen Sie ein internes Flag für, wenn das Bearbeitungsfeld deaktiviert ist. Wenn das Bearbeitungsfeld deaktiviert ist, essen Sie alle Alt-A-Ereignisse.

Verwandte Themen