|
阅读:1190回复:0
[求助]自定义符号类的问题,总统及各位兄弟帮忙看看啦!
<P align=left>我所作的一个自定义符号类以下,自定义符号是可以显示出来,但是总是要缩小到一到比例才显示出来,这是什么问题??是哪个接口哪个函数设置元素按比死显示的??(如果用默认的symbol是没有这个问题出现的),还有一个问题是有没有类似的自定义建立铁路符号的代码呀???:<p></p></P>
<P align=left>//<p></p></P> <P align=left>//<p></p></P> <P align=left>//自定义元素类<p></p></P> <P align=left>public class cusFaSymbol : ICharacterMarkerSymbol, ISymbol , IClone, IPersistVariant<p></p></P> <P align=left> {<p></p></P> <P align=left> #region 变量<p></p></P> <P align=left><p> </p></P> <P align=left> private string p_type;<p></p></P> <P align=left> private string p_zb;<p></p></P> <P align=left> private string p_num;<p></p></P> <P align=left> private float p_LSize;<p></p></P> <P align=left> //private double p_dpi;<p></p></P> <P align=left> //private ISimpleMarkerSymbol p_symbol;<p></p></P> <P align=left> //private int p_labelAngle;<p></p></P> <P align=left> private int m_lHDC;//句柄<p></p></P> <P align=left> private stdole.IFontDisp font;//字体<p></p></P> <P align=left> //private int m_lSize;<p></p></P> <P align=left><p> </p></P> <P align=left> private ESRI.ArcGIS.Display.IDisplayTransformation m_pDispTrans;<p></p></P> <P align=left><p> </p></P> <P align=left> private double m_Angle;<p></p></P> <P align=left> private IColor m_Color;<p></p></P> <P align=left> private double m_Size;<p></p></P> <P align=left> private double m_XOffset;<p></p></P> <P align=left> private double m_YOffset;<p></p></P> <P align=left> private int m_CharacterIndex;<p></p></P> <P align=left> private double m_dDeviceRatio;<p></p></P> <P align=left> //private int m_lPen;<p></p></P> <P align=left> //private int m_lOldPen;<p></p></P> <P align=left> //private int m_lHDC;<p></p></P> <P align=left> //private double m_Angle;<p></p></P> <P align=left> //private int m_SymbolIndex;<p></p></P> <P align=left> //private Size Size;<p></p></P> <P align=left> esriRasterOpCode rop;<p></p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left> #endregion<p></p></P> <P align=left> #region ICone<p></p></P> <P align=left> public void Assign(<p></p></P> <P align=left> IClone src<p></p></P> <P align=left>) { }<p></p></P> <P align=left> public IClone Clone(<p></p></P> <P align=left>) {<p></p></P> <P align=left> return (IClone)this;<p></p></P> <P align=left> }<p></p></P> <P align=left> public bool IsEqual(<p></p></P> <P align=left> IClone other<p></p></P> <P align=left>) {<p></p></P> <P align=left> if (this.Equals(other) == true)<p></p></P> <P align=left> return true;<p></p></P> <P align=left> else<p></p></P> <P align=left> return false;<p></p></P> <P align=left> }<p></p></P> <P align=left> public bool IsIdentical(<p></p></P> <P align=left> IClone other<p></p></P> <P align=left>) { return IsEqual(other); }<p></p></P> <P align=left> #endregion ICone<p></p></P> <P align=left> #region IPersistVariant<p></p></P> <P align=left> UID m_ID;<p></p></P> <P align=left> public UID ID { get { return m_ID; } }<p></p></P> <P align=left> void ESRI.ArcGIS.esriSystem.IPersistVariant.Load(ESRI.ArcGIS.esriSystem.IVariantStream Stream)<p></p></P> <P align=left> {<p></p></P> <P align=left> int lSavedVers = 0;<p></p></P> <P align=left> lSavedVers = Convert.ToInt32(Stream.Read());<p></p></P> <P align=left> if ((lSavedVers <= 0))<p></p></P> <P align=left> {<p></p></P> <P align=left> throw new Exception("Failed to read from stream");<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> if (lSavedVers == 1)<p></p></P> <P align=left> {<p></p></P> <P align=left> rop = (esriRasterOpCode)Stream.Read();<p></p></P> <P align=left><p> </p></P> <P align=left> m_Size = Convert.ToDouble(Stream.Read());<p></p></P> <P align=left> m_XOffset = Convert.ToDouble(Stream.Read());<p></p></P> <P align=left> m_YOffset = Convert.ToDouble(Stream.Read());<p></p></P> <P align=left> m_Angle = Convert.ToDouble(Stream.Read());<p></p></P> <P align=left> }<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left> public void Save(<p></p></P> <P align=left> IVariantStream Stream<p></p></P> <P align=left>) { }<p></p></P> <P align=left> //extern void IPersistVariant.Save(ESRI.ArcGIS.esriSystem.IVariantStream Stream);<p></p></P> <P align=left> ////{ }<p></p></P> <P align=left> void ESRI.ArcGIS.esriSystem.IPersistVariant.Save(ESRI.ArcGIS.esriSystem.IVariantStream Stream)//:base(ESRI.ArcGIS.esriSystem.IVariantStream Stream)<p></p></P> <P align=left> {<p></p></P> <P align=left> //base.Save(Stream);<p></p></P> <P align=left> }<p></p></P> <P align=left> #endregion IPersistVariant<p></p></P> <P align=left><p> </p></P> <P align=left> // public void Assign(<p></p></P> <P align=left> // IClone src<p></p></P> <P align=left> //)<p></p></P> <P align=left> // {<p></p></P> <P align=left> // }<p></p></P> <P align=left><p> </p></P> <P align=left> public double Angle<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return m_Angle; }<p></p></P> <P align=left> set { m_Angle = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left> //public int LabelAngle<p></p></P> <P align=left> //{<p></p></P> <P align=left> // get { return p_labelAngle; }<p></p></P> <P align=left> // set { p_labelAngle = value; }<p></p></P> <P align=left> //}<p></p></P> <P align=left><p> </p></P> <P align=left> public IColor Color<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return m_Color; }<p></p></P> <P align=left> set { m_Color = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> public double Size<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return m_Size; }<p></p></P> <P align=left> set { m_Size = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> public double XOffset<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return m_XOffset; }<p></p></P> <P align=left> set { m_XOffset = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left> public double YOffset<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return m_YOffset; }<p></p></P> <P align=left> set { m_YOffset = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left> public int CharacterIndex<p></p></P> <P align=left> {<p></p></P> <P align=left> get<p></p></P> <P align=left> {<p></p></P> <P align=left> return m_CharacterIndex;<p></p></P> <P align=left> }<p></p></P> <P align=left> set<p></p></P> <P align=left> {<p></p></P> <P align=left> m_CharacterIndex = value;<p></p></P> <P align=left> }<p></p></P> <P align=left> }<p></p></P> <P align=left> public stdole.IFontDisp Font <p></p></P> <P align=left> {<p></p></P> <P align=left> get<p></p></P> <P align=left> {<p></p></P> <P align=left> return font;<p></p></P> <P align=left> }<p></p></P> <P align=left> set<p></p></P> <P align=left> {<p></p></P> <P align=left> font = value;<p></p></P> <P align=left> }<p></p></P> <P align=left> }<p></p></P> <P align=left> #region ICustomMarker 成员<p></p></P> <P align=left><p> </p></P> <P align=left> public cusFaSymbol(string _szType, string _szZb,<p></p></P> <P align=left> string _szNum, float _fLSize)<p></p></P> <P align=left> : base()<p></p></P> <P align=left> {<p></p></P> <P align=left> //base.MemberwiseClone();<p></p></P> <P align=left> this.p_type = _szType;<p></p></P> <P align=left> this.p_zb = _szZb;<p></p></P> <P align=left> this.p_num = _szNum;<p></p></P> <P align=left> //font = new stdole..StdFontClass();<p></p></P> <P align=left> //this.p_labelAngle = labelAngle;<p></p></P> <P align=left> if (_fLSize >= 6)<p></p></P> <P align=left> {<p></p></P> <P align=left> this.p_LSize = _fLSize;<p></p></P> <P align=left> }<p></p></P> <P align=left> else<p></p></P> <P align=left> {<p></p></P> <P align=left> this.p_LSize = 9;<p></p></P> <P align=left> }<p></p></P> <P align=left> //ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPCopyPen;<p></p></P> <P align=left> //font = _font;<p></p></P> <P align=left> //Class_Initialize_Renamed();<p></p></P> <P align=left> }<p></p></P> <P align=left> <p></p></P> <P align=left> ~cusFaSymbol()<p></p></P> <P align=left> {<p></p></P> <P align=left><p> </p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left> public void ResetDC()<p></p></P> <P align=left> {<p></p></P> <P align=left> // TOD 添加cusFaSymbol.ResetDC 实现<p></p></P> <P align=left> m_pDispTrans = null;<p></p></P> <P align=left> m_lHDC = 0; <p></p></P> <P align=left> GC.Collect();<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> public void QueryBoundary(<p></p></P> <P align=left> int hDC,<p></p></P> <P align=left> ITransformation displayTransform,<p></p></P> <P align=left> IGeometry Geometry,<p></p></P> <P align=left> IPolygon boundary<p></p></P> <P align=left> )<p></p></P> <P align=left> {<p></p></P> <P align=left> return;<p></p></P> <P align=left> if (!(Geometry is ESRI.ArcGIS.Geometry.IPoint))<p></p></P> <P align=left> return;<p></p></P> <P align=left> boundary.SetEmpty();<p></p></P> <P align=left><p> </p></P> <P align=left> //Geometry.SpatialReference = 0;<p></p></P> <P align=left> IPoint point = (IPoint)Geometry;<p></p></P> <P align=left> IDisplayTransformation displayTransformation = (IDisplayTransformation)displayTransform;<p></p></P> <P align=left><p> </p></P> <P align=left> //QueryBoundsFromGeom(hDC, ref displayTransformation, ref Boundary, ref point);<p></p></P> <P align=left> //displayTransformation.ReferenceScale = 0;<p></p></P> <P align=left> }<p></p></P> <P align=left> public esriRasterOpCode ROP2<p></p></P> <P align=left> {<p></p></P> <P align=left> get { return rop;}<p></p></P> <P align=left> set { rop = value; }<p></p></P> <P align=left> }<p></p></P> <P align=left> //public void SetupDC(int hDC, double dpi, object pBaseSym)<p></p></P> <P align=left> public void SetupDC<p></p></P> <P align=left> (<p></p></P> <P align=left> int hDC,<p></p></P> <P align=left> ITransformation transformation<p></p></P> <P align=left> )<p></p></P> <P align=left> {<p></p></P> <P align=left> // TOD 添加cusFaSymbol.SetupDC 实现<p></p></P> <P align=left> //this.p_dpi = dpi;<p></p></P> <P align=left> //this.p_symbol = (mo.Symbol)pBaseSym;<p></p></P> <P align=left> m_lHDC = hDC;<p></p></P> <P align=left> <p></p></P> <P align=left> m_pDispTrans = (IDisplayTransformation)transformation;<p></p></P> <P align=left> m_pDispTrans.ReferenceScale = 0;<p></p></P> <P align=left> <p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> <p></p></P> <P align=left> //public void Draw(int hDC, int x, int y)<p></p></P> <P align=left> public void Draw (<p></p></P> <P align=left> IGeometry Geometry<p></p></P> <P align=left> )<p></p></P> <P align=left> {<p></p></P> <P align=left> // TOD 添加cusFaSymbol.Draw 实现<p></p></P> <P align=left> if (Geometry == null || !(Geometry is ESRI.ArcGIS.Geometry.IPoint))<p></p></P> <P align=left> return;<p></p></P> <P align=left> Graphics g = Graphics.FromHdc((System.IntPtr)m_lHDC);<p></p></P> <P align=left> Matrix m = new Matrix();<p></p></P> <P align=left> IPoint pPt = (IPoint)Geometry;<p></p></P> <P align=left> int x;<p></p></P> <P align=left> int y;<p></p></P> <P align=left> if (m_pDispTrans == null)<p></p></P> <P align=left> {<p></p></P> <P align=left> x = (int)pPt.X;<p></p></P> <P align=left> y = (int)pPt.Y;<p></p></P> <P align=left> }<p></p></P> <P align=left> else<p></p></P> <P align=left> {<p></p></P> <P align=left> m_pDispTrans.FromMapPoint(pPt, out x, out y);<p></p></P> <P align=left> } <p></p></P> <P align=left><p> </p></P> <P align=left> //point.PutCoords(<p></p></P> <P align=left> m.RotateAt(360 - Convert.ToSingle(this.Angle), new System.Drawing.<p></p></P> <P align=left> Point(x, y), MatrixOrder.Append);<p></p></P> <P align=left> g.Transform = m;<p></p></P> <P align=left> g.SmoothingMode = SmoothingMode.HighQuality;<p></p></P> <P align=left> StringFormat sf = new StringFormat();<p></p></P> <P align=left> sf.Alignment = StringAlignment.Center;<p></p></P> <P align=left> sf.LineAlignment = StringAlignment.Center;<p></p></P> <P align=left> sf.FormatFlags = StringFormatFlags.DirectionRightToLeft | StringFormatFlags.MeasureTrailingSpaces;<p></p></P> <P align=left> string szS =Convert.ToString((char)this.CharacterIndex);<p></p></P> <P align=left> Font fontt = new Font(this.Font.Name, (float)this.p_LSize);<p></p></P> <P align=left> g.DrawString(szS, fontt, new SolidBrush(ColorTranslator.FromWin32((int)this.Color.RGB)), x, y, sf);<p></p></P> <P align=left> float fFontHeight = fontt.GetHeight(g);// (Convert.ToSingle(this.p_dpi));<p></p></P> <P align=left> fontt.Dispose();<p></p></P> <P align=left> m.Reset();<p></p></P> <P align=left> m.RotateAt((float)(360 - Angle), new System.Drawing.Point(x, y), MatrixOrder.Append);<p></p></P> <P align=left> g.Transform = m;<p></p></P> <P align=left> sf.FormatFlags = StringFormatFlags.LineLimit;<p></p></P> <P align=left> sf.Alignment = StringAlignment.Near;<p></p></P> <P align=left> sf.LineAlignment = StringAlignment.Far;<p></p></P> <P align=left> Font font1 = new Font("宋体", Convert.ToSingle(this.p_LSize - 2));<p></p></P> <P align=left> Font font2 = new Font("黑体", Convert.ToSingle(this.p_LSize - 1));<p></p></P> <P align=left> g.DrawString(this.p_zb, font1, Brushes.Black, x + fFontHeight / 3, y, sf);<p></p></P> <P align=left> sf.LineAlignment = StringAlignment.Near;<p></p></P> <P align=left> g.DrawString(this.p_type, font2, Brushes.Black, x + fFontHeight / 3, y, sf);<p></p></P> <P align=left> sf.Alignment = StringAlignment.Far;<p></p></P> <P align=left> g.DrawString(this.p_num, font2, Brushes.Black, x - fFontHeight / 3, y, sf);<p></p></P> <P align=left> font1.Dispose();<p></p></P> <P align=left> font2.Dispose();<p></p></P> <P align=left> m.Dispose();<p></p></P> <P align=left> sf.Dispose();<p></p></P> <P align=left> g.Dispose();<p></p></P> <P align=left> }<p></p></P> <P align=left><p> </p></P> <P align=left> #endregion<p></p></P> <P align=left>}<p></p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left>///<p></p></P> <P align=left>//以下代码是我调用自定义类的方法的:<p></p></P> <P align=left><FONT face="Times New Roman">……………<p></p></FONT></P> <P align=left><p> </p></P> <P align=left><FONT face="Times New Roman">…</FONT>. bool bSel = true;<p></p></P> <P align=left> //object o = <p></p></P> <P align=left> //_mapControl.DrawShape(point, ref o);<p></p></P> <P align=left> IMarkerElement pmarkerEle = new MarkerElementClass();<p></p></P> <P align=left> pmarkerEle.Symbol = getSymbol(dr, bSel);//pi.start_point_symbol;<p></p></P> <P align=left> IElement pEle = pmarkerEle as IElement;<p></p></P> <P align=left> pEle.Geometry = point as IGeometry;<p></p></P> <P align=left> m_GroupEle.AddElement(pEle);//加载元素<p></p></P> <P align=left><p> </p></P> <P align=left><p> </p></P> <P align=left>//以下函数是获取自定义类的函数<p></p></P> <P align=left>private ICharacterMarkerSymbol getSymbol(DataRow _dr, bool _bSel)<p></p></P> <P align=left> {<p></p></P> <P align=left> CUSTOMSYMBOL.cusFaSymbol curSym = new CUSTOMSYMBOL.cusFaSymbol(_dr["警种"].ToString(), _dr["组别"].ToString(),<p></p></P> <P align=left> _dr["数量"].ToString(), Convert.ToInt64(_dr["标注大小"]));//<p></p></P> <P align=left> ICharacterMarkerSymbol sym = curSym as ICharacterMarkerSymbol;//new <p></p></P> <P align=left> int nSymSize = Convert.ToInt16(_dr["符号大小"]);<p></p></P> <P align=left> int nSymIndex = Convert.ToInt16(_dr["符号序号"]);<p></p></P> <P align=left> int nLblSize = Convert.ToInt16(_dr["标注大小"]); float angle = 0;<p></p></P> <P align=left> if (!_dr.IsNull("符号角度"))<p></p></P> <P align=left> {<p></p></P> <P align=left> angle = Convert.ToSingle(_dr["符号角度"]);<p></p></P> <P align=left> }<p></p></P> <P align=left> <p></p></P> <P align=left> IColor color = GetRGBColor(Convert.ToUInt32(_dr["颜色"]));<p></p></P> <P align=left> <p></p></P> <P align=left> sym.Font=(stdole.IFontDisp)ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont<p></p></P> <P align=left> (new System.Drawing.Font(_dr["字体名称"].ToString(), nSymSize));<p></p></P> <P align=left> sym.Size = nSymSize;<p></p></P> <P align=left> sym.CharacterIndex = nSymIndex;<p></p></P> <P align=left> sym.Color = color;<p></p></P> <P align=left> sym.Angle = angle;<p></p></P> <P align=left> //CUSTOMSYMBOL.cusFaSymbol curSym = sym as CUSTOMSYMBOL.cusFaSymbol;<p></p></P> <P align=left> //sym.<p></p></P> <P align=left> //sym.<p></p></P> <P align=left> return sym;<p></p></P> <P align=left><p> </p></P> <P > }</P> |
|