2013-04-08 13 views
7

Ho un controllo C# che uso all'interno di VB6, che è fondamentalmente un pannello con angoli arrotondati. Mi piacerebbe sapere se c'è un modo per rendere quel controllo un contenitore, una specie di Frame è un contenitore. Fondamentalmente voglio essere in grado di posizionare le cose al suo interno in modo che si muovano tutti insieme e, soprattutto, posizionare le cose di fronte di esso.Controllo COM in VB6: Crea un contenitore fuori dal controllo

In questo momento se inserisco, diciamo, un'etichetta o un comando su di esso, va dietro il mio controllo COM e usando Bring to Front e Send to Back non fa nulla.

Devo dichiararlo come contenitore in vb6? Il codice deve venire da C#?

Edit:

ho firmato un NDA quindi non posso postare l'intero codice qui, ma vi posterò alcuni e spiegare alcune.

public class AzPanel : Panel 
{ 
    protected const int BORDER_WIDTH = 3; 
    protected int BORDER_RADIUS = 4; 
    private object _lock = new object(); 
    private bool regionNeedsRefresh = false; 

    public AzPanel() : base() 
    { 
     this.SetStyle(
      ControlStyles.DoubleBuffer | 
      ControlStyles.AllPaintingInWmPaint | 
      ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     this.SetStyle(ControlStyles.Selectable, false); 
     base.BackColor = Color.Transparent; 
     this.BorderColor = Color.DarkRed; 
     this.ContentColor = Color.DarkGoldenrod; 
     this.DoubleBuffered = true; 

     base.Padding = new Padding(3, 3, 4, 4); 
    } 
} 

Ci sono alcune altre cose da definire una regione con angoli arrotondati pure, ma è fondamentalmente solo un pannello. Ho una classe che estende AzPanel, AzPanelCOM con i seguenti attributi:

[Guid("...")] 
[ProgId...] 
[ComVisible(true)] 
[ComdefaultInterface...] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 

Così come interfaccia, IAzPanelCOM, esporlo a VB6.

[Guid("...")] 
[ComVisible(true)] 
public interface IAzPanelCOM 
{ 
    void DesignTimeReload(); 
    //some other things 
} 

Su accumulo io uso "regasm.exe" per creare una libreria dei tipi (TLB) che ho importazione in VB6 su una macchina virtuale che esegue Windows XP e VS2010 (.NET Framework 4.0).

Posso quindi istanziare AzPanels, ridimensionarli e spostarli anche in fase di progettazione, e posso aggiungere comandi (pulsanti) a loro senza problemi. Quando si tratta di forme o etichette, tuttavia, sembrano apparire dietro il pannello e non posso portarli in primo piano.

+0

Quindi ho quasi tutto funzionante, ma sembra che sia stata la parte facile. Sono in grado di farlo in modo che il mio pannello sia un contenitore, ma posizionare forme, linee ed etichette "dentro" le pone dietro il mio controllo. Si muovono tutti con il controllo, ma sono invisibili. Qualsiasi aiuto sarebbe molto apprezzato! – Felix

+0

Mi piacerebbe aiutarti a eseguire il debug ma non ho idea di come sia il tuo codice ... – djv

+2

Solo per ricontrollare, stai usando un controllo .net in VB6 via COM. Una ricerca rapida ha rivelato questo: http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/1beac437-b5d8-42c9-b226-45688c6d5962 tl; dr: Il controllo è esposto come un comune controllo, ma non implementa le stesse interfacce, quindi non è possibile aggiungere controlli. – Fry

risposta

1

secondo @MarkBertenshaw Commento

Non è possibile utilizzare i controlli di finestra (forma, etichetta, et.c) con un componente contenitore NET. Tuttavia, è possibile utilizzare un controllo con finestra VB, ad es. Frame (senza bordo) o Picture Box all'interno del componente .NET, in cui si posizionano i controlli senza finestra