songcan
路人甲
路人甲
  • 注册日期2006-08-21
  • 发帖数4
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1190回复:0

[求助]自定义符号类的问题,总统及各位兄弟帮忙看看啦!

楼主#
更多 发布于:2008-09-16 17:29
<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>
喜欢0 评分0
游客

返回顶部