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

11

23.02.2015, 21:12

Die Tab-Order wird mit der Reihenfolge der Erstellung deiner Editboxen gesetzt, sofern sie WS_TABSTOP als Style bekommen.

Du kannst die Ordnung der Tabstops durch aufrufen von SetWindowPos aktualisieren. Einfach in der richtigen Reihenfolge aufrufen.

C-/C++-Quelltext

1
SetWindowPos(hWnd, hWndInsertAfter, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

https://msdn.microsoft.com/en-us/library…v=vs.85%29.aspx

Wenn du den Dialog mit dem Dialog Designer von VS gestaltet hast (was ich dir empfehle sofern du kannst, bevor du 81 mal CreateWindow in deinem Code stehen hast...), kannst du die Ordnung über Format > Aktivierreihenfolge (Strg+D) ändern, ohne das programmatisch machen zu müssen.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (23.02.2015, 21:18)


12

23.02.2015, 21:44

Ich weiß nicht irgendwie steh ich gerade aufm Schlauch. :crazy:

Also. Nein ich benutze keinen Editor ich schreibe den Code.
Da ich meine Editboxen mit WS_TABSTOP in einer Scheife anlege müsste ich ja eine Tab-Order haben.

Jetzt verwirrt mich jedoch was SetWindowPos() mit der ganzen Geschichte zu tun hat. druch MSDN wurde ich auch nicht schlauer.
Welche Reihenfolge meinst du genau?
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

23.02.2015, 21:48

Eigentlich brauchst Du selbst nichts mehr machen, wenn WS_TABSTOP verwendet wurde, das ist ja gerade der Gag daran. Du kannst aber mit SetWindowPos die Tab-Reihenfolge verändern. Also wohin das Tab springen soll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

14

23.02.2015, 22:02

Hmm

Es Passiert jedoch nichts.

In dieser Scheife werden die Klassen in den Vector geschrieben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for (int y = 1; y <= 9; y++)
    {
        for (int x = 1; x <= 9; x++)
        {
            AFields.push_back(new CField(x, y, EditBoxID, &hWnd, &hInst));
            EditBoxID++;
        }
    }


Konstruktor von CField - Editboxen werden mit WS_TABSTOP erstellt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
hEditBox = CreateWindow(
        TEXT("EDIT"),
        TEXT("0"),
        WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_CENTER,
        X * 30, Y * 30,
        20, 20,
        *hWnd,
        (HMENU)ID,
        *hInst,
        NULL);


Das müsste doch ausreichend sein oder etwa nicht?!
wenn ich jedoch jetzt mein Programm Starte, den Focus auf die erste Box lege und dann Tab drücke.... nichts...
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

15

24.02.2015, 02:16

Wenn das die Reihenfolge ist, in der du sie erstellen willst, ja.

Wenn du das ganze wirklich per Hand machen willst, musst du meines Wissens auch die Dialog-Funktionen selber schreiben. Du kannst dabei scheinbar IsDialogMessage() zur Hilfe nehmen:
https://msdn.microsoft.com/en-us/library…v=vs.85%29.aspx

Anwenden kannst du das ganze in deiner Msg-Pump vermutlich so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
while (GetMessage(&msg, 0, 0, 0))
{
   if (IsDialogMessage(hwnd, &msg) == 0)
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);       
   }
}


Aber erneut: Das ganze mit dem Dialog Editor zu machen, nimmt dir viel Ärger ab.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

16

24.02.2015, 06:09

Dann muss er aber alle Editboxen per Hand erstellen.
Du kannst das ganze auch selber machen. mit GetFocus() und dann mit SetFocus() zum nächsten Feld springen.

17

24.02.2015, 13:04

Zitat

Dann muss er aber alle Editboxen per Hand erstellen.
Wenn du das per-Hand erstellen im Dialog-Editor meinst: Bei 9x9 Feldern ist das sicher kein großer Aufwand ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

18

24.02.2015, 22:04

Guten Abend.
Irgendwie bin ich am verzweifeln! Aus diesem Grund habe ich mir jetzt selber was gebastelt.
Aus, mir einem nicht ersichtlichen Grund, wird die message WM_KEYDOWN nicht an die WindowProc gesendet wenn man eine Taste in einer Editbox drückt.
Deshalb habe ich jetzt auf meine eigene Art die Nachricht abgefangen und verarbeitet.

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
while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);

        if (message.message == WM_KEYDOWN && message.wParam == VK_TAB)
        {

            for (auto i = AFields.begin(); i != AFields.end(); i++)
            {
                if (GetFocus() == (*i)->GetEditBox_HWND())
                {
                    EditBoxID = (*i)->GetID();
                }
                if (EditBoxID + 1 == (*i)->GetID())
                {
                    SetFocus((*i)->GetEditBox_HWND());
                }
                if (EditBoxID == 82)
                {
                    i = AFields.begin();
                    SetFocus((*i)->GetEditBox_HWND());
                    break;
                }
            }

            EditBoxID = 0;
        }

    }


Funktioniert super :thumbsup:

Allerding habe ich so das gefühl das ich gegen, so gut wie alle WinApi Regelen verstoßen haben.
Wie "sauber" ist meine methode. Kann man das so stehen lassen?
Funktionieren tut es aufjedenfall ohne weitere Probleme.

Vielen Dank für eure Zeit und vorallem eure Nerven.... :love:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

19

24.02.2015, 22:08

Funktioniert IsDialogMessage() nicht?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

20

24.02.2015, 23:35

@iSmokiiZz

Doch jetzt schon -.-
hatte WS_TABSTOP wieder entfernt da ich es mit meiner Methode versuchen wollte.

Nachdem ich WS_TABSTOP wieder eingesetzt habe funzt es Prima.

Vielen dank dir, und auch den anderen =) :thumbsup:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Werbeanzeige