Groupbox: Membervariable zeigt auf Null?



  • Ich habe eine Groupbox mit einer CStatic Membervariable in meinem Dialog, aber sobald ich versuche, die Groupbox darüber anzusprechen, bekomme ich einen assertion error. Der Debugger zeigt mir zudem an, dass die Variable auf null zeigt. Aber wieso?

    Etwas Code:

    class tabDialog5 : public CDialog
    {
    // Construction
    public:
    	tabDialog5(CWnd* pParent = NULL);   // standard constructor
    	CStatic m_groupboxCamSetup; <------------------- meine Groupbox
    // Dialog Data
    	//{{AFX_DATA(tabDialog5)
    	enum { IDD = IDD_DIALOG5 };
    	//}}AFX_DATA
    [...]
    
    void tabDialog5::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(tabDialog5)
    	//}}AFX_DATA_MAP
    	DDX_Control(pDX, IDC_GROUPBOXCAMSETUP, m_groupboxCamSetup);
    }
    
    void tabDialog5::CreateBitmap()
    {
    [...]
    m_groupboxCamSetup.ShowWindow(true); <--------- error
    m_groupboxCamSetup.MoveWindow(......
    

    Mal eine Anmerkung nebenbei: Wieso muss C++/MFC so kompliziert sein? Ich habe bestimmt 33% meiner Diplomarbeit NUR Probleme an der GUI lösen müssen... Fehler wie dieser sind einfach unnötig. Genau wie dieser hier, der total unlogisch und überflüssig ist.



  • Hi,

    wo wird denn CreateBitmap aufgerufen?

    Die Membervariablen zu den Controls auf dem Dialog sind erst mit
    gültigem Fensterhandles gefüllt, nach dem die Methode OnInitDialog
    aufgerufen wird. Diese kannst Du ja überschreiben und dann an den Controls
    Veränderungen vornehmen.

    Gruß
    Frank



  • Ich lasse CreateBitmap erstmal aussen vor. Der Assertion Error kommt auch schon, wenn ich im OnInitDialog versuche

    m_groupboxCamSetup.ShowWindow(true);
    

    auszuführen. Ich verstehe das nicht, ich habe eben die komplette Klasse gelöscht, eine Schwesterklasse genommen, kopiert und umgeschrieben und nun sollte meine Klasse sauber sein. Auf dem Dialog ist NUR die Groupbox. Der Debugger sagt an der Variable: CStatic hwnd=0x00000000.

    Oder habe ich die Klasse falsch erstellt? Sie ist ein Tab eines DynTabCtrls. Ich hatte vergessen wie ich eine Klasse mit Dialog erstelle, also hab ich eine Schwesterklasse genommen und umgeschrieben, dazu ein Dialog erstellt. Es scheint ja alles sauber zu laufen, es gibt keine Fehlermeldung zur Kompilierung.

    EDIT: Nanu, mit GetDlgItem(IDC_GROUPBOXCAMSETUP)->ShowWindow(true); klappts?



  • Hi,

    das Fenster ist noch nicht an die Membervariable gebunden, deswegen ist das hwnd = NULL.

    Was passiert, wenn Du als erstes in OnInitDialog UpdataData(FALSE) ausführst?

    Gruß
    Frank



  • Super, daran hats wohl gelegen. Mal sehen, ob das in den anderen Klassen auch so war, da hatte ich dieses Problem nicht. Danke 🙂



  • Gern geschehen... 👍


  • Administrator

    Wenn ich noch was hinzusetzen darf:

    MSDN schrieb:

    CWnd::ShowWindow

    Sets the visibility state of the window.

    BOOL ShowWindow(
       int nCmdShow 
    );
    

    Parameters
    nCmdShow
    Specifies how the CWnd is to be shown. It must be one of the following values:

    • SW_HIDE Hides this window and passes activation to another window.
    • SW_MINIMIZE Minimizes the window and activates the top-level window in the system's list.
    • SW_RESTORE Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position.
    • SW_SHOW Activates the window and displays it in its current size and position.
    • SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window.
    • SW_SHOWMINIMIZED Activates the window and displays it as an icon.
    • SW_SHOWMINNOACTIVE Displays the window as an icon. The window that is currently active remains active.
    • SW_SHOWNA Displays the window in its current state. The window that is currently active remains active.
    • SW_SHOWNOACTIVATE Displays the window in its most recent size and position. The window that is currently active remains active.
    • SW_SHOWNORMAL Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position.

    Return Value
    Nonzero if the window was previously visible; 0 if the CWnd was previously hidden.

    Remarks
    ShowWindow must be called only once per application for the main window with CWinApp::m_nCmdShow. Subsequent calls to ShowWindow must use one of the values listed above instead of the one specified by CWinApp::m_nCmdShow.

    Man kann natürlich auch true und false angegeben welche dann automatisch in 1 und 0 verwandelt werden, was soviel wie SW_SHOWNORMAL und SW_HIDE bedeutet. Aber so ganz korrekt isses trotzdem nicht.

    Grüssli



  • Eine Groupbox als Window zu bezeichnen ist aber auch nicht ganz korrekt 😉 Dann müsste man die ja maximieren und minimieren können 😉 Aber ich werds im Hinterkopf behalten.


  • Administrator

    JPSelter schrieb:

    Eine Groupbox als Window zu bezeichnen ist aber auch nicht ganz korrekt 😉 Aber ich werds im Hinterkopf behalten.

    Es geht ja auch nicht darum, ob eine Groupbox ein Window ist oder nicht (denn in diesem Fall ist es von der MFC einfach als Fenster definiert!), sondern dass du die Funktion CWnd::ShowWindow benutzt und die aktzeptiert nunmal grundsätzlich kein true und false. Aber mir ist auch klar, dass dies eher ein Schönheitsfehler ist.

    Grüssli 😉



  • Eine Groupbox als Window zu bezeichnen ist aber auch nicht ganz korrekt

    Doch, völlig korrekt. Man kann es auch maximieren und minimieren. Nur als Child-Fenster ist das ein bisschen sinnfrei.


Anmelden zum Antworten