由于项目需求,要对窗体进行美化。不用第三方控件。
将窗体设置成无边框,目前的问题是:窗体在移动与左放大、右放大没有闪烁,但是左缩小与右缩小会闪烁,请教有没有什么好的解决的办法?

解决方案 »

  1.   

    http://www.cnblogs.com/yellowyu/archive/2009/03/30/1425499.html
      

  2.   

                //减少闪烁
                //SetStyle(ControlStyles.SupportsTransparentBackColor , true);
                //SetStyle(ControlStyles.AllPaintingInWmPaint , true);
                //SetStyle(ControlStyles.UserPaint , true);
                //双缓冲
                SetStyle(ControlStyles.DoubleBuffer, true);
                SetStyle(ControlStyles.ResizeRedraw, true);
                //this.Refresh();
      

  3.   

    两个方法:
    1、使用双缓冲内存位图直接操作;
    2、使用wpf做个界面给程序调用.
      

  4.   

    #region 窗体缩放        const int WM_NCHITTEST = 0x0084;
            const int HTLEFT = 10;//左边界
            const int HTRIGHT = 11;//右边界
            const int HTTOP = 12;//上边界
            const int HTTOPLEFT = 13;//左上角
            const int HTTOPRIGHT = 14;//右上角
            const int HTBOTTOM = 15;//下边界
            const int HTBOTTOMLEFT = 0x10;//左下角
            const int HTBOTTOMRIGHT = 17;//右下角        protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                switch (m.Msg)
                {
                    case WM_NCHITTEST:
                        {
                            Point vPoint = new Point((int)m.LParam & 0xFFFF,
                                (int)m.LParam >> 16 & 0xFFFF);
                            vPoint = PointToClient(vPoint);
                            //判断:仅当当前窗体状态不是最大化时,相关鼠标事件生效
                            if (this.WindowState != FormWindowState.Maximized)
                            {
                                if (vPoint.X <= 5)
                                {
                                    if (vPoint.Y <= 5)
                                    {
                                        m.Result = (IntPtr)HTTOPLEFT;
                                    }
                                    else if (vPoint.Y >= ClientSize.Height - 5)
                                    {
                                        m.Result = (IntPtr)HTBOTTOMLEFT;
                                    }
                                    else
                                    {
                                        m.Result = (IntPtr)HTLEFT;
                                    }
                                }
                                else if (vPoint.X >= ClientSize.Width - 5)
                                {
                                    if (vPoint.Y <= 5)
                                    {
                                        m.Result = (IntPtr)HTTOPRIGHT;
                                    }
                                    else if (vPoint.Y >= ClientSize.Height - 5)
                                    {
                                        m.Result = (IntPtr)HTBOTTOMRIGHT;
                                    }
                                    else
                                    {
                                        m.Result = (IntPtr)HTRIGHT;
                                    }
                                }
                                else if (vPoint.Y <= 5)
                                {
                                    m.Result = (IntPtr)HTTOP;
                                }
                                else if (vPoint.Y >= ClientSize.Height - 5)
                                {
                                    m.Result = (IntPtr)HTBOTTOM;
                                }
                            }
                            break;
                        }
                }
            }
            #endregion
    简单,易懂,无闪烁
      

  5.   

    把Program下面的 Application.EnableVisualStyles();注释了此方法是启动可视化效果。
      

  6.   

    缩放移动的时候,挂起逻辑布局试试,完成后恢复
    SuspendLayout()
    ResumeLayout()