Ich komme mit Menüs nicht klar(GetMenu,Loadmenu,Resource.h etc.)



  • Ich schaffe das mit den menüs nicht. Ich habe mir den Artikel im Petzold schon x mal durchgelesen.

    #include <windows.h>
    #include "resource.h"
    #define ID_EDIT		1
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
    
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (hInstance,MAKEINTRESOURCE(IDI_ICON)) ;
         wndclass.hCursor       = LoadCursor (hInstance,MAKEINTRESOURCE(IDC_CURSOR));
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = TEXT("IDR_MENU1");
         wndclass.lpszClassName = szAppName;
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
          hwnd = CreateWindow (szAppName,                 // Name der Fensterklasse
                      TEXT ("Das erste echte Programm"),  // Fenstertitel
                      WS_OVERLAPPEDWINDOW,                // Fensterstil
                      CW_USEDEFAULT,                      // X-Position des Fensters
                      CW_USEDEFAULT,                      // Y-Position des Fensters
                      CW_USEDEFAULT,                      // Fensterbreite
                      CW_USEDEFAULT,                      // Fensterhöhe
                      NULL,                               // übergeordnetes Fenster
                      NULL,                               // Menü
                      hInstance,                          // Programm-Kopiezähler (Programm-ID)
                      NULL) ;                             // zusätzliche Parameter
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;
         PAINTSTRUCT ps ;
         RECT        rect ;
    	 HMENU hMenu;
    	 static char szText[30];
    	 static HWND hwndEdit;
    
         switch (message)
         {
         case WM_CREATE:
              //PlaySound ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
    		 wsprintf(szText,"a");
    		hwndEdit = CreateWindow("edit",NULL,
    					ES_LEFT|WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER|
    					ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,
    					0,0,0,0,hwnd,(HMENU) ID_EDIT,
    					 ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
    		hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));// stimmt das?
              return 0 ;
    	 case WM_SIZE:
    		 MoveWindow(hwndEdit,0,0,LOWORD(lParam)-500,HIWORD(lParam),TRUE);
    
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
    
              GetClientRect (hwnd, &rect) ;
    
              DrawText (hdc, TEXT (szText), -1, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    	 case WM_COMMAND:
    		 hMenu = GetMenu(hwnd);//steht so im Petzold
    		 return 0;
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    
    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by RESOURCE.RC
    //
    #define IDI_ICON                        101
    #define IDC_CURSOR                      102
    #define IDR_MENU1                       103
    #define ID_DATEI_BEENDEN                40001
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        104
    #define _APS_NEXT_COMMAND_VALUE         40002
    #define _APS_NEXT_CONTROL_VALUE         1000
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    Ich verstehe das nicht. Im Petzold wird nicht mal LoadMenu benutzt. Wenn ich das beispiel aus dem Petzold posten soll, dann sagt bescheid.



  • Du solltest

    wndclass.lpszMenuName  = TEXT("IDR_MENU1");
    

    durch

    wndclass.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU1);
    

    ersetzen...



  • hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
    

    [quote"Compieler"]hInstance --- nicht declarierter Bezeichner[/quote]



  • "hInstance" ist in WinMain definiert... entweder Du machst jetzt eine globale Variable, wo Du diesen Wert speicherst, oder Du übergibst ihn eben...



  • Jochen Kalmbach schrieb:

    "hInstance" ist in WinMain definiert... entweder Du machst jetzt eine globale Variable, wo Du diesen Wert speicherst, oder Du übergibst ihn eben...

    wie mach ich das?



  • Vielleicht ganz einfach?

    HMODULE g_hInstance;
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
      g_hInstance = hInstance;
    

    // ...
    }



  • GetModuleHandle(NULL);

    Ist meiner Meinung nach schöner, als globale Variablen...



  • Tc++H schrieb:

    GetModuleHandle(NULL);
    Ist meiner Meinung nach schöner, als globale Variablen...

    Da kann man sich drüber streiten...
    Deine Lösung funktioniert nicht, wenn der Source in einer DLL steckt...

    Die "schönste" Lösung wäre es den passenden Funktionen/Klassen mitzugeben.



  • Herr Kalmbach,
    ich bin ihnen zu ewigem Dank verpflichtet. Als Zeichen meiner Dankbarkeit wird ihr name absofort unter meinen artikeln stehen!



  • Leon++ schrieb:

    Herr Kalmbach,

    Normalerweise spricht man sich doch hier mit Vornamen oder Nick-Name an, oder?

    Leon++ schrieb:

    ich bin ihnen zu ewigem Dank verpflichtet. Als Zeichen meiner Dankbarkeit wird ihr name absofort unter meinen artikeln stehen!

    Zu viel Ironie ist auch wieder schlecht... 😉


Anmelden zum Antworten