Menü auch ohne ExtendedClass-Anmeldung ???
-
Hey!! ..
Ich versuche gerade ein Fenster mit Menüpunkten zu erstellen. Dazu habe ich mir mal Beispiele aus dem Net geholt ..
Bei der Anmeldung des Fensters habe ich jedoch früher nie eine gesamte WINDOWCLASSEX angemeldet ..
also nie so:
wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); //HIER MUSS JA DIE BEZEICHNUNG DES MENÜS HIN wc.lpszClassName = MainClassName; wc.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);sonder immer mit:
HWND Fenster = CreateWindowEX(0, WC_DIALOG, ... ) // ERSTELLUNG DES FENSTERS OHNE KLASSENANMELDUNGMeine Frage nun:
Gibt es eine Möglichkeit ohne eine Klassenanmeldung (so wie oben) ein Fenster mit einem Menü zu erstellen ???
-
MSDN oder Tutorial lesen: SetMenu!
-
Danke werds mir ansehen ^^ ..
-
Also folgendes hab ich jetzt aber das Menü zeigt sich nicht ..
Menü.cpp
#include <windows.h> #include <resource.h> bool Prozedur(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if(message == WM_CLOSE) { PostQuitMessage(0); } return 0; } int WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { MSG msg; HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL); SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur); SetMenu(Fenster, (HMENU)MAKEINTRESOURCE(IDR_MENU1)); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }resource.rc
IDR_MENU1 MENU BEGIN POPUP "Datei" BEGIN MENUITEM "Öffnen", ID_FILE_OPEN MENUITEM "Speichern", ID_FILE_SAVE MENUITEM "Ende", ID_FILE_EXIT END POPUP "Optionen" BEGIN POPUP "Optionen" BEGIN MENUITEM "Option&1", ID_OPTIONS_OPTIONS_OPTION1 MENUITEM "Option&2", ID_OPTIONS_OPTIONS_OPTION2 END END MENUITEM "Über", ID_ABOUT END ///////////////////////////////////////////////////////////////// // //Stringtabelle // STRINGTABLE BEGIN ID_STRING_OPEN, "Der Dialog Öffnen" ID_STRING_SAVE, "Der Dialog Speichern" ID_STRING_OPTION1, "Erste Option im Untermenü" ID_STRING_OPTION2, "Zweite Option im Untermenü" ID_STRING_ABOUT, "Ein Menü-Beispiel\nCoded by J.Wolf" ENDresource.h
#define ID_STRING_OPEN 1 #define ID_STRING_SAVE 2 #define ID_STRING_OPTION1 3 #define ID_STRING_OPTION2 4 #define ID_STRING_ABOUT 5 #define IDR_MENU1 101 #define ID_FILE_OPEN 40001 #define ID_FILE_SAVE 40002 #define ID_FILE_EXIT 40003 #define ID_OPTIONS_OPTIONS_OPTION1 40004 #define ID_OPTIONS_OPTIONS_OPTION2 40005 #define ID_ABOUT 65535was mach ich noch falsch -.- .. Danke für alle weiteren Bemühungen !!!
-
Du könntest das Menü aus den Resourcen erstmal laden:
http://msdn.microsoft.com/en-us/library/ms647990(VS.85).aspx
-
also ich weiss nicht recht das will i-wie alles nich so recht hinhauen sry ..
kann jemand konkret sagen welche Funktionen ich brauche bzw. wo genau ich sie
aufrufen muss ?! ..
so sieht mein derzeitiger Versuch aus:
HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL); SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur); LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); SetMenu(Fenster, (HMENU)MAKEINTRESOURCE(IDR_MENU1));
-
Ich würde für SetMenu den Rückgabeparameter von LoadMenu verwenden.
-
Juhuuuuuu !!!! xDDD .. funzt danke
ich hatte sowas vorher schonmal probiert also sowas wie:
char a = LoadMenu( ... );
SetMenu(Fenster, a);aber da der erforderliche Wert ja HWND ist (hätt ich wissen müssen) musses ja anders aussehen ..
Danke! ..
Nochmal der cpp-Source-Code für Leute die ähnliche Probleme haben:
#include <windows.h> #include <resource.h> bool Prozedur(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if(message == WM_CLOSE) { PostQuitMessage(0); } return 0; } int WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { HMENU a = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); MSG msg; HWND Fenster = CreateWindowEx(0, WC_DIALOG, "Mein Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL); SetWindowLong(Fenster, DWL_DLGPROC, (long)Prozedur); SetMenu(Fenster, a); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }Nun müsst ihr nur noch die resource-datei + header datei schreiben ..
Diese stehen ganz oben ..