/// <summary> /// 获取指定类型分组标记的输出内容结构体 /// </summary> /// <param name="groupType">分组标记的类型</param> /// <param name="groupTextWidth">分组公共信息的宽度</param> /// <returns></returns> private static OutputInfoStruct GetGroupFlagOutput(OrderOutputTextType groupType, int groupTextWidth) { Rectangle bounds = new Rectangle(); int startPosition = GridSetting.WidthOfContentCell - DrawSetting.Margin.Right - groupTextWidth - DrawSetting.GroupFlagWidth + 1; int flagWidth = DrawSetting.GroupFlagWidth - 3; switch (groupType) { case OrderOutputTextType.GroupStart: bounds = new Rectangle(startPosition , GridSetting.RowHeight / 2 , flagWidth , GridSetting.RowHeight / 2); break; case OrderOutputTextType.GroupMiddle: bounds = new Rectangle(startPosition, 0 , flagWidth, GridSetting.RowHeight); break; case OrderOutputTextType.GroupEnd: bounds = new Rectangle(startPosition, 0 , flagWidth, GridSetting.RowHeight / 2); break; } return(new OutputInfoStruct("", bounds, DrawSetting.DefaultFont.Font, groupType)); }
/// <summary> /// /// </summary> /// <param name="text"></param> /// <param name="bounds"></param> /// <param name="font"></param> /// <param name="outputType"></param> public OutputInfoStruct(string text, Rectangle bounds, Font font, OrderOutputTextType outputType) { _text = text; _bounds = bounds; _font = font; _outputType = outputType; }
/// <summary> /// /// </summary> /// <param name="text"></param> /// <param name="outputType"></param> public OutputInfoStruct(string text, OrderOutputTextType outputType) { _text = text; _outputType = outputType; _bounds = new Rectangle(); _font = new Font("SimSun", 10.5F, FontStyle.Regular, GraphicsUnit.Point , ((byte)(134))); }
/// <summary> /// 根据传入的文本信息,生成输出信息列表(包括) /// </summary> /// <param name="texts"></param> /// <returns></returns> public static Collection <OutputInfoStruct> CreateOutputeInfo(Collection <OutputInfoStruct> texts) { if ((texts == null) || (texts.Count == 0)) { return(new Collection <OutputInfoStruct>()); } int maxWidth = DrawSetting.OutputSizeOfContent.Width; // 供一般信息输出的最大宽度(有分组和无分组时是不一样的) Collection <string> outputTexts = new Collection <string>(); // 实际需要输出的文本 OrderOutputTextType groupType = OrderOutputTextType.NormalText; // 分组类型,NormalText表示非分组记录 string usageText = ""; // 用法信息 string frequencyText = ""; // 频次信息 string groupText = ""; // 分组时输出的公共信息 int groupTextWidth = 0; // 分组信息在默认字体下的宽度 int insertPos = -1; // 未分组时,向输出的List中插入用法、频次 string cancelText = ""; // 取消信息 OutputInfoStruct info; for (int index = 0; index < texts.Count; index++) { info = texts[index]; switch (info.OutputType) { case OrderOutputTextType.GroupStart: case OrderOutputTextType.GroupMiddle: case OrderOutputTextType.GroupEnd: groupType = info.OutputType; break; case OrderOutputTextType.CancelInfo: cancelText = info.Text; break; case OrderOutputTextType.ItemUsage: insertPos = index; // 用法肯定在频次前面 usageText = info.Text; break; case OrderOutputTextType.ItemFrequency: frequencyText = info.Text; break; default: outputTexts.Add(info.Text); break; } } // 判断是否是分组的记录(同组的用法、频次只显示一次), 然后提取需要输出的文本 if (groupType != OrderOutputTextType.NormalText) { groupText = usageText + frequencyText.Trim(); groupTextWidth = CalcStringWidth(groupText, DrawSetting.DefaultFont.Font); // 重新计算一般信息允许输出的最大宽度,在处理完一般信息后,再处理分组信息的输出 maxWidth = maxWidth - groupTextWidth - DrawSetting.GroupFlagWidth; } else { if (insertPos > 0) { outputTexts.Insert(insertPos, usageText); outputTexts.Insert(insertPos + 1, frequencyText); } else { if (usageText.Length > 0) { outputTexts.Add(usageText); } if (frequencyText.Length > 0) { outputTexts.Add(frequencyText); } } } // 首先生成一般信息的输出 Collection <OutputInfoStruct> results = CreateNormalOutputInfos(outputTexts, maxWidth); // 处理分组信息 if (groupType != OrderOutputTextType.NormalText) { // 原先的想法是让分组信息紧跟着前面的信息,但是因为每一条记录是单独处理 // 同一组的记录其分组标志的位置可能错位。因此改成从右到左显示分组信息 // 先处理公共信息(只有组的第一条记录才需要分组的公共信息) if (groupType == OrderOutputTextType.GroupStart) { results.Add(GetGroupPublicOutput(groupText, groupTextWidth)); } // 再画分组标记 results.Add(GetGroupFlagOutput(groupType, groupTextWidth)); //maxWidth = 0; //foreach (OutputInfoStruct text in results) // if (maxWidth < text.Bounds.Width) // maxWidth = text.Bounds.Width; //// 分组标志紧跟着最长的那行 //results.Add(GetGroupFlagOutput(groupType, maxWidth)); //// 只有组的第一条记录才需要分组的公共信息 //if (groupType == OrderOutputTextType.GroupStart) // results.Add(GetGroupPublicOutput(groupText, maxWidth + GroupFlagWidth)); } // 处理取消信息 if (cancelText.Length > 0) { results.Add(new OutputInfoStruct(cancelText, DrawSetting.BoundsOfCancel , DrawSetting.FontOfCancel.Font , OrderOutputTextType.CancelInfo)); } return(results); }