Menüs ;((
-
Hi,
ich habe ein Problem ich habe mein zweiten Fenster Kategorien angelegt, eben Menüs.
Infos Datei
Autoren > Rene Polifka Beenden
AusgabeEr macht das nicht so, er gibt sowas aus:
Infos Datei
Autoren Beenden
AusgabeDa muss ein Problem mit die mii.hSubMenu sein
Code:
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc_2 (HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) { /// Fenster 01 WNDCLASS WndClass; WndClass.style = 0; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpfnWndProc = WndProc; WndClass.hInstance = hInstance; WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); WndClass.hCursor = 0; WndClass.hIcon = 0; WndClass.lpszMenuName = 0; WndClass.lpszClassName = "WinProg"; /// Fenster 02 WNDCLASS WndClass_2; WndClass_2.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style" WndClass_2.cbClsExtra = 0; WndClass_2.cbWndExtra = 0; WndClass_2.lpfnWndProc = WndProc_2; WndClass_2.hInstance = hInstance; WndClass_2.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH); WndClass_2.hCursor = 0; WndClass_2.hIcon = 0; WndClass_2.lpszMenuName = 0; WndClass_2.lpszClassName = "Win2"; // Registriere die Fenster RegisterClass(&WndClass); RegisterClass(&WndClass_2); // Erstelle Fenster HWND hWindow; hWindow = CreateWindow("WinProg","Fenster01", WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL); ShowWindow(hWindow, nCmdShow); UpdateWindow(hWindow); HWND hWindow_2; hWindow_2 = CreateWindow("Win2","Fenster02", WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL); ShowWindow(hWindow_2, nCmdShow); UpdateWindow(hWindow_2); // Fensterinfos für jedes Fenster 1while MSG Message; while (GetMessage(&Message, NULL, 0, 0)) { DispatchMessage(&Message); } MSG Message_2; while (GetMessage(&Message_2, NULL, 0, 0)) { DispatchMessage(&Message_2); } return (Message_2.wParam); } // Für jedes Fenster eine Funktion LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) { switch(uiMessage) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc (hWnd, uiMessage, wParam, lParam); } } LRESULT CALLBACK WndProc_2 (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch(uiMessage) { // Menüs case WM_CREATE: HMENU hMenu; hMenu = CreateMenu(); MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID; mii.fType = MFT_STRING; char *string; string = new char[40]; mii.dwTypeData = string; mii.cch = lstrlen (string); mii.fState = MFS_ENABLED; /// Kategorien HMENU hMenu1; hMenu1 = CreatePopupMenu (); lstrcpy (string, "Beenden"); mii.wID = 1; InsertMenuItem (hMenu1, 0, FALSE, &mii); /// Menü lstrcpy (string, "Datei"); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hMenu1; InsertMenuItem (hMenu, 0, FALSE, &mii); /// Kategorien von Infos HMENU hMenu2; // zweit Kategorie von Kategorie Autoren HMENU hMenu3; hMenu3 = CreatePopupMenu (); lstrcpy (string, "Rene Polifka"); mii.wID = 2; InsertMenuItem (hMenu3, 0, FALSE, &mii); hMenu2 = CreatePopupMenu (); lstrcpy (string, "Autoren"); mii.fMask = MIIM_TYPE | MIIM_ID; mii.hSubMenu = hMenu3; InsertMenuItem (hMenu2, 0, FALSE, &mii); lstrcpy (string, "Ausgaben"); InsertMenuItem (hMenu2, 0, FALSE, &mii); // Menü lstrcpy (string, "Infos"); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.wID = 5; mii.hSubMenu = hMenu2; InsertMenuItem (hMenu, 0, FALSE, &mii); SetMenu (hWnd, hMenu); delete [] string; return 0; ////////////////////////// case WM_PAINT: hdc = BeginPaint (hWnd, &ps); SetTextColor( hdc, RGB( 255, 255, 255) ); // weiß SetBkColor ( hdc, RGB( 132, 130, 132) ); // grau TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); EndPaint (hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc (hWnd, uiMessage, wParam, lParam); } }
Er erzeugt keine Untermenüs, kann einer mir helfen ???
Help me :xmas2: !!!
-
auf den ersten blick sind deine while-schleifen in der winmain falsch (du brauchst keine 2 davon... eine genuegt). so sollte sie aussehen:
MSG msgMain ; while (GetMessage (&msgMain, NULL, 0, 0)){ TranslateMessage (&msgMain) ; DispatchMessage (&msgMain) ; } return msgMain.wParam ;
-
Es sind doch 2 Fenster und für jedes Fenster 1while Schleife, wenn ich 1 nur habe, schließen sich alle zwei Fenster und es soll ja so gehen das wenn das eine geschlossen wird das andere Fenster noch da bleibt..
So und wo ist jetzt der Fehler beim die Menüs, kann doch nett sein das im Beispiel alles geht und wenn ich was mache das mit die untermenüs nicht geht..
-
die while-schleife ist für dein gesammtes prog und nicht für einzelne fenster.
-
Aktualisierter Code:
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) { /// Fenster 01 WNDCLASS WndClass; WndClass.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style" WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpfnWndProc = WndProc; WndClass.hInstance = hInstance; WndClass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH); WndClass.hCursor = 0; WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); WndClass.lpszMenuName = 0; WndClass.lpszClassName = "WinProg"; // Registriere die Fenster RegisterClass(&WndClass); // Erstelle Fenster HWND hWindow; hWindow = CreateWindow("WinProg","OPENSOURCE Source CD#1", WS_OVERLAPPEDWINDOW,200,160,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hWindow, nCmdShow); UpdateWindow(hWindow); // Fensterinfos für jedes Fenster 1while MSG Message; while (GetMessage(&Message, NULL, 0, 0)) { TranslateMessage (&Message) ; DispatchMessage(&Message); } return (Message.wParam); } LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch(uiMessage) { // Menüs case WM_CREATE: HMENU hMenu; hMenu = CreateMenu (); MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID; mii.fType = MFT_STRING; char *string; string = new char[200]; mii.dwTypeData = string; mii.cch = lstrlen (string); mii.fState = MFS_ENABLED; HMENU hMenu2; hMenu2 = CreatePopupMenu (); lstrcpy (string, "Beenden"); mii.wID = 1; InsertMenuItem (hMenu2, 0, FALSE, &mii); lstrcpy (string, "Datei"); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hMenu2; InsertMenuItem (hMenu, 0, FALSE, &mii); HMENU hMenu2_; hMenu2_ = CreatePopupMenu (); lstrcpy (string, "Autor"); mii.fMask = MIIM_TYPE | MIIM_ID; mii.wID = 2; InsertMenuItem (hMenu2_, 0, FALSE, &mii); HMENU hMenu3; hMenu3 = CreatePopupMenu (); lstrcpy (string, "Farbtiefe"); mii.fMask = MIIM_TYPE | MIIM_ID; mii.wID = 3; InsertMenuItem (hMenu3, 0, FALSE, &mii); lstrcpy (string, "Aufloesung"); mii.wID = 4; InsertMenuItem (hMenu3, 0, FALSE, &mii); HMENU hMenu3_; hMenu3_ = CreatePopupMenu (); lstrcpy (string, "Windows Verzeichniss"); mii.wID = 5; InsertMenuItem (hMenu3_, 0, FALSE, &mii); lstrcpy (string, "Aktuelles Verzeichniss"); mii.wID = 6; InsertMenuItem (hMenu3_, 0, FALSE, &mii); lstrcpy (string, "Grafik"); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hMenu3; InsertMenuItem (hMenu2_, 0, FALSE, &mii); lstrcpy (string, "Festplatte"); mii.hSubMenu = hMenu3_; InsertMenuItem (hMenu2_, 0, FALSE, &mii); lstrcpy (string, "Information"); mii.hSubMenu = hMenu2_; InsertMenuItem (hMenu, 0, FALSE, &mii); //// ->>> Das Menü will nicht klappen >>>> HMENU hMenu_cc; hMenu_cc = CreatePopupMenu (); lstrcpy (string, "Woka"); mii.wID = 7; InsertMenuItem (hMenu_cc, 0, FALSE, &mii); HMENU hMenu_rr; hMenu_rr = CreatePopupMenu (); lstrcpy (string, "Oka"); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hMenu_cc; InsertMenuItem (hMenu_rr, 0, FALSE, &mii); lstrcpy (string, "Infos"); mii.hSubMenu = hMenu_rr; InsertMenuItem (hMenu, 0, FALSE, &mii); // ->>> Das Menü will nicht klappen >>>> SetMenu (hWnd, hMenu); delete [] string; return 0; /////////////////////////////// case WM_PAINT: hdc = BeginPaint (hWnd, &ps); SetTextColor( hdc, RGB( 255, 255, 255) ); // weiß SetBkColor ( hdc, RGB( 132, 130, 132) ); // grau ////////////// static BITMAPFILEHEADER *pbmfh; static BITMAPINFO *pbmi; static BYTE *pBits; static int cxDib, cyDib; DWORD dwFileSize, dwHighSize, dwBytesRead; HANDLE hFile; hFile = CreateFile ("Logo.bmp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); dwFileSize = GetFileSize (hFile, &dwHighSize); pbmfh = (BITMAPFILEHEADER *) malloc (dwFileSize); ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL); pbmi = (BITMAPINFO *) (pbmfh + 1); pBits = (BYTE *) pbmfh + pbmfh->bfOffBits; cxDib = pbmi->bmiHeader.biWidth; cyDib = abs(pbmi->bmiHeader.biHeight); HDC hdc; hdc = GetDC (hWnd); SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmi, DIB_RGB_COLORS); ReleaseDC (hWnd, hdc); free (pbmfh); return 0; ///////////////////////////// EndPaint (hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc (hWnd, uiMessage, wParam, lParam); } }
Aber das Problem mit die Menüs wird trotzdem nicht gelöst *heul* , ist der Scheiß Datentyp HMENU nur auf paar Datensegmente eingeschränkt, ich kann einfach nicht mehr mal ein Menü reinfügen ...
Bitte helft mir !!!
-
mii.cch (länge des strings) ist immer 0 !!!
hat bei mir auch länger gedauert bis ich es gefunden
hab und da ich zur fehlersuche das ganze mal umformuliert hab
noch ein vorschlag zur einfacheren handhabung(solange du nur einfache menüs erstellen willst):HMENU hMenu;hMenu = CreateMenu (); HMENU hMenu2;hMenu2 = CreatePopupMenu (); InsertMenu (hMenu2,-1,MF_BYPOSITION| MF_STRING,1, "Beenden"); InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu2, "Datei"); HMENU hMenu2_;hMenu2_ = CreatePopupMenu (); InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING,2, "Autor"); HMENU hMenu3; hMenu3 = CreatePopupMenu (); InsertMenu (hMenu3,-1,MF_BYPOSITION| MF_STRING,3, "Farbtiefe"); InsertMenu (hMenu3,-1,MF_BYPOSITION| MF_STRING,4, "Aufloesung"); InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu3, "Grafik"); HMENU hMenu3_; hMenu3_ = CreatePopupMenu (); InsertMenu (hMenu3_,-1,MF_BYPOSITION| MF_STRING,5, "Windows Verzeichniss"); InsertMenu (hMenu3_,-1,MF_BYPOSITION| MF_STRING,6, "Aktuelles Verzeichniss"); InsertMenu (hMenu2_,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu3_, "Festplatte"); InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu2_, "Information"); HMENU hMenu_cc; hMenu_cc = CreatePopupMenu (); InsertMenu (hMenu_cc,-1,MF_BYPOSITION| MF_STRING,7, "Woka"); HMENU hMenu_rr; hMenu_rr = CreatePopupMenu (); InsertMenu (hMenu_rr,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu_cc, "Oka"); InsertMenu (hMenu,-1,MF_BYPOSITION| MF_STRING|MF_POPUP,(UINT)hMenu_rr, "Infos"); SetMenu (hWnd, hMenu);