Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

cereus

Frischling

  • »cereus« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Ufg

  • Private Nachricht senden

1

21.11.2008, 16:04

[Erledigt] Text soll aus EditBox mit Enter geholt werden

Hallo
ich hab ein Windowsfenster mit einer Editbox programmiert. Aus dieser soll anschließend der Text übernommen werden. Dies geschieht momentan noch durch einen Button. Wie kann ich es jetzt hinkriegen das ich den Text bei Enter bekommen, ohne auf den Button zu drücken? Bis jetzt hab ichs so versucht, einfach in die Nachrichtenschleife zu schreiben, dass beim beim Druck von Enter der Text übernommen wird. Wenn ich das dann aber im Programm versuche, ertönt nur das Fehler Geräusch und es passiert nichts.
Weiß da jemand was?
--- ---

2

21.11.2008, 16:16

Hm, also man kann mit Hooks arbeiten. d.h. du lässt erstmal alle Nachrichten der Editbox an dich gehen, und wenn sie dich nicht interessieren, gibts du sie an die Editbox weiter. In deiner selbstgeschriebenen Nachrichtenfunktion kannst du dann z.B. prüfen ob Enter gedrückt wurde.
Lieber dumm fragen, als dumm bleiben!

cereus

Frischling

  • »cereus« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Ufg

  • Private Nachricht senden

3

21.11.2008, 16:35

und wie macht man dann sowas?
--- ---

Anonymous

unregistriert

4

21.11.2008, 16:45

Jonathan_Klein
Du wirfst auch auf jede Ameise eine ICBM mit einem 100 Megatonnen-Wasserstoffsprengkopf, gell?

cereus
Folgendes musst du beachten:
Wenn der Focus auf dem Edit-Feld ist, musst du es Subclassen, da dieses Feld VK_RETURN abfängt. Subclassing bedeutet, das du die WndProc des Edit-Felds überlädst bzw. ersetzt und hierdurch auf VK_RETURN und WM_CHAR reagieren kannst.

Nicht vergessen: WM_GETDLGCODE abfangen und DLGC_WANTALLKEYS wiedergeben lassen.

Ein Beispiel findest du hier:
http://web.archive.org/web/20061230211138/www.winapi.net/index.php?inhalt=s27

Eine weiter Möglichkeit ist das Setzen von Applikationsweiten Tastenkürzeln, genannt: "Keyboard Accelerators". Hierzu findest du Infos on Mass in der MSDN.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.11.2008, 17:04

Da... Geht natürlich auch ohne Hooks...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
LRESULT CALLBACK EditProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    MSG msg;
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ),
        CS_HREDRAW | CS_VREDRAW,
        WndProc,
        0, 0,
        hInstance,
        LoadIcon( NULL, IDI_APPLICATION ),
        LoadCursor( NULL, IDC_ARROW ),
        GetSysColorBrush( COLOR_BTNFACE ),
        NULL,
        _T( "MyCoolWindowClass" ),
        LoadIcon( NULL, IDI_APPLICATION )
    };

    if ( !RegisterClassEx( &wc ) )
    {
        OutputDebugString( _T( "RegisterClassEx failed!" ) );
        return 0;
    }

    HWND hWnd = CreateWindowEx( WS_EX_WINDOWEDGE, _T( "MyCoolWindowClass" ), _T( "Foobar Test" ), 
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );

    if ( !hWnd )
    {
        OutputDebugString( _T( "CreateWindowEx failed!" ) );
        return 0;
    }

    HWND hEdit = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), _T( "Please press enter..." ), WS_VISIBLE | WS_CHILD, 307, 290, 186, 20, hWnd,
        NULL, hInstance, NULL );

    LONG_PTR pWndProc = SetWindowLongPtr( hEdit, GWL_WNDPROC, ( LONG )EditProc );
    SetWindowLongPtr( hEdit, GWL_USERDATA, pWndProc );

    SetFocus( hEdit );
    ShowWindow( hWnd, SW_SHOW );
    UpdateWindow( hWnd );

    while ( GetMessage( &msg, NULL, 0, 0 ) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }

    return ( int )msg.wParam;
}

LRESULT CALLBACK EditProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    WNDPROC pWndProc = ( WNDPROC )GetWindowLongPtr( hWnd, GWL_USERDATA );

    switch ( uMsg )
    {
    case WM_KEYDOWN:
        if ( wParam == VK_RETURN )
        {
            MessageBox( hWnd, _T( "Return pressed" ), _T( "Info" ), MB_OK | MB_ICONINFORMATION );
            return FALSE;
        }

    default:
        return CallWindowProc( pWndProc, hWnd, uMsg, wParam, lParam );
    }

    return 0;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg )
    {
    case WM_CLOSE:
        PostQuitMessage( 0 );
        break;

    default:
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

    return 0;
}
@D13_Dreinig

Anonymous

unregistriert

6

21.11.2008, 17:16

Sag ich doch, Subclassing!

David_pb
Bei dir hat sich, glaube ich, ein kleiner Fehler eingeschlichen: Beim beenden des Programms, bzw. vor Zerstörung des Edit-Feldes musst du doch noch die alte WndProc des Feldes zurücksetzen? Jedenfalls habe ich da noch sowas in Hinterkopf. ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

21.11.2008, 18:02

Hm? Kann man machen, aber in dem Fall ist das nicht unbedingt notwendig, weil Windows das, beim beenden des Prozess, gleich mit übernimmt.
Aber schaden würde es natürlich auch nicht. Dann müsst man aber, konsequenter Weise, auch das Fenster zerstören und die Fensterklasse deregistrieren. :)
@D13_Dreinig

Anonymous

unregistriert

8

21.11.2008, 18:17

Zitat von »"David_pb"«

Dann müsst man aber, konsequenter Weise, auch das Fenster zerstören und die Fensterklasse deregistrieren. :)
Also deregistrieren tu ich immer, weil ich weiß, dass Windows Mobile das nicht macht, aber das Zerstören ist ein automatischer Vorgang.

9

21.11.2008, 18:22

woops, da hat einer Hooks mit Subclassing verwechselt :D
Das meinte ich nämlich natürlich, und habs ja auch so beschrieben, jedenfalls grob.
Lieber dumm fragen, als dumm bleiben!

cereus

Frischling

  • »cereus« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Ufg

  • Private Nachricht senden

10

23.11.2008, 11:40

okay danke leute
ich habs jetzt hinbekommen! :D
--- ---

Werbeanzeige