TabStop in normalem Fenster



  • Servus!

    Ich hab leider keinen Artikel in der FAQ über das Wechseln des Fokuses über die Tabulatortaste in einem normalen Fenster gefunden. Darum hab ich mir gedacht, da muss einer her :)! Hab mich also rangesetzt und ein bisschen Code geschrieben, sogar mit Kommentaren drin ;).

    #include <windows.h>
    
    // ------------------------------------------------------------------------------------------- //
    
    // Die IDs für die Controls
    #define FORUM_BTN_ID   5000
    #define WINAPI_BTN_ID  5001
    
    // ------------------------------------------------------------------------------------------- //
    
    // Die WndProc
    LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    
    // ------------------------------------------------------------------------------------------- //
    
    HINSTANCE hInst; // Globaler Zugriffspunkt auf die Instanz
    
    // ------------------------------------------------------------------------------------------- //
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        hInst = hInstance;
    
        // Hauptfensterklasse registrieren
        WNDCLASSEX main;
        main.cbSize         = sizeof(main);
        main.cbClsExtra     = 0;
        main.cbWndExtra     = 0;
        main.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
        main.hCursor        = LoadCursor(0,IDC_ARROW);
        main.hIcon          = LoadIcon(0,IDI_APPLICATION);
        main.hIconSm        = LoadIcon(0,IDI_APPLICATION);
        main.hInstance      = hInst;
        main.lpfnWndProc    = MainProc;
        main.lpszClassName  = TEXT("tabstop_example_class");
        main.lpszMenuName   = 0;
        main.style          = CS_VREDRAW | CS_HREDRAW;
        if(!RegisterClassEx(&main))
        {
            MessageBox(0,TEXT("Fehler beim Registrieren der Fensterklasse, Programm wird beendet!"),TEXT("TabStop"),MB_OK | MB_ICONSTOP);
            return 0;
        }
    
        // Hauptfenster erstellen
        HWND hMainWnd = CreateWindowEx(0,TEXT("tabstop_example_class"),TEXT("TabStop"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,140,100,0,0,hInst,0);
        ShowWindow(hMainWnd,SW_SHOW);
        UpdateWindow(hMainWnd);
    
        // Hauptschleife
        MSG msgMain;
        while(GetMessage(&msgMain,0,0,0))
        {
            // IsDialogMessage prüft die Nachricht, ob z.b. Tabulator gedrückt wurde.
            // Wenn ja, dann verschiebt es den Fokus um ein Control. Enthält die Nachricht
            // keinen Druck auf Tab (oder die anderen Messages, die die Funktion verarbeitet),
            // wird sie ganz normal verarbeitet, mit Translate- und DispatchMessage.
            if(!IsDialogMessage(hMainWnd,&msgMain))
            {
                TranslateMessage(&msgMain);
                DispatchMessage(&msgMain);
            }
        }
    
        return msgMain.wParam;
    }
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        static HWND hForumBtn,hWinApiBtn; // Handles zu den beiden Buttons
    
        switch(uMsg)
        {
    
        case WM_COMMAND:
            {
                switch(HIWORD(wParam))
                {
    
                case BN_CLICKED: // Button wurde angeklickt.
                    {
                        switch(LOWORD(wParam)) // Welcher Button?
                        {
    
                        case FORUM_BTN_ID: // Der C++ Forum-Button
                            {
                                // Das C++ Forum im Standardbrowser öffnen
                                ShellExecute(0,TEXT("open"),TEXT("http://www.winapi.net"),0,0,SW_SHOW);
                            } break;
    
                        }
                    } break;
    
                }
                return 0;
            } break;
    
        case WM_CREATE:
            {
                // So, hier ist das wichtigste der ganzen Sache, die Erstellung der Controls, die per
                // Tabulator-Taste angesprochen werden sollen. Die Controls müssen einfach nur zwei
                // weitere Styles verpasst bekommen, WS_TABSTOP und WS_GROUP, dann funktioniert's!
                hForumBtn  = CreateWindowEx(0,TEXT("button"),TEXT("C++ Forum"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP,5,5,120,16,hWnd,(HMENU) FORUM_BTN_ID,hInst,0);
                SendMessage(hForumBtn,WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),0);
    
                hWinApiBtn  = CreateWindowEx(0,TEXT("button"),TEXT("WinAPI.net"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP,5,30,120,16,hWnd,(HMENU) WINAPI_BTN_ID,hInst,0);
                SendMessage(hWinApiBtn,WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),0);
                return 0;
            } break;
    
        case WM_DESTROY:
            {
                PostQuitMessage(0); // Programm beenden
                return 0;
            } break;
    
        }
    
        return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    

    So, ich glaub der erklärt sich von selbst. Sollte doch schon ein Artikel in der FAQ stehen, dann löscht diesen hier einfach, hab ich dann wahrscheinlich übersehen, kann ja mal passieren :).

    cya

    [ Dieser Beitrag wurde am 20.12.2002 um 12:47 Uhr von MagiC Creator editiert. ]

    [ Dieser Beitrag wurde am 20.12.2002 um 12:49 Uhr von MagiC Creator editiert. ]



  • Also das mit dem

    #define UNICODE // immer schön Unicode verwenden 🙂

    halte ich überhaupt keine gute Idee für einen FAQ Beitrag.



  • Und dann noch nicht mal Überprüfen ob RegisterClassEx erfolgreich ausgeführt wird. Wenn jetzt ein Windows 95/98/ME User das Programm startet wird nichts passieren.



  • Ok, hab das mit dem RegisterClassEx ausgebessert, aber was soll ich denn anstatt dem #define UNICODE schreiben???

    cu



  • Garnichts! Wers braucht kanns selber hinschreiben. Sonst wundert sich nachher noch einer warum das nicht auf < Windows 2000 System läuft. Außerdem bringts hier überhaupt nichts. Werbung gehört auch nicht in solch einen Beitrag. 😉 :p



  • PS: Wenn dieser Beitrag in die FAQ verschoben wird, bitte meine Beiträge vorher löschen. :p



  • Ok, ich hoffe es passt jetzt so :).

    cu



  • Ich würde sagen, es hätte genügt, die Message-Loop anzugeben.



  • Ich glaub MagiC Creator hat das nur gemacht um seine Homepage bekannter zu machen. :p



  • Hehe, ich glaub auch. 😃



  • lol!! 🙂
    warum hast du jetzt die TEXT-Makros aus deinem Quelltext genommen? Du solltest doch nur das #define UNICODE rausnehmen. 😞



  • So, ich hoffe es beliebt Ihnen jetzt, Master!

    cu



  • 😡 Nenn mich nie wieder Master! 😡
    Ansonsten passt es jetzt. Das mit der Werbung war nicht so ganz ernst gemeint. 😉

    😡



  • Ok, #define UNICODE. Aber was hast du denn gegen 'Master'? 😃

    cya


Anmelden zum Antworten