Button auf PropertyPage



  • Ich habe ein MFC-Prog, die Oberfläche ist von CFormView abgeleitet, darauf sitzt ein CPropertySheet und dadrin mehrere CPropertyPages. Ich lasse beim Erstellen der CPropertySheet eine Datei auslesen, die danach eine bestimmte Anzahl benötigter PropertyPages erzeugt. Nachdem diese erzeugt sind, lese ich eine andere Datei aus und möchte je nach Inhalt einige Buttons auf der CPropertyPage erstellen lassen. Das Auslesen der Variablen klappt, nur beim Erstellen der Buttons tut sich nichts.

    Laut der msdn geschieht das ja hiermir:
    CButton::Create
    BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

    für CWnd* pParentWnd dachte ich mir, müsste this passend sein, aber es werden keine Buttons gezeichnet. Und mit GetParent() führt das ganze immer zum Absturz 😞

    Hier mal mein Codestück:

    btn[i].Create( structBtn[i].sName, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
    	Rect( 0, iNextPosY, 90, structBtn[i].iSize * 8 ),
    	this, structBtn[i].cmdID );
    

    Was muss ich statt this oder GetParent() nehmen?
    Die Buttons werden in der Klasse definiert, nicht lokal in der Funktion.



  • hier keiner ne idee? naja mal schaun, vielleicht kommt mir nachher auf arbeit die erleuchtung 😃



  • Hab mal Debug durchlaufen lassen, diese Wanungen kommen:
    Warning: no message line prompt for ID 0xC350.
    Warning: Window creation failed: GetLastError returns 0x0000057E

    Wenn er in

    BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
    	LPCTSTR lpszWindowName, DWORD dwStyle,
    	int x, int y, int nWidth, int nHeight,
    	HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
    

    geht, ist HWND hWndParent immer NULL und

    HWND hWnd = ::CreateWindowEx(cs.dwExStyle, cs.lpszClass,
    			cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
    			cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);
    

    bekommt auch NULL



  • Ich habe mal per "Suchen in Dateien" im Visual Studio Verzeichnis das hier gefunden:

    //
    // MessageId: ERROR_TLW_WITH_WSCHILD
    //
    // MessageText:
    //
    //  Cannot create a top-level child window.
    //
    #define ERROR_TLW_WITH_WSCHILD           1406L
    

    Das ist der Fehler, den du gemeldet bekommst (erstmal von Hex in Dez umrechnen).

    Der Grund für diese Meldung ist, dass du als Parent NULL übergibst. Sonst kann ich dir leider nicht wirklich weiterhelfen.

    Blos noch die obligatorische Frage: Ist OnInitDialog schon gemacht worden zu dem Zeitpunkt? Das wäre mein Ansatz...

    Viel Glück! 🙂



  • ja, oninitdialog wurde schon ausgeführt.
    ich lasse in cpropertysheet 2pages erstellen, wenn diese erstellt sind lese ich eine datei ein, gebe den pages die richtigen titel und will die buttons erstellen (alles in der sheet). zum buttons erstellen wird dann selber eine fkt in der page aufgerufen, die den obrigen ausschnitt enthält.

    grad gesehen, schon in der CButton::Create wo ich this übergebe, wird mir folgende Info zu this angezeigt, wenn ich mit der Maus drübergehe:
    0x002f6f94 {CONUTABContent hWnd=0x00000000}
    Wieso is der hWnd auf 0, das darf doch eigentlich nicht sein oder?



  • mhh da ich es nicht hinbekomme, dachte ich, erstelle ich auf der propertypage einfach 20buttons (mehr werden nie angezeigt) und blende unbenutzte aus.
    aber da ich in dem sheet mehrere variablen der gleichen propertypage-klasse habe, dürfte das doch nicht klappen oder? wegen der ids, die die buttons vom dialogeditor bekommen.
    also wenn ich z.b. 2 pages vom typ CMyPropertyPage habe und auf dem zugeordnetem Dialog sind 5Buttons, können die dann für beide Pages genutzt werden? ich hoffe es ist verständlich was ich meine


Anmelden zum Antworten