7 Stimmen

win32 Alles auswählen bei Strg bearbeiten (Textfeld)

Ich erstelle mein Textfeld mit diesen Optionen. Ich kann kopieren / ausschneiden / einfügen / rückgängig machen, aber wenn ich auf Alle auswählen es werden nicht alle ausgewählt. Ich kann mit der rechten Maustaste klicken und auf Alle auswählen pero CTRL + A tut nichts. Warum?

wnd = CreateWindow("EDIT", 0,
    WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
    x, y, w, h,
    parentWnd,
    NULL, NULL, NULL);

6voto

Phil Hord Punkte 12152

Ctrl + A ist kein eingebauter Beschleuniger wie Ctrl + C et Ctrl + V . Aus diesem Grund sind die Meldungen WM_CUT, WM_PASTE und WM_COPY definiert, aber es gibt keine WM_SELECTALL.

Sie müssen diese Funktion selbst implementieren. Ich habe das in meiner MFC-App so gemacht:

static BOOL IsEdit( CWnd *pWnd ) 
{
    if ( ! pWnd ) return FALSE ;
    HWND hWnd = pWnd->GetSafeHwnd();
    if (hWnd == NULL)
     return FALSE;

    TCHAR szClassName[6];
    return ::GetClassName(hWnd, szClassName, 6) &&
         _tcsicmp(szClassName, _T("Edit")) == 0;
}

BOOL LogWindowDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if ( pMsg->wParam=='A' && GetKeyState(VK_CONTROL)<0 )
        {
            // User pressed Ctrl-A.  Let's select-all
            CWnd * wnd = GetFocus() ;
            if ( wnd && IsEdit(wnd) )
                ((CEdit *)wnd)->SetSel(0,-1) ;
        }
    }   
    return CDialog::PreTranslateMessage(pMsg);
}

Hinweis: Ich habe IsEdit von dieser Seite gestohlen: http://support.microsoft.com/kb/145616

Ich weise darauf hin, zum einen, weil ich Anerkennung zollen möchte, und zum anderen, weil ich die IsEdit-Funktion (Vergleich von Klassennamen-Strings) für bescheuert halte und ich ihr die Schuld geben möchte.

5voto

sandun dhammika Punkte 831

Sie könnten einfach die EM_SETSEL-Nachricht für das Textfeld verwenden,

Nach Angaben von MSDN ,

Wenn der Startwert 0 und der Endwert -1 ist, wird der gesamte Text im Eingabefeld ausgewählt. Wenn der Startwert -1 ist, wird die aktuelle Auswahl aufgehoben.

also,

SendMessage(hwndEdit,EM_SETSEL,0,-1);

Wird gut funktionieren.

3voto

BoltBait Punkte 11254

Sie müssen diesen Tastenanschlag erfassen und die Auswahl selbst vornehmen.

Hier finden Sie einige C#-Code für die Verwendung mit einem RichTextBox:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Ctrl-A does a Select All in the editor window
        if (e.Control && (e.KeyCode == Keys.A))
        {
            this.SelectAll();
            e.Handled = true;
        }
    }

Tut mir leid, ich habe keinen Win32-Code für Sie.

3voto

Harold Bamford Punkte 1559

Ich neige dazu, MFC (verzeihen Sie mir) anstelle von Win32 zu verwenden, so dass ich dies nicht endgültig beantworten kann, aber ich bemerkte, dass dieser Kommentar zu einer Seite auf einer MS-Website über das Sprechen mit einem Edit-Steuerelement (ein einfacher Editor innerhalb des Edit-Steuerelements) hinzugefügt wurde:

Das Editier-Control verwendet WM_CHAR für Zeichen zu akzeptieren, nicht WM_KEYDOWN usw. Sie müssen Translate() Ihr Nachrichten oder Sie werden ironischerweise nicht den Text im Eingabefeld bearbeiten Steuerelement bearbeiten.

Ich weiß nicht, ob dies auf die Antwort von BoltBait zutrifft, aber ich vermute, dass es so ist.

(Ich fand dies unter http://msdn.microsoft.com/en-us/library/bb775462(VS.85).aspx )

3voto

Andrew McKinlay Punkte 2391

Das Seltsame ist, dass Ctrl + A Funktioniert (wie select all), wenn Sie NICHT ES_MULTILINE angeben

Das hilft aber nicht, wenn Sie mehrzeilige

Les MSDN-Dokumentation für ES_MULTILINE scheint nichts darüber zu sagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X