using System.Drawing; using System.Windows.Forms; using Microsoft.Drawing; namespace Microsoft.Windows.Forms.Layout { /// <summary> /// 布局数据 /// </summary> public sealed class LayoutData : DisposableMini { /// <summary> /// 测试用绘图对象 /// </summary> public Graphics Graphics; /// <summary> /// 区域 /// </summary> public Rectangle ClientRectangle; /// <summary> /// 边距 /// </summary> public Padding Padding; /// <summary> /// 文本图片相对位置 /// </summary> public TextImageRelation TextImageRelation; /// <summary> /// 左右反转样式 /// </summary> public RightToLeft RightToLeft; /// <summary> /// 图片大小 /// </summary> public Size ImageSize; /// <summary> /// 图片对齐方式 /// </summary> public ContentAlignment ImageAlign; /// <summary> /// 图片偏移量 /// </summary> public Point ImageOffset; /// <summary> /// 文本 /// </summary> public string Text; /// <summary> /// 字体 /// </summary> public Font Font; /// <summary> /// 文本对齐方式 /// </summary> public ContentAlignment TextAlign; /// <summary> /// 文本偏移量 /// </summary> public Point TextOffset; /// <summary> /// 输出-图片区域(必须先调用Layout()方法) /// </summary> public Rectangle OutImageBounds;//[OUT] /// <summary> /// 输出-文本区域(必须先调用Layout()方法) /// </summary> public Rectangle OutTextBounds;//[OUT] //================== private bool m_IsLayouted; /// <summary> /// 是否执行过布局操作 /// </summary> public bool IsLayouted { get { return this.m_IsLayouted; } } private Rectangle? m_CurrentClientRectangle; /// <summary> /// 当前区域,已减去边距 /// </summary> public Rectangle CurrentClientRectangle { get { if (this.m_CurrentClientRectangle == null) this.m_CurrentClientRectangle = RectangleEx.Subtract(this.ClientRectangle, this.Padding); return this.m_CurrentClientRectangle.Value; } } private TextImageRelation? m_CurrentTextImageRelation; /// <summary> /// 当前文本图片相对位置,已通过左右反转样式翻译 /// </summary> public TextImageRelation CurrentTextImageRelation { get { if (this.m_CurrentTextImageRelation == null) this.m_CurrentTextImageRelation = LayoutOptions.RtlTranslateRelation(this.TextImageRelation, this.RightToLeft); return this.m_CurrentTextImageRelation.Value; } } private StringFormat m_CurrentStringFormat; /// <summary> /// 当前文本格式,渲染文本时使用 /// </summary> public StringFormat CurrentStringFormat { get { if (this.m_CurrentStringFormat == null) this.m_CurrentStringFormat = LayoutOptions.GetStringFormat(this.TextAlign, this.RightToLeft); return this.m_CurrentStringFormat; } } private ContentAlignment? m_CurrentImageAlign; /// <summary> /// 当前图片对齐方式,已通过左右反转样式翻译 /// </summary> public ContentAlignment CurrentImageAlign { get { if (this.m_CurrentImageAlign == null) this.m_CurrentImageAlign = LayoutOptions.RtlTranslateAlignment(this.ImageAlign, this.RightToLeft); return this.m_CurrentImageAlign.Value; } } private ContentAlignment? m_CurrentTextAlign; /// <summary> /// 当前文本对齐方式,已通过左右反转样式翻译 /// </summary> public ContentAlignment CurrentTextAlign { get { if (this.m_CurrentTextAlign == null) this.m_CurrentTextAlign = LayoutOptions.RtlTranslateAlignment(this.TextAlign, this.RightToLeft); return this.m_CurrentTextAlign.Value; } } /// <summary> /// 构造函数 /// </summary> public LayoutData() { } /// <summary> /// 布局文本和图片.该方法可被调用多次,但再生命周期内布局操作只会被执行一次. /// </summary> public void DoLayout() { if (this.m_IsLayouted) return; this.m_IsLayouted = true; LayoutOptions.LayoutTextAndImage(this); } /// <summary> /// 释放资源 /// </summary> /// <param name="disposing">释放托管资源为true,否则为false</param> protected override void Dispose(bool disposing) { if (this.m_CurrentStringFormat != null) { this.m_CurrentStringFormat.Dispose(); this.m_CurrentStringFormat = null; } } } }