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