Problem mit CMFCPropertyGridCtrl im Release-Modus.



  • Ich benutzte VS2008, C++, mit Service Pack 1 und bin auf ein mir unerklärliches Problem mit der CMFCPropertyGridCtrl-Klasse gestoßen:

    Der Projektassistent hat mir bereits die Klassen mit einer neuen CPropertiesWnd-Klasse erstellt, die ich etwas modifiziert habe. An der Erstellung an sich wurde aber eigentlich nicht geändert, außer dass eigene Elemente eingefügt werden.

    Im Debugmodus funktioniert auch alles wunderbar, wenn ich im Releasemodus kompiliere, erscheint keine Liste, sondern "der letzte Hintergrund" wird angezeigt, welcher sich beim Öffnen des Programms an der Stelle befand. 😮

    Das Resultat sieht so aus: http://img383.imageshack.us/my.php?image=badpropwindowqq0.png.

    So sieht der Create-Teil in der CPropertiesWnd-Klasse aus:

    if (!m_wndPropList.Create(WS_VISIBLE | WS_CHILD, rectDummy, this, 2))
    	{
    		TRACE0("Fehler beim Erstellen des Eigenschaftenrasters. \n");
    		return -1;      
    	}
        m_wndPropList.SetOwner(this);
    
    	InitPropList();
    
    void CPropertiesWnd::InitPropList()
    {
    	SetPropListFont();
    
    	m_wndPropList.EnableHeaderCtrl(FALSE);
    	m_wndPropList.EnableDescriptionArea(TRUE);
    	m_wndPropList.SetVSDotNetLook(TRUE);
    	m_wndPropList.MarkModifiedProperties(TRUE, TRUE);
      ...
    }
    

    Create liefert true zurück.

    Testweise _DEBUG im Release-Modus zu aktivieren (und NDEBUG zu deaktivieren) hat nichts gebracht (außer fehlgeschlagene ASSERTS). Die Optimierungen habe ich auch schon testweise ohne Erfolg abgeschaltet.

    Danke für jede Hilfe,
    Gugi


  • Mod

    Untersuche mal mit dem Spy++ ob sich bei Dir Fenster überschneiden.
    Ich setze das Proerty Grid Control ohne Probleme ein.



  • Ah, danke, ich habe den Fehler gefunden.

    Es lag daran, dass ich die Combobox, die standardmäßig erstellt wird, "auskommentiert" habe.

    In der AdjustLayout() Funktion stand folgendes:

    void CPropertiesWnd::AdjustLayout()
    {
    	if (GetSafeHwnd() == NULL)
    		return;
    
    	CRect rectClient, rectCombo;
    	GetClientRect(rectClient);
    
    	//m_wndObjectCombo.GetWindowRect(&rectCombo);
    
    	int cyCmb = rectCombo.Size().cy;
    	int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
    
    	//m_wndObjectCombo.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), 200, SWP_NOACTIVATE | SWP_NOZORDER);
    	m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top + cyCmb, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
    	m_wndPropList.SetWindowPos(NULL, rectClient.left, rectClient.top + cyCmb + cyTlb, rectClient.Width(), rectClient.Height() -(cyCmb+cyTlb), SWP_NOACTIVATE | SWP_NOZORDER);
    }
    

    Nach dem ich

    rectCombo.SetRectEmpty();
    

    hinzugefügt habe, gings 🙂

    Ich hab einfach angenommen, dass die Werte im CRect Konstruktor mit 0 initialisiert werden (warum werden sie dass eigtl. nicht? Die Möglichkeit bestände doch? Ich mach das immer bei benutzerdefinierten Klassen).



  • Hallo,

    Gugi schrieb:

    Ich hab einfach angenommen, dass die Werte im CRect Konstruktor mit 0 initialisiert werden (warum werden sie dass eigtl. nicht?

    Immerhin ist es dokumentiert:

    Gugi schrieb:

    If no arguments are given, left, top, right, and bottom members are not initialized.

    😃

    MfG,

    Probe-Nutzer


Anmelden zum Antworten