Zweites ActiveX nimmt die vorhergehenden Einstellungen



  • Hallo!

    Ich habe ein ActiveX-Steuerelement mit dem MFC-ActiveX.. Assistenten erstellt.Nun habe ich dem Steuerelement eine Hintergrundfarbe-Eigenschaft hinzugefügt.Sie läuft ganz gut! Wenn ich sie ändere dann wird die Hintergrundfarbe automatisch geändert. Nun habe ich festgestellt das, wenn ich ein zweites solches Steuerelement auf die Form ziehe die Eigenschaften des ersten Steuerelements übernommen werden.Wie kann ich das verhindern ?

    Vielen Dank im voraus!
    Ronny.W 😕



  • Steht die Eigenschaft in der Klasse oder in der CPP) ?



  • ja steht sie! ich habs jetzt mal anders gemacht! Ich hab die Variablen als private membervariable deklariert! Das funktioniert! Allerdings wenn ich jetzt ein Steuerelement auf der Form kopiere, werden die Einstellungen des kopierten Steuerelements nicht übernohmen. Wie kann ich denn das realisieren ?
    Kannst du mich weiterhelfen ?

    Vielen Dank!

    Ronny.W :p



  • Es gibt mehrere Möglichkeiten:
    1. die komplexeste unter Nutzung des Clipboards
    - das Ax wird in ein IDataObject serialisiert
    - per OleSetClipboard in die Zwischenablage geschoben
    - beim Einfügen auf die Daten des IDataObject zugreifen
    - ein CFile daraus anlegen
    - diesen FilePointer bei CWnd::CreateControl übergeben (die Initialisierungsdaten)

    2. einfacher ohne Nutzung des Clipboards
    - OleSave oder OleSaveToStream aufrufen (je nachdem, welche Schnittstellen das Ax unterstützt)
    - Stream in CFile umwandeln (möglicherweise ein CMemFile nehmen)
    - aus FilePointer wie oben neues Control initialisieren



  • Hallo!

    Leider bin ich noch nicht so unbedingt der Profi (aber ich arbeite drann 🙄). Kannst du mir die zweite Variante vielleicht etwas ausführlicher erklären ? Das wäre sehr nett!

    Vielen Dank.
    Ronny.W



  • // Speichern
    HRESULT SaveAxToStream( /*in*/CWnd* pAx, /*out*/LPSTREAM* ppStm)
    {
        LPUNKNOWN pUnk = pAx->GetControlUnknown(); // Abfrage des Ax
        HRESULT hr = S_OK;
        IPersistStream*  pPStm;
        // Persistenzschnittstellen abfragen
        if( FAILED( pUnk->QueryInterface( IID_IPersistStream, (LPVOID*)&pPStm)) ||
          FAILED( pUnk->QueryInterface( IID_IPersistStreamInit, (LPVOID*)&pPStm)))
              return hr;
        if( SUCCEEDED( CreateStreamOnHGlobal( NULL, TRUE, ppStm)))  // Stream erstellen
            // Speichern
            hr = OleSaveToStream( pPStm, *ppStm);
        pPStm->Release();
        return hr;
    }
    
    BOOL CMeinDialog::KopiereActiveX( CWnd* pAxSrc, CWnd* pWndDest)
    {
      BOOL bRet = FALSE;
      LPSTREAM pStm;
      if( FAILED( SaveAxToStream( pAxSrc, &pStm)))
        return bRet;
      IPersist* pPersist;
      if( SUCCEEDED( pStm->QueryInterface( IID_IPersist, (LPVOID*)&pPersist)))
      {
        CLSID clsid;
        pPersist->GetClassID( &clsid);
        pPersist->Release();
        HGLOBAL hGlobal;
        GetHGlobalFromStream( pStm, &hGlobal);
        LPVOID pData = GlobalLock( hGlobal);
        // MemoryFile von Stream erstellen
        CMemFile file( (LPBYTE)pData, GlobalSize( hGlobal));
        if( pWndDest->CreateControl( clsid, ..., &file))  // Initialisierungsdaten an CreateControl übergeben
          bRet = TRUE;
        file.Detach();
        GlobalUnlock( hGlobal);
      }
      pStm->Release();
      return bRet;
    }
    

    [ Dieser Beitrag wurde am 06.06.2003 um 12:14 Uhr von RenéG editiert. ]



  • Danke für den umfangreichen Code.
    Werde ihn gleich mal ausprobieren!

    Allerdings auf den ersten Blick sieht es so aus als müsste ich eine funktion aufrufen um das ActiveX zu kopieren. Dachte aber eigentlich eher daran das dann auf der VB6 Form zu kopieren (mit rechten Maustaste ...), oder irre ich mich da?

    Viele Dank für deine Mühe!

    Gruß Ronny
    😮



  • Toll ... 😞

    Nach Deinen ersten Informationen nahm ich an, du schreibst Deinen eigenen Container. Jetzt erzählst Du, dass Du den VB6-Formcontainer einsetzt!
    Bitte rück das nächste Mal etwas eher mit solch wichtigen Informationen heraus!

    Was Du also vergessen hast, ist, dass das ActiveX seine Eigenschaften selber serialisieren muss.
    Handelt es sich um eine vordefinierte Eigenschaft (bei Dir also BackColor), sollte der Klassenassistent automatisch folgenden Code in das ActiveX geschrieben haben:
    DISP_STOCKPROP_BACKCOLOR( )

    Ist das nicht der Fall, verweise ich Dich mal auf den Klassenassistenten!



  • Vielen Dank für deine Hilfe,
    werde es gleich mal ausprobieren!

    Gruß Ronny :p


Anmelden zum Antworten