locked
Не работает отображение Text своего Label в Desing Time в Visual Studio RRS feed

  • Вопрос

  • Пишу приложение под Compact Framework 3.5. Создал свой компонент унаследовав его от Label. Основное изменение это автоподбор высоты label. В compact framework нет AutoSize.

    public partial class AutoSizeLabel2 : Label
    {        
        static Bitmap bmpSizer = new Bitmap(10, 10);
        static Graphics g = Graphics.FromImage(bmpSizer);
    
        public AutoSizeLabel2()
        {
            this.Text = "Label";
        }
    
        public override string Text
        {
            get
            {
                return this.Text;
            }
            set
            {            
                Rectangle clientRec = this.ClientRectangle;
                clientRec.Inflate(-2, 0);
                this.Height = CFMeasureString.MeasureString(g, value, clientRec, false).Height;
                this.Text = value;           
                this.Invalidate();            
            }
        }    
    }

    Но при работе с компонентом в конструкторе форм, вместо заданного текста всегда отражается WMS_Project.AutoSizeLabel2. Пример в приложенном файле.


    18 июля 2016 г. 10:41

Ответы

  • NETCF требует отдельной поддержки для этого (декларация свойств, декларация совместимости и код который работает как на девайсе так и на десктопе, например если применяются несовместимые P/Ivnoke). Вот, скажем, у вас CFMeasureString.MeasureString это что? Не P/Invoke ли часом в coredll? Если да, то ее ведь нет на десктопе и работать это не сможет.

    В общем если оно надо то придется приложить некоторые усилия. Смотрите тут:

    https://msdn.microsoft.com/en-us/library/aa446500.aspx

    Так же посмотрите данный пример:

    https://msdn.microsoft.com/en-us/library/ms180794(VS.80).aspx


    This posting is provided "AS IS" with no warranties, and confers no rights.

    18 июля 2016 г. 16:27

Все ответы

  • NETCF требует отдельной поддержки для этого (декларация свойств, декларация совместимости и код который работает как на девайсе так и на десктопе, например если применяются несовместимые P/Ivnoke). Вот, скажем, у вас CFMeasureString.MeasureString это что? Не P/Invoke ли часом в coredll? Если да, то ее ведь нет на десктопе и работать это не сможет.

    В общем если оно надо то придется приложить некоторые усилия. Смотрите тут:

    https://msdn.microsoft.com/en-us/library/aa446500.aspx

    Так же посмотрите данный пример:

    https://msdn.microsoft.com/en-us/library/ms180794(VS.80).aspx


    This posting is provided "AS IS" with no warranties, and confers no rights.

    18 июля 2016 г. 16:27
  • Вы были правы. Добавил атрибут <DesktopCompatible>true</DesktopCompatible> стало правильно отрисовываться на форме. Раскоментировал  CFMeasureString посыпались ошибки что не найден coredll.dll.

    internal class CFMeasureString
        {
            private struct Rect
            {
                public int Left, Top, Right, Bottom;
    
                public Rect(Rectangle r)
                {
                    this.Left = r.Left;
                    this.Top = r.Top;
                    this.Bottom = r.Bottom;
                    this.Right = r.Right;
                }
            }
    
            [DllImport("coredll.dll")]
            private static extern int DrawText(IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, int wFormat);
    
            private const int DT_CALCRECT = 0x00000400;
            private const int DT_WORDBREAK = 0x00000010;
            private const int DT_EDITCONTROL = 0x00002000;
    
            static public Size MeasureString(Graphics gr, string text, Rectangle rect, bool textboxControl)
            {
                Rect bounds = new Rect(rect);
                IntPtr hdc = gr.GetHdc();
                int flags = DT_CALCRECT | DT_WORDBREAK;
                if (textboxControl) flags |= DT_EDITCONTROL;
                DrawText(hdc, text, text.Length, ref bounds, flags);
                gr.ReleaseHdc(hdc);
                return new Size(bounds.Right - bounds.Left, bounds.Bottom - bounds.Top + (textboxControl ? 6 : 0));
            }
        }
    Получается сделать возможность работы в дизайнере не получится или если подложить coredll.dll будет работать?

    19 июля 2016 г. 8:15