Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Проблема с отображением форм DevExpress


Автор: Voyager 13.4.2007, 18:10
Здравствуйте!

Проблема вот в чём: форма(XtraForm или RibbonForm), на которой расположены DevExpress-овские компоненты или Ribbon c закладочками и т.п., прорисовывается достаточно медленно и по-частям, что совсем не радует глаз. Причем происходит это даже на "мощных" компах.

Пытался решить эту проблему с помощью св-ва Opacity (прозрачность формы).
Перепробывал несколько вариантов, но у всех из них есть свои недостатки:

1) не работает как надо, если в MainForm_Load произойдет Exeption
Код

    public partial class MainForm : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        public MainForm()
        {
            InitializeComponent();
            if (!DesignMode)
            {
                this.Opacity = 0.0;
                Application.Idle += new EventHandler(Application_Idle);
            }
        }

        void Application_Idle(object sender, EventArgs e)
        {
            if (this.Opacity != 1.0)
            {
                this.Opacity = 1.0;
            }
        }
}



2) если вообще не будет контролов, то куда цеплять Paint ?
Код

 public partial class SimpleRibbon : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        public SimpleRibbon()
        {
            InitializeComponent();
            for (int i = Controls.Count-1; i >= 0; i--)
            {
                if (Controls[i].GetType().GetProperty("Painter") == null)
                {
                    Opacity = 0;
                    Controls[i].Paint += new PaintEventHandler(MyPaint);
                    break;
                }

            }
        }

       private void MyPaint(object sender, PaintEventArgs e)
        {
            Opacity = 1;
        }

    }


Если кто-нибудь уже решал и решил эту проблему поделитесь пожалуйста. 
Заранее спасибо

Автор: mr.DUDA 14.4.2007, 09:50
Изврат, но на таких же "медленных" формах из DotNetBar у меня работало:

Код

           // if true, no form painting will be allowed
           bool _paintDisabled;

...

           public MainForm()
           {
                      if (!this.DesignMode)
                                 _paintDisabled = true;

                      InitializeComponent();
           }


...

           protected override void OnLoad(EventArgs e)
           {
                      base.OnLoad(e);

                      if (this.DesignMode) return;

                      // force form to be refreshed once, but because it flickers - do it via WM_PRINT WinAPI message
                      using (Graphics gr = this.CreateGraphics())
                      {
                                 IntPtr hdc = gr.GetHdc();
                                 try
                                 {
                                            int parameters = (int)(PRF_CHILDREN | PRF_NONCLIENT | PRF_CLIENT);
                                            SendMessage(this.Handle, WM_PRINT, hdc, parameters);
                                 }
                                 finally
                                 {
                                            gr.ReleaseHdc(hdc);
                                            _paintDisabled = false;
                                 }
                      }
           }

...

        protected override void WndProc(ref Message m)
        {
            if (_paintDisabled)
            {
                int msg = m.Msg;
                if (msg == WM_PAINT || msg == WM_PAINTCLIPBOARD || msg == WM_PAINTICON
                    || msg == WM_ERASEBKGND)
                {
                    m.Result = IntPtr.Zero;
                    return;
                }
            }

            base.WndProc(ref m);
        }

        private const UInt32 WM_PAINT = 0x000F;
        private const UInt32 WM_NCPAINT = 0x0085;
        private const UInt32 WM_PAINTCLIPBOARD = 0x0309;
        private const UInt32 WM_PAINTICON = 0x0026;
        private const UInt32 WM_ERASEBKGND = 0x0014;
        private const UInt32 WM_PRINT = 0x0317;
        private const UInt32 WM_PRINTCLIENT = 0x0318;
        const int WM_SYSKEYDOWN = 260;

        private const uint PRF_CHECKVISIBLE = 0x00000001;
        private const uint PRF_NONCLIENT = 0x00000002;
        private const uint PRF_CLIENT = 0x00000004;
        private const uint PRF_ERASEBKGND = 0x00000008;
        private const uint PRF_CHILDREN = 0x00000010;
        private const uint PRF_OWNED = 0x00000020;

        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, int lParam);

...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)