ereignis eines menuitems vom mdichild aufrufen



  • hallo, ich möchte gerade ne mdi-anwendung schreiben.
    mein problem ist, dass ich ein ereigis für ein menuitem vom mdichild aus nicht aufrufen kann.
    wenn ich das ereigis im framewindow hinzufüge, funktioniert es.

    LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT uMsg, WPARAM wParam,
    	LPARAM lParam) {
    	switch(uMsg) {
    	case WM_CREATE:
    		hChildStatic = CreateWindowEx(0, "static", "Hello World!",
    			WS_CHILD | WS_VISIBLE, 10, 10, 100, 20, hWnd, 0, 0, 0);
    		break;
    	case WM_COMMAND:
    		if (wParam == (WPARAM)IDM_CHILDCOMMAND) {
    			MessageBox(hWnd, "Test", 0, 0);
    		}
    		break;
    	}
    
    	return DefMDIChildProc(hWnd, uMsg, wParam, lParam);
    }
    

    was kann ich tun, damit ich das menuereignis vom childwindow ausrufen kann? oder muss ich das vom framewindow aufrufen?



  • Du müsstest im (Default)-WM_COMMAND-Zweig der FrameProc das momentan aktive Fenster per WM_MDIGETACTIVE ermitteln und dann die Nachricht per SendMessage weiterleiten.



  • ja, danke erstmal...

    aber was soll ich tun, wenn ich ein control im mdichild drin habe?

    ich habe es nach deiner art mit wm_mdigetactive gemacht und dann habe ich mit findwindowex nach dem control im mdichild gesucht.

    hChildWnd = (HWND)SendMessage(hMDIClientArea, WM_MDIGETACTIVE, 0, 0);
    hChildEdit = FindWindowEx(hChildWnd, 0, "edit", 0);
    SendMessage(hTest, WM_SETTEXT, 0, (LPARAM)"Test");
    

    funktioniert auch, aber was soll ich tun, wenn ich mehrere edits im mdichild habe?
    jedes edit hat ja schließlich den gleichen klassennamen und das handle des edits kann ich mit findwindowex auch nicht angeben. zumindest habe ich es ohne erfolg per hwndchildafter versucht.



  • sorry,

    nicht

    SendMessage(hTest, WM_SETTEXT, 0, (LPARAM)"Test");
    

    sondern

    SendMessage(hChildEdit, WM_SETTEXT, 0, (LPARAM)"Test");
    

    wie gesagt, die frage bleibt weiterhin bestehen.



  • Du kannst doch das Child selber die Nachricht verarbeiten lassen:
    Copy & paste aus Petzolds e-book:

    Copy&paste aus Petzolds e-book:
    LRESULT CALLBACK FrameWndProc (HWND hwnd, UINT message, 
                                   WPARAM wParam, LPARAM lParam)
    {
         HWND               hwndChild ;
    
         switch (message)
         {
         case WM_COMMAND:
              switch (LOWORD (wParam))
              {    
    	  // ...           
              default:             // Pass to active child...
    
                   hwndChild = (HWND) SendMessage (hwndClient,
                                                   WM_MDIGETACTIVE, 0, 0) ;
                   if (IsWindow (hwndChild))
                        SendMessage (hwndChild, WM_COMMAND, wParam, lParam) ;
    
                   break ;        // ...and then to DefFrameProc
              }
              break ;
              // Pass unprocessed messages to DefFrameProc (not DefWindowProc)
    
         return DefFrameProc (hwnd, hwndClient, message, wParam, lParam) ;
    }
    

    Das Child kennt doch vermutlich die IDs der Editcontrols bzw. hat die Handles gespeichert. Daher wird die Nachricht auch weitergeleitet:

    // ChildProc:
    case WM_COMMAND:
      switch(LOWORD(wParam)
      {
        case IRGENDWAS:
        {
          HWND editcontrol = GetDlgItem(hwnd, ID_des_Controls);
          // Text ändern etc.
        }
      }
      return DefMDIChildProc(...);
    }
    

Anmelden zum Antworten