Im Child-Fenster funktioniert Edit-Control nicht ...



  • Hallo,

    ich habe in meinem Hauptfester ein Childfenster erzeugt. Dieses Child-Fenster soll als Container für weitere Controls fungieren. Beim Edit-Control gibt's aber Probleme:
    Sobald ich das Child-Fenster mit den Windowstyles WS_CHILD und WS_CAPTION erzeuge, kann ich mit der Maus nicht mehr das Edit-Control aktivieren.
    Ich habe meinen Code angefügt in dem dem Child Fenster verschiedene Styles zugewiesen werden. Per Klick auf den Button werden die Styles gewechselt:
    1. WS_POPUP | WS_VISIBLE | WS_CAPTION
    2. WS_POPUP | WS_VISIBLE
    3. WS_CHILD | WS_VISIBLE | WS_CAPTION
    4. WS_CHILD | WS_VISIBLE

    Vielleicht hat einer eine Idee ..

    Danke d_A

    #include <windows.h>
    #include <stdio.h>
    
    // PROTOTYPING
    LRESULT CALLBACK Main_WndProc ( HWND, UINT, WPARAM, LPARAM );
    LRESULT CALLBACK Child_WndProc ( HWND, UINT, WPARAM, LPARAM );
    static void Register_All ( HINSTANCE );
    
    #define WINDOW_UNDEF 0
    #define CHILD_WINDOW_WITH_CAPTION 1
    #define CHILD_WINDOW_WITHOUT_CAPTION 2
    #define POPUP_WINDOW_WITH_CAPTION 3
    #define POPUP_WINDOW_WITHOUT_CAPTION 4
    
    HWND hwnd_Main;
    
    typedef struct {
       int win_typ;
       char *txt;
       DWORD win_styles;
    } WIN_DATA;
    
    WIN_DATA win_data [] = {
       { POPUP_WINDOW_WITH_CAPTION,
         "POPUP-Window mit Title-Bar\r\nEditieren möglich !",
         WS_POPUP | WS_VISIBLE | WS_CAPTION
       },
       { POPUP_WINDOW_WITHOUT_CAPTION,
         "POPUP-Window ohne Title-Bar\r\nEditieren möglich !",
         WS_POPUP | WS_VISIBLE
       },
       { CHILD_WINDOW_WITH_CAPTION,
         "CHILD-Window mit Title-Bar\r\nKein Editieren möglich ! :-(",
         WS_CHILD | WS_VISIBLE | WS_CAPTION
       },
       { CHILD_WINDOW_WITHOUT_CAPTION,
         "CHILD-Window ohne Title-Bar\r\nEditieren möglich !",
         WS_CHILD | WS_VISIBLE
       },
       {
         WINDOW_UNDEF,
         0,
         0
       },
    };
    
    #define DIALOG_CHILD_EDIT_CONTROL 1
    #define DIALOG_CHILD_BUTTON 2
    
    //
    // HAUPTFUNKTION
    //
    int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE hPrevInstance, PSTR lpszCmdLine, int nCmdShow )
    {
       MSG msg;
       if ( !hPrevInstance ) {
          Register_All ( hInst );
       }
       // HAUPTFENSTER CREIEREN
       hwnd_Main = CreateWindowEx ( 0L, "MAIN_WINDOW", "Version -1 ;-)",
                                    WS_OVERLAPPEDWINDOW
                                    | WS_VISIBLE
                                    | WS_CLIPSIBLINGS
                                    | WS_CLIPCHILDREN,
                                    CW_USEDEFAULT, CW_USEDEFAULT,
                                    CW_USEDEFAULT, CW_USEDEFAULT,
                                    NULL, NULL, hInst, NULL );
       ShowWindow ( hwnd_Main, nCmdShow );
       UpdateWindow ( hwnd_Main );
       while (GetMessage ( &msg, NULL, 0, 0 )) {
          TranslateMessage ( &msg );
          DispatchMessage ( &msg );
       }
       return ( msg.wParam );
    }
    //
    // WINDOW-PROZEDUR FUER HAUPTFENSTER
    //
    LRESULT CALLBACK Main_WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
    {
       HDC hdc;
       PAINTSTRUCT ps;
       RECT rc_c, rc_w;
    
       switch ( message ) {
          case WM_CREATE:
    
             GetClientRect ( hwnd, &rc_c );
             GetWindowRect ( hwnd, &rc_w );
             // CHILD-FENSTER MIT EDIT-CONTROL
             CreateWindowEx ( 0L, "CHILD_WINDOW", "Controls-Container",
                              win_data[0].win_styles,
                              rc_c.right / 20, rc_c.bottom / 10,
                              4 * rc_c.right / 10, 4 * rc_c.bottom / 10,
                              hwnd,
                              (HMENU) 0,
                              (HINSTANCE) GetWindowLong ( hwnd, GWL_HINSTANCE),
                              NULL );
             return ( 0 );
          break;
          case ( WM_PAINT ):
             hdc = BeginPaint ( hwnd, &ps );
             EndPaint ( hwnd, &ps );
             return ( 0 ) ;
          break;
          case WM_DESTROY:
             PostQuitMessage ( 0 );
             return ( 0 );
          break;
       }
       return ( DefWindowProc ( hwnd, message, wParam, lParam ) );
    }
    //
    // WINDOW-PROZEDUR FUER CHILD-FENSTER
    //
    LRESULT CALLBACK Child_WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
    {
       HDC hdc;
       PAINTSTRUCT ps;
       static HWND hwnd_edit, hwnd_button;
       static WIN_DATA *win_data_ptr;
    
       switch ( message ) {
          case WM_CREATE:
             // EDIT-CONTROL
             hwnd_edit = CreateWindowEx ( WS_EX_CLIENTEDGE, "Edit", "",
                         WS_CHILD
                         | WS_BORDER
                         | WS_VISIBLE
                         | ES_MULTILINE
                         | WS_CLIPCHILDREN,
                         0, 0, 0, 0,
                         hwnd,
                         (HMENU) DIALOG_CHILD_EDIT_CONTROL,
                         (HINSTANCE) GetWindowLong ( hwnd, GWL_HINSTANCE), NULL );
    
             // SETFOCUS-BUTTON
             hwnd_button = CreateWindowEx ( WS_EX_CLIENTEDGE, "Button", "Push",
                            WS_CHILD
                            | WS_BORDER
                            | WS_VISIBLE
                            | WS_CLIPCHILDREN,
                            0, 0, 0, 0,
                            hwnd,
                            (HMENU) DIALOG_CHILD_BUTTON,
                            (HINSTANCE) GetWindowLong ( hwnd, GWL_HINSTANCE), NULL            );
    
             win_data_ptr = &win_data[0];
             SetWindowText ( hwnd_edit, win_data_ptr->txt );
             return ( 0 );
          break;
          case ( WM_SIZE ):
             if ( (hwnd_edit != (HWND) 0) && (hwnd_button != (HWND) 0 ) ) {
                // EDIT-CONTROL ANPASSEN
                MoveWindow ( hwnd_edit, 0, 0, 7 * LOWORD ( lParam ) / 10, HIWORD ( lParam ), TRUE );
                // BUTTONANPASSEN
                MoveWindow ( hwnd_button, (7 * LOWORD ( lParam ) / 10), 0,
    (3 * LOWORD ( lParam ) / 10), HIWORD ( lParam ), TRUE );
             }
          break;
          case ( WM_PAINT ):
             hdc = BeginPaint ( hwnd, &ps );
             EndPaint ( hwnd, &ps );
             return ( 0 ) ;
          break;
          case ( WM_COMMAND ):
             switch ( LOWORD ( wParam ) ) {
                case ( DIALOG_CHILD_BUTTON ):
                   win_data_ptr++;
                   if ( win_data_ptr->win_typ == WINDOW_UNDEF ) {
                      win_data_ptr = &win_data[0];
                   }
                   switch ( win_data_ptr->win_typ ) {
                      case ( CHILD_WINDOW_WITH_CAPTION ):
                         SetParent ( hwnd, hwnd_Main );
                      break;
                      case ( CHILD_WINDOW_WITHOUT_CAPTION ):
                         SetParent ( hwnd, hwnd_Main );
                      break;
                      case ( POPUP_WINDOW_WITH_CAPTION ):
                         SetParent ( hwnd, NULL );
                      break;
                      case ( POPUP_WINDOW_WITHOUT_CAPTION ):
                         SetParent ( hwnd, NULL );
                      break;
                   }
                   SetWindowText ( hwnd_edit, win_data_ptr->txt );
                   SetWindowLong ( hwnd, GWL_STYLE, win_data_ptr->win_styles );
                   SetWindowPos ( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED );
                break;
             }
          break;
       }
       return ( DefWindowProc ( hwnd, message, wParam, lParam ) );
    }
    //
    // REGISTRIEREN
    //
    static void Register_All ( HINSTANCE hInst )
    {
       WNDCLASSEX win;
    
       // HAUPTFENSTER
       ZeroMemory ( &win, sizeof ( win ));
       win.cbSize = sizeof ( win );
       win.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
       win.lpfnWndProc = Main_WndProc;
       win.cbClsExtra = 0;
       win.cbWndExtra = 0;
       win.hInstance = hInst;
       win.hCursor = LoadCursor ( NULL, IDC_ARROW );
       win.hbrBackground = (HBRUSH) CreateSolidBrush ( RGB ( 192, 192, 192 ) );
       win.lpszMenuName = NULL;
       win.lpszClassName = "MAIN_WINDOW";
       RegisterClassEx ( &win );
       // CHILDFENSTER
       ZeroMemory ( &win, sizeof ( win ));
       win.cbSize = sizeof ( win );
       win.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
       win.lpfnWndProc = Child_WndProc;
       win.cbClsExtra = 0;
       win.cbWndExtra = 0;
       win.hInstance = hInst;
       win.hCursor = LoadCursor ( NULL, IDC_ARROW );
       win.hbrBackground = (HBRUSH) CreateSolidBrush ( RGB ( 192, 192, 192 ) );
       win.lpszMenuName = NULL;
       win.lpszClassName = "CHILD_WINDOW";
       RegisterClassEx ( &win );
    }
    


  • Warum nimmste nicht MDI dafür? Ist doch auch sowas wie ein Kontainer



  • ja, umgehen kann ich das wohl, aber ich möchte wissen wo der Unterschied ist !
    😕



  • hallo !

    es würde mich einfach mal interessieren ob jemand auch mal am Problem rumprobiert hat und auf das gleiche Ergebnis gekommen ist...

    Ich habe mich bereits abgefunden es so nicht zu programmieren, obwohl ich keinen groben Fehler finden kann. (.. aber was man nicht weiss kann man ja auch nicht finden... 🙄 )

    Danke und Gruss d_A



  • Damit biste doch schon anderen auf den Sack gegangen:: http://spotlight.de/zforen/ccc/m/ccc-1046875595-26599.html



  • WebFurzi: Da ist aber immer noch keine Lösung. Kann man mit dir eigentlich nicht vernünftig diskutieren? Mußt du immer den Besserwisser raushängen lassen? 🙄



  • Ich finde auch, dass das nicht OK ist.

    @<der_anhalter>: Ich hab mit deinem Proggi rumprobiert, aber auch keine Lösung gefunden. Mich wundert aber, dass der Button den Fokus bekommen kann - das Edit aber nicht. 😕



  • Scheint irgendwie am Edit zu liegen, bei anderen Controls funzt es 🙄



  • Hallo,

    ich denke mitlerweile, dass ein Fenster mit WS_CHILD-Style nicht dafür geschaffen ist, sich über den Bildschirm schieben zu lassen.
    Das MSDN sagt, dass Fenster mit WS_CHILD-Style ein Hauptfenster logisch einteilen sollen:
    <i>An application typically uses child windows to divide the client area of a parent window into functional areas....</i>

    Alle Fenster die einen "anspringen" und damit auch frei verschiebbar sind, (z.B. Dialoge), sind Fenster mit WS_POPUP-Style.

    Mir ist das Verhalten beim Nachbilden des Docking-Mechanismus aufgefallen. Im angedockten Zustand arbeitet das Edit-Control in meinem Child-Fenster korrekt. Löse ich das Childfenster, indem ich nur den Style WS_CAPTION zufüge bekomme ich die Schwierigkeiten. Erst wenn ich aus dem Fenster ein WS_POPUP-Fenster mache funktioniert alles wieder einwandfrei.
    (...so verhält sich auch das "Arbeitsbereich"-Fenster unter MSVC: gedockt = WS_CHILD, frei = WS_POPUP...)

    ich werde es dabei vorerst einmal belassen...
    danke, dass Ihr einen Blick darauf geworfen habt...

    Gruss d_A

    @<WebFurzi>:

    Original erstellt von <WebFurzi>:
    Damit biste doch schon anderen auf den Sack gegangen:: [url=http://spotlight.de/zforen/ccc/m/ccc-1046875595-26599.html

    ]http://spotlight.de/zforen/ccc/m/ccc-1046875595-26599.html[/QB][/QUOTE][/url]

    Warum nennst Du dich eigentlich hier nicht auch Dr. C. WinApi ?? 😮


Anmelden zum Antworten