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...

-
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.
-
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.