2017-03-08 5 views
0

J'ai créé mon propre contrôle personnalisé et je souhaite définir ce contrôle personnalisé comme info-bulle pour les autres contrôles. Donc, j'ai ajouté des codes pour définir le contrôle personnalisé comme par infobulle sendMessage par le code ci-dessous,SendMessage ne parvient pas à définir la fenêtre de l'info-bulle

public class MyControl : Control 
{ 
    Dictionary<IntPtr, Component> m_tools; 
    TOOLINFO m_toolInfo; 

    public MyControl() 
    { 
     m_tools = new Dictionary<IntPtr, Component>(); 
     m_toolInfo = new TOOLINFO(); 
    } 

    string myTipText; 

    public string MyTipText 
    { 
     get 
     { 
      return myTipText; 
     } 
     set 
     { 
      myTipText = value; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     SolidBrush brush = new SolidBrush(Color.Blue); 
     e.Graphics.DrawString(this.MyTipText, this.Font, brush, e.ClipRectangle.Location); 
    } 

    internal void AddControl(Component component) 
    { 
     if (component != null) 
     { 
      if (component is Control) 
      { 
       Control control = component as Control; 

       control.HandleCreated += control_HandleCreated; 

       if (control.IsHandleCreated) 
       { 
        control_HandleCreated(control, EventArgs.Empty); 
       } 
      } 

     } 
    } 

    void control_HandleCreated(object sender, EventArgs e) 
    { 
     Control control = sender as Control; 

     if(control!=null) 
     { 
      m_tools[control.Handle] = control; 

      m_toolInfo.hwnd = this.Handle; 
      m_toolInfo.uId = control.Handle; 

      **int result = WindowsAPI.SendMessage(this.Handle, (int)TTM.TTM_ADDTOOLW, 0, ref m_toolInfo);** 
     } 
    } 

} 

Mais les résultats de SendMessage en échec. Puis-je savoir, pourquoi le contrôle personnalisé ne parvient pas à définir comme Tooltip pour le contrôle.

Voici le SendMessage,

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError=true)] 
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref TOOLINFO lParam); 

Je ne pouvais pas trouver la raison de l'échec. S'il vous plaît, quelqu'un m'aidera à ce sujet.

Cordialement, Amal Raj U.

Répondre

0

je ne pouvais pas vous voir WNDPROC Méthode. Tous les messages seront envoyés à votre adresse. Mais à moins qu'un cather like "WndProc (ref Message m)" et qu'il n'y ait pas de transmission par défaut pour vos messages personnalisés, ils volent sur les ondes.

TTM.TTM_ADDTOOLW 

Ceci est votre message personnalisé sera envoyé à destinataire. Il doit y avoir un contrôle avec la méthode WndProc surchargée et cette méthode doit attraper votre message et faire votre truc là-bas.

J'ai envoyé un message de Form1 à Form2:

`SendMessage(Form2.handle, Msgs.Close, 0, null)` 

et de Form2 comme attrapé:

protected override void WndProc(ref Message m) { 
    if (m.Msg == Msgs.Close) { 
     AskForExit(); 
    } else if (m.Msg == Msgs.Other) { 
     DoOtherStuffOwnedByMe(); 
    } 
     base.WndProc(ref m); 
} 

Peut-être peut-être vous conduire une solution.