杂:
1.自定义控件public属性如何不在InitializeComponent中生成?
可以使用特性:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
2.在一些无法在窗体内捕获的事件可以使用IMessageFilter接口来实现。
Application.AddMessageFilter 注册事件
Application.RemoveMessageFilter 取消事件
3.Form.ActiveForm静态属性用来获取当前激活的窗口。可以用来判断程序时候是激活状态的。
4. Control.PointToScreen用来获取在屏幕中的坐标。
Control.PointToClient用来获取在控件中的坐标。
Control.MousePosition用来获取鼠标在屏幕上的坐标。
上面3个组合可以用来做一些复杂的控件交互。
5. Controls.GetChildIndex,Controls.SetChildIndex可以用来改变控件布局。
6. 该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。
[DllImport("user32.dll")]
public static extern IntPtrGetWindow(IntPtr hWnd, uint wCmd);
可以实现一些窗体上的交互。
7.xml序列化反序列化对象:
publicstaticstringSerializeXML<T>(T obj)
{
using (StringWriterwriter=newStringWriter())
{
newXmlSerializer(obj.GetType()).Serialize((TextWriter)writer, obj);
returnwriter.ToString();
}
}
publicstatic T DeserializeXML<T>(stringxmlObj)
{
XmlSerializerserializer=newXmlSerializer(typeof(T))
using (StringReaderreader=newStringReader(xmlObj))
{
return (T)serializer.Deserialize(reader);
}
}
8.ApplicationContext类,可以实现支持多个主窗体。
Ps:如果创建的窗体中有一个实现closing方法中e.cancel=true;会导致Application.Exit();也无法关闭进程。
绘图相关:
1. Control. Region属性用来限定控件的形状。可以用来绘制异型控件。
2. 控件内部操作图片解决闪烁问题
protected override void OnPaintBackground(PaintEventArgse) {return;}
protected override voidOnPaint(PaintEventArgs e)
{
this.DoubleBuffered = true;
if(this.BackgroundImage != null)
{
e.Graphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
e.Graphics.DrawImage(this.BackgroundImage,
new System.Drawing.Rectangle(0, 0, this.Width, this.Height),
0, 0, this.BackgroundImage.Width,
this.BackgroundImage.Height,
System.Drawing.GraphicsUnit.Pixel);
}
base.OnPaint(e);
}