[聚合文章] C# Winform 实现Ajax效果自定义按钮

.Net 2017-12-18 21 阅读

技术看点

  • WinForm自定义控件的使用
  • 自定义控件gif动画的播放

需求及效果

又来一波 C# GDI自定义控件show 。这个控件已经使用几年了,最近找出来重构一下。原来是没有边框的,那么导致导航的功能不是很突出。本来想加个效果:在执行单击时显示Loading动画,在执行完单击事件后恢复原样。这就是网页里见到的局部刷新,Ajax常用的场景。需求来自几年前一个智能储物柜项目,人机界面有个美工设计好的效果图,为了省事和通用,需要一个透明的按钮来实现导航的任务。就是控件只是设计时可见,运行时不可见。

 

 

关键点说明

1)、GraphicsPath实现矩形的圆角羽化处理

 

 using (GraphicsPath path = new GraphicsPath())
            {
                #region 羽化,圆角处理
                path.StartFigure();
                path.AddArc(new Rectangle(new Point(rect.X, rect.Y), new Size(2 * Radius, 2 * Radius)), 180, 90);
                path.AddLine(new Point(rect.X + Radius, rect.Y), new Point(rect.Right - Radius, rect.Y));
                path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Y), new Size(2 * Radius, 2 * Radius)), 270, 90);
                path.AddLine(new Point(rect.Right, rect.Y + Radius), new Point(rect.Right, rect.Bottom - Radius));
                path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 0, 90);
                path.AddLine(new Point(rect.Right - Radius, rect.Bottom), new Point(rect.X + Radius, rect.Bottom));
                path.AddArc(new Rectangle(new Point(rect.X, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 90, 90);
                path.AddLine(new Point(rect.X, rect.Bottom - Radius), new Point(rect.X, rect.Y + Radius));
                path.CloseFigure();
                #endregion 
                

要点就是画几段弧线和矩形连接起来。透明就是用了Color.FromArgb加上透明度,然后填充GraphicsPath形成透明区域。

g.FillPath(new SolidBrush(Color.FromArgb(153, BackColor)), path);

2)、单窗体应用如何模块化 

窗体只有一个,但操作界面好多个,由于是无人值守的应用。那么老是切换窗体操作是非常不方便的。工作区域是一个容器Panel,把每个操作界面定义成一个Panel作为只容器。

 public partial class DepositBizPanel : UserControl
    {
        private BackgroundStyle backgroundStyle = BackgroundStyle.Green;
        /// <summary>
        /// 主题风格
        /// </summary>
        public BackgroundStyle BackgroundStyle
        {
            get { return backgroundStyle; }
            set
            {
                backgroundStyle = value;
                switch (value)
                {
                    case GreenlandExpressBox.BackgroundStyle.Blue:
                        BackgroundImage = Properties.Resources.jbblue;
                        break;
                    case GreenlandExpressBox.BackgroundStyle.Orange:
                        BackgroundImage = Properties.Resources.jborange;
                        break;
                    case GreenlandExpressBox.BackgroundStyle.Green:
                        BackgroundImage = Properties.Resources.jbgreen;
                        break;
                }
                Invalidate();
            }
        }

        public Panel ParentPanel
        {
            get;
            set;
        }

        public Bitmap QR_Barcode
        {
            get { return (Bitmap)pbxBarcode.Image; }
            set { pbxBarcode.Image = value; }
        }

        public DialogResult PanelDiagResult
        {
            get;
            set;
        }

        public DepositBizPanel(Panel parent, Bitmap barcode, BackgroundStyle style)
        {
            InitializeComponent();
            DoubleBuffered = true;
            ParentPanel = parent;
            QR_Barcode = barcode;
            BackgroundStyle = style;
        }       

        private void btnback_Click(object sender, EventArgs e)
        {
            foreach (Control panel in ParentPanel.Controls)
            {
                if (panel is DepositBizPanel)
                {
                    ParentPanel.Controls.Remove(panel);
                    PanelDiagResult = DialogResult.Cancel;
                    break;
                }
            }
        }

        private void btnprocessnext_Click(object sender, EventArgs e)
        {
            foreach (Control panel in ParentPanel.Controls)
            {
                if (panel is DepositBizPanel)
                {
                    ParentPanel.Controls.Remove(panel);
                    PanelDiagResult = DialogResult.OK;
                    break;
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。