2009-12-18 18 views
1

Je me demande s'il est possible de lier (visuellement et fonctionnellement) deux commandes (composants)? (.NET2)Lier deux contrôles en un

Simplifiant les choses, j'ai deux étiquettes - l'une est l'étiquette principale (elle peut être déplacée avec la souris) et un autre - l'étiquette de description - elle doit suivre l'étiquette principale sur un distance spécifiée.

En outre, l'étiquette de description doit être en mesure de répondre aux événements, comme la souris, etc. cliquez Peut-être il y a une possibilité d'utiliser un UserControl mais entre les étiquettes je dois être un espace « transparent ».

Merci.

== == 1 EDIT

Je pourrais aussi, au lieu de créer la deuxième commande d'étiquettes, il suffit d'utiliser une info-bulle éternelle . Dans ce cas, je m'interroge sur la possibilité de l'afficher à l'infini et aussi la possibilité de détecter le clic sur l'info-bulle.

Quoi qu'il en soit, si je clique sur l'étiquette ou l'info-bulle, je devrai afficher à l'utilisateur une zone de texte contrôle (au lieu de l'info-bulle ou l'étiquette), afin qu'il soit en mesure de modifier la description affichée (en la durée d'affichage fait)

== == EDIT 2

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/Sy9Mk8-Z-xI/AAAAAAAACzo/-5huzSd59j4/s800/UserControl.png

ceci est mon "transperent" design UserControl

alt text http://lh5.ggpht.com/_1TPOP7DzY1E/Sy9MlM31jUI/AAAAAAAACzs/xIJ0hcgOzwo/s800/UserControlForm.png

et ceci est ma forme en mode de fonctionnement (contrôle d'utilisateur "transparent" région couvrant un bouton).

c'est le code du UserControl:

using System; 
using System.Windows.Forms; 
using System.Drawing; 

namespace WindowsControlLibrary1 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x00000020;//WS_EX_TRANSPARENT 
       return cp; 
      } 
     } 

     private int opacity; 
     public int Opacity 
     { 
      get { return opacity; } 
      set 
      { 
       opacity = value; 
       this.InvalidateEx(); 
      } 
     } 

     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      Color bk = Color.FromArgb(Opacity, this.BackColor); 
      e.Graphics.FillRectangle(new SolidBrush(bk), e.ClipRectangle); 
     } 

     protected void InvalidateEx() 
     { 
      if (Parent == null) 
       return; 
      Rectangle rc = new Rectangle(this.Location, this.Size); 
      Parent.Invalidate(rc, true); 
     } 

     private void label1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       this.Location = this.Location + (Size)e.Location; 
      } 
     } 

     Point cursorDownPoint = Point.Empty; 
     private void label1_MouseDown(object sender, MouseEventArgs e) 
     { 
      cursorDownPoint = label1.PointToScreen(e.Location); 
     } 
    } 
} 

=================

* La description était un peu simplifiée. Dans mon cas réel, j'ai un composant point circulaire personnalisé (: de Microsoft.VisualBasic.PowerPacks.OvalShape). Le point représente un objet dans la position temporelle - dans l'étiquette liée, j'ai besoin de spécifier l'heure du point. L'utilisateur pourra modifier l'heure du point en cliquant sur l'étiquette horaire.

+0

Réponse à l'édition 2: Réglez-vous l'opacité sur zéro? –

+0

@Josh: Oui ... c'est 0 par défaut. Je l'ai mis aussi à 5, mais cela n'a pas changé mais la nuance de couleur de fond. – serhio

Répondre

2

Créez un User Control. Une solution de contournement pour le problème de transparence est décrite here.

+1

ok, j'ai mis en évidence le mot * UserControl * dans mon message en ** gras **. – serhio

+0

Alors créez-en un, sage. C'est exactement ce dont vous avez besoin. –

+1

Ensuite, vous devriez envisager de résoudre le problème sous-jacent. **En gras**. http://social.msdn.microsoft.com/forums/en-US/winforms/thread/a9c78c36-0569-4339-a499-b8411c5bbffb/ –