Страница: 1 |
Вопрос: Я хочу быть как Тултип
Добавлено: 08.03.10 17:36
Автор вопроса: VβÐUηìt | Web-сайт: смекаешь.рф
C#
Когда вася кидает на форму ToolTip, то у всех контролов на форме добавляется свойство ToolTip на toolTip1. Мне нужно, чтобы мой контрол делал так же, но привинчивал к контролам не string, а мой класс. Как это сделать?
Заранее благодарен.
Ответить
Номер ответа: 2Автор ответа: VβÐUηìt
Вопросов: 246Ответов: 3333
Web-сайт: смекаешь.рф Профиль | | #2
Добавлено: 08.03.10 18:33
И таки нашел:
IExtenderProvider - интерфейс
Определяет интерфейс для расширения свойств других компонентов в контейнере.
namespace Microsoft.Samples.WinForms.Cs.HelpLabel
{
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
//
// <doc>
// <desc>
// Help Label offers an extender property called
// "HelpText" . It monitors the active control
// and displays the help text for the active control.
// </desc>
// </doc>
//
[
ProvideProperty("HelpText" ,typeof (Control)),
Designer(typeof (HelpLabel.HelpLabelDesigner))
]
public class HelpLabel : Control, System.ComponentModel.IExtenderProvider
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components;
private Hashtable helpTexts;
private System.Windows.Forms.Control activeControl;
//
// <doc>
// <desc>
// Creates a new help label object .
// </desc>
// </doc>
//
public HelpLabel()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
helpTexts = new Hashtable();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
components.Dispose();
}
base .Dispose(disposing);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this .components = new System.ComponentModel.Container ();
this .BackColor = System.Drawing.SystemColors.Info;
this .ForeColor = System.Drawing.SystemColors.InfoText;
this .TabStop = false ;
}
//
// <doc>
// <desc>
// Overrides the text property of Control. This label ignores
// the text property, so we add additional attributes here so the
// property does not show up in the properties window and is not
// persisted.
// </desc>
// </doc>
//
[
Browsable(false ),
EditorBrowsable(EditorBrowsableState.Never),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
public override string Text
{
get
{
return base .Text;
}
set
{
base .Text = value;
}
}
//
// <doc>
// <desc>
// This implements the IExtenderProvider.CanExtend method. The
// help label provides an extender property, and the design time
// framework will call this method once for each component to determine
// if we are interested in providing our extended properties for the
// component. We return true here if the object is a control and is
// not a HelpLabel (since it would be silly to add this property to
// ourselves).
// </desc>
// </doc>
//
bool IExtenderProvider.CanExtend(object target)
{
if (target is Control &&
!(target is HelpLabel))
{
return true ;
}
return false ;
}
//
// <doc>
// <desc>
// This is the extended property for the HelpText property. Extended
// properties are actual methods because they take an additional parameter
// that is the object or control to provide the property for .
// </desc>
// </doc>
//
[
DefaultValue("" ),
]
public string GetHelpText(Control control)
{
string text = (string )helpTexts[control];
if (text == null )
{
text = string .Empty;
}
return text;
}
//
// <doc>
// <desc>
// This is an event handler that responds to the OnControlEnter
// event . We attach this to each control we are providing help
// text for .
// </desc>
// </doc>
//
private void OnControlEnter(object sender, EventArgs e)
{
activeControl = (Control)sender;
Invalidate();
}
//
// <doc>
// <desc>
// This is an event handler that responds to the OnControlLeave
// event . We attach this to each control we are providing help
// text for .
// </desc>
// </doc>
//
private void OnControlLeave(object sender, EventArgs e)
{
if (sender == activeControl)
{
activeControl = null ;
Invalidate();
}
}
//
// <doc>
// <desc>
// This is the extended property for the HelpText property.
// </desc>
// </doc>
//
public void SetHelpText(Control control, string value)
{
if (value == null )
{
value = string .Empty;
}
if (value.Length == 0)
{
helpTexts.Remove(control);
control.Enter -= new EventHandler(OnControlEnter);
control.Leave -= new EventHandler(OnControlLeave);
}
else
{
helpTexts[control] = value;
control.Enter += new EventHandler(OnControlEnter);
control.Leave += new EventHandler(OnControlLeave);
}
if (control == activeControl)
{
Invalidate();
}
}
//
// <doc>
// <desc>
// Overrides Control.OnPaint. Here we draw our
// label.
// </desc>
// </doc>
//
protected override void OnPaint(PaintEventArgs pe)
{
// Let the base draw. This will cover our back
// color and set any image that the user may have
// provided.
//
base .OnPaint(pe);
// Draw a rectangle around our control.
//
Rectangle rect = ClientRectangle;
Pen borderPen = new Pen(ForeColor);
pe.Graphics.DrawRectangle(borderPen, rect);
borderPen.Dispose();
// Finally , draw the text over the top of the
// rectangle.
//
if (activeControl != null )
{
string text = (string )helpTexts[activeControl];
if (text != null && text.Length > 0)
{
rect.Inflate(-2, -2);
Brush brush = new SolidBrush(ForeColor);
pe.Graphics.DrawString(text, Font, brush, rect);
brush.Dispose();
}
}
}
// <doc>
// <desc>
// Returns true if the backColor should be persisted in code gen. We
// override this because we change the default back color.
// </desc>
// <retvalue>
// true if the backColor should be persisted.
// </retvalue>
// </doc>
//
public bool ShouldSerializeBackColor()
{
return (!BackColor.Equals(SystemColors.Info));
}
// <doc>
// <desc>
// Returns true if the foreColor should be persisted in code gen. We
// override this because we change the default foreground color.
// </desc>
// <retvalue>
// true if the foreColor should be persisted.
// </retvalue>
// </doc>
//
public bool ShouldSerializeForeColor()
{
return (!ForeColor.Equals(SystemColors.InfoText));
}
//
// <doc>
// <desc>
// This is a designer for the HelpLabel. This designer provides
// design time feedback for the label. The help label responds
// to changes in the active control, but these events do not
// occur at design time. In order to provide some usable feedback
// that the control is working the right way, this designer listens
// to selection change events and uses those events to trigger active
// control changes.
// </desc>
// </doc>
//
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust" )]
public class HelpLabelDesigner : System.Windows.Forms.Design.ControlDesigner
{
private bool trackSelection = true ;
/// <summary>
/// This property is added to the control
/// PreFilterProperties below. Note that on designers, properties that are
/// explictly declared by TypeDescriptor.CreateProperty can be declared as
/// private on the designer. This helps to keep the designer
/// object model clean.
/// </summary>
private bool TrackSelection
{
get
{
return trackSelection;
}
set
{
trackSelection = value;
if (trackSelection)
{
ISelectionService ss = (ISelectionService)GetService(typeof (ISelectionService));
if (ss != null )
{
UpdateHelpLabelSelection(ss);
}
}
else
{
HelpLabel helpLabel = (HelpLabel)Control;
if (helpLabel.activeControl != null )
{
helpLabel.activeControl = null ;
helpLabel.Invalidate();
}
}
}
}
public override DesignerVerbCollection Verbs
{
get
{
DesignerVerb[] verbs = new DesignerVerb[] {
new DesignerVerb("Sample Verb" , new EventHandler(OnSampleVerb))
};
return new DesignerVerbCollection(verbs);
}
}
//
// <doc>
// <desc>
// Overrides Dispose. Here we remove our handler for the selection changed
// event . With designers, it is critical that they clean up any events they
// have attached. Otherwise, during the course of an editing session many
// designers may get created and never destroyed.
// </desc>
// </doc>
//
protected override void Dispose(bool disposing)
{
if (disposing)
{
ISelectionService ss = (ISelectionService)GetService(typeof (ISelectionService));
if (ss != null )
{
ss.SelectionChanged -= new EventHandler(OnSelectionChanged);
}
}
base .Dispose(disposing);
}
//
// <doc>
// <desc>
// Overrides initialize. Here we add an event handler to the selection service.
// Notice that we are very careful not to assume that the selection service is
// available. It is entirely optional that a service is available and you should
// always degrade gracefully if a service could not be found.
// </desc>
// </doc>
//
public override void Initialize(IComponent component)
{
base .Initialize(component);
ISelectionService ss = (ISelectionService)GetService(typeof (ISelectionService));
if (ss != null )
{
ss.SelectionChanged += new EventHandler(OnSelectionChanged);
}
}
private void OnSampleVerb(object sender, EventArgs e)
{
MessageBox.Show("You have just invoked a sample verb. Normally, this would do something interesting." );
}
//
// <doc>
// <desc>
// Our handler for the selection change event . Here we update the active control within
// the help label.
// </desc>
// </doc>
//
private void OnSelectionChanged(object sender, EventArgs e)
{
if (trackSelection)
{
ISelectionService ss = (ISelectionService)sender;
UpdateHelpLabelSelection(ss);
}
}
protected override void PreFilterProperties(IDictionary properties)
{
// Always call base first in PreFilter* methods, and last in PostFilter*
// methods.
base .PreFilterProperties(properties);
// We add a design-time property called "TrackSelection" that is used to track
// the active selection. If the user sets this to true (the default ), then
// we will listen to selection change events and update the control
// control to point to the current primary selection.
properties["TrackSelection" ] = TypeDescriptor.CreateProperty(
this .GetType (), // the type this property is defined on
"TrackSelection" , // the name of the property
typeof (bool ), // the type of the property
new Attribute[] {CategoryAttribute.Design}); // attributes
}
/// <summary>
/// This is a helper method that, given a selection service, will update the active control
/// of our help label with the currently active selection.
/// </summary>
/// <param name="ss" ></param>
private void UpdateHelpLabelSelection(ISelectionService ss)
{
Control c = ss.PrimarySelection as Control;
HelpLabel helpLabel = (HelpLabel)Control;
if (c != null )
{
helpLabel.activeControl = c;
helpLabel.Invalidate();
}
else
{
if (helpLabel.activeControl != null )
{
helpLabel.activeControl = null ;
helpLabel.Invalidate();
}
}
}
}
}
}
Ответить
Страница: 1 |
Поиск по форуму