- 积分
- 59426
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-7-18
- 最后登录
- 1970-1-1
|
发表于 2018-7-19 11:05:58
|
显示全部楼层
本帖最后由 chengxf 于 2018-7-19 11:10 编辑
我曾经写过自定义图例的 Pascal 代码,可惜不是 C# 的,这段代码放出来给你参考。注释写得较详细,主要是怕我自己忘了。
if CBox_PostScaleYes.Checked then case RG_Legend.ItemIndex of //需要显示图例
0:Begin //选择了水平显示图例
xInc1 := SEdit_xInc1.Value; //图例符号和图例说明之间的间距为 0.5cm
xInc2 := SEdit_xInc2.Value; //图例之间的间距为 1.0cm
x := P_MapFrame.Left + P_MapFrame.Width * 0.5; //地图中心的 X 坐标
y := P_MapFrame.Top - P_MapFrame.Height - 0.5; //地图下方 0.5cm 处的 Y 坐标
//先写图例的标题
LegendTitle := P_Shapes.AddText(x,y,RzEdit_PostTitle.Text); //创建一个文本对象,图例的标题
LegendTitle.Font.Face := cBox_PostTitle.SelectedFont.Name; //图例标题用中文字体
LegendTitle.Font.Size := SEdit_PostTitle.AsInteger; //图例标题字号(文字大小)
LegendTitle.Font.HAlign := 1; //水平靠左对齐
LegendTitle.Font.VAlign := 4; //垂直居中对齐
W := LegendTitle.width + xInc1; //整个图例内所有对象的宽度总和,首先这里的宽度起码是标题的宽度
//产生自制图例的符号和标注
NumPostBin := ClassesPostMapLayer.NumClasses; //分类散点图的分类数,决定数组长度
LegendSym := VarArrayCreate([1,NumPostBin], varVariant); //确定一维数组的长度,共有 NumPostBin 个符号元素
LegendLab := VarArrayCreate([1,NumPostBin], varVariant); //同上,共有 NumPostBin 个标注元素
for I := 1 to NumPostBin do Begin //做循环,设置各个元素的属性
LegendSym := P_Shapes.AddSymbol(x,y); //在位置 x,y 添加一个符号对象
LegendSym.Marker.Set := ClassesPostMapLayer.BinSymbol.Set; //符号集
LegendSym.Marker.Index := ClassesPostMapLayer.BinSymbol.Index; //所选择的符号
LegendSym.Marker.Size := ClassesPostMapLayer.BinSymbol.Size; //符号的大小
LegendSym.Marker.LineColorRGBA.Color := ClassesPostMapLayer.BinSymbol.LineColor; //符号边线的颜色
LegendSym.Marker.FillColorRGBA.Color := ClassesPostMapLayer.BinSymbol.FillColor; //符号填充的颜色
w := w + LegendSym.Marker.Size + xInc1; //累计符号所占宽度
txtStr := FormatFloat('0.00',ClassesPostMapLayer.BinLowerLimit);
txtStr := txtStr + ' - ' + FormatFloat('0.00',ClassesPostMapLayer.BinUpperLimit); //图例的标注文字,用'分组下限-分组上限'方式
LegendLab := P_Shapes.AddText(x,y,txtStr); //在位置 x,y 添加一个文字对象
LegendLab.Font.Face := FontStr; //图例标注的字体
LegendLab.Font.Size := SEdit_LegendLabFontSize.AsInteger; //图例标注的字号
LegendLab.Font.HAlign := 1; //图例标注的水平对齐方式:左齐
LegendLab.Font.VAlign := 4; //图例标注的垂直对齐方式:居中
w := w + LegendLab.Width + xInc2; //标注文字所占宽度累计进去
End;
//确定图例标题的位置,左边界X的位置,Y的位置已经确定
x := P_MapFrame.Left + (P_MapFrame.width - W)/2; //确定整个图例的最左边界
LegendTitle.Left := x; //首先显示图例的标题
x := x + LegendTitle.Width + xInc1; //移到标题加一个间隔的位置
for I := 1 to NumPostBin do Begin //做循环,摆放每一个符号和标注
LegendSym.Left := x;
x := x + LegendSym.Width + xInc1;
LegendLab.Left := x;
x := x + LegendLab.Width + xInc2;
End;
end;
1:Begin //选择了传统的垂直显示图例
ClassesPostMapLayer.ShowLegend := True; //决定要显示图例
PostLegend := ClassesPostMapLayer.Legend; //在分类散点图中创建一个图例
PostLegend.Title := RzEdit_PostTitle.Text; //图例的标题
PostLegend.TitleFont.Face := cBox_PostTitle.SelectedFont.Name; //标题的字体
PostLegend.TitleFont.Size := SEdit_PostTitle.AsInteger; //标题的字号
PostLegend.TitleFont.Bold := Bold_PostTitle.Checked; //标题是否粗体
PostLegend.Top := P_MapFrame.Top - P_MapFrame.Height - 0.4; //图例左上角图纸坐标: Y 值
PostLegend.Left := P_MapFrame.Left + 0.2; //图例左上角图纸坐标: X 值
PostLegend.FrameFill.Pattern := 'Solid';
R_Color := ScaleFillColor.SelectedColor and $FF; //获得所选颜色的 R 值
G_Color := (ScaleFillColor.SelectedColor and $FF00) shr 8; //获得所选颜色的 G 值
B_Color := (ScaleFillColor.SelectedColor and $FF0000) shr 16; //获得所选颜色的 B 值
PostLegend.FrameFill.ForeColorRGBA.Color := RGB(R_Color, G_Color, B_Color); //填充颜色
R_Color := ScaleLineColor.SelectedColor and $FF; //获得所选颜色的 R 值
G_Color := (ScaleLineColor.SelectedColor and $FF00) shr 8; //获得所选颜色的 G 值
B_Color := (ScaleLineColor.SelectedColor and $FF0000) shr 16; //获得所选颜色的 B 值
PostLegend.FrameLine.ForeColorRGBA.Color := RGB(R_Color, G_Color, B_Color); //边框线条颜色
PostLegend.FrameStyle := 3; //边框类型:1-没有,2-矩形,3-圆角矩形
PostLegend.FrameLine.Width := 0.03; //边框线条宽度
End;
End;
End;
图片在哪儿呢?找到了再上。
|
|