重绘panel控件,实现panel的阴影效果

article/2025/9/30 15:05:24

最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下:

重绘代码如下:

  1 using System;
  2 using System.Collections.Generic;
 3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Data;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Drawing.Drawing2D;
 10 
 11 namespace ShadowPanel3
 12 {
 13     public partial class UserPanel : Panel
 14     {
 15         public UserPanel()
 16         {
 17 
 18         }
 19             /// <summary>
 20         /// 字段和属性 , panel的颜色
 21         /// </summary>
 22         private Color _panelColor;
 23         public Color PanelColor 
 24         {
 25             get { return _panelColor; }
 26             set { this._panelColor = value; }
 27         }
 28 
 29         /// <summary>
 30         /// 字段和属性,border的颜色
 31         /// </summary>
 32         private Color _borderColor;
 33         public Color BorderColor
 34         {
 35             get { return _borderColor; }
 36             set { this._borderColor = value; }
 37         }
 38 
 39         /// <summary>
 40         /// 阴影区域大小
 41         /// </summary>
 42         private int shadowSize = 5;
 43 
 44         //将预备的小图标转化
 45         static Image shadowDownRight = new Bitmap(typeof(UserPanel), "Images.tshadowdownright.png");
 46         static Image shadowDown = new Bitmap(typeof(UserPanel), "Images.tshadowdown.png");
 47         static Image shadowRight = new Bitmap(typeof(UserPanel), "Images.tshadowright.png");
 48         static Image shadowTop = new Bitmap(typeof(UserPanel),"Images.tshadowtop.png");
 49         static Image shadowLeft = new Bitmap(typeof(UserPanel),"Images.tshadowleft.png");
 50         static Image shadowLeftDown = new Bitmap(typeof(UserPanel),"Images.tshadowleftdown.png");
 51         static Image shadowLeftTop = new Bitmap(typeof(UserPanel),"Images.tshadowlefttop.png");
 52         static Image shadowTopLeft = new Bitmap(typeof(UserPanel),"Images.tshadowtopleft.png");
 53 
 54         /// <summary>
 55         /// 重绘panel
 56         /// </summary>
 57         /// <param name="e"></param>
 58         protected override void OnPaint(PaintEventArgs e)
 59         {
 60             base.OnPaint(e);
 61             //Get the graphics object. We need something to draw with 
 62             Graphics g = e.Graphics;
 63 
 64             //下边和右边画笔
 65             TextureBrush shadowRightBrush = new TextureBrush(shadowRight,WrapMode.Tile);
 66             TextureBrush shadowDownBrush = new TextureBrush(shadowDown,WrapMode.Tile);
 67 
 68             //上边和左边画笔
 69             TextureBrush shadowLeftBrush = new TextureBrush(shadowLeft, WrapMode.Tile);
 70             TextureBrush shadowTopBrush = new TextureBrush(shadowTop,WrapMode.Tile);
 71 
 72             //给画笔定位
 73             shadowDownBrush.TranslateTransform(0, Height - shadowSize);
 74             shadowRightBrush.TranslateTransform(Width - shadowSize, 0);
 75 
 76             shadowTopBrush.TranslateTransform(0,0);
 77             shadowLeftBrush.TranslateTransform(0,0);
 78 
 79             //每个阴影区域非配一个矩形区域
 80             Rectangle shadowDownRectangle = new Rectangle(
 81                 shadowSize,                                                     //X
 82                 Height-shadowSize,                                         //Y
 83                 Width-shadowSize*2,                                     //width(stretches)           
 84                 shadowSize                                                    //height
 85                 );
 86 
 87             Rectangle shadowRightRectangle = new Rectangle(
 88               Width-shadowSize,                                           //X
 89               shadowSize,                                                     //Y
 90               shadowSize,                                                    //width         
 91               Height-shadowSize*2                                       //height(stretches)  
 92               );
 93 
 94             Rectangle shadowTopRectangle = new Rectangle(
 95               shadowSize,                                                    //X
 96               0,                                                                     //Y
 97               Width-shadowSize*2,                                       //width         
 98               shadowSize                                                     //height(stretches)  
 99               );
100 
101             Rectangle shadowLeftRectangle = new Rectangle(
102               0,                                                                    //X
103               shadowSize,                                                    //Y
104               shadowSize,                                                    //width         
105               Height-shadowSize*2                                       //height(stretches)  
106               );
107 
108             //在底部和右边画出阴影
109             g.FillRectangle(shadowDownBrush,shadowDownRectangle);
110             g.FillRectangle(shadowRightBrush,shadowRightRectangle);
111             //在上部和左边画出阴影
112             g.FillRectangle(shadowTopBrush,shadowTopRectangle);
113             g.FillRectangle(shadowLeftBrush,shadowLeftRectangle);
114 
115             //四个角落处的阴影
116             g.DrawImage(shadowDownRight, new Rectangle(Width-shadowSize, Height-shadowSize,shadowSize,shadowSize));
117             g.DrawImage(shadowLeftDown, new Rectangle(0, Height - shadowSize, shadowSize, shadowSize));
118             g.DrawImage(shadowLeftTop, new Rectangle(0, 0, shadowSize, shadowSize));
119             g.DrawImage(shadowTopLeft, new Rectangle(Width-shadowSize, 0, shadowSize, shadowSize));
120 
121 
122             Rectangle fullRectangle = new Rectangle(
123                 1,
124                 1,
125                 Width - (shadowSize + 2),
126                 Height - (shadowSize + 2)
127                 );
128 
129             if (PanelColor != null)
130             {
131                 SolidBrush bgBrush = new SolidBrush(_panelColor);
132                 g.FillRectangle(bgBrush,fullRectangle);
133             }
134 
135             //给panel添加边框颜色
136             if (_borderColor != null)
137             {
138                 Pen borderPen = new Pen(BorderColor);
139                 g.DrawRectangle(borderPen,fullRectangle);
140             }
141 
142             //释放画笔资源
143             shadowDownBrush.Dispose();
144             shadowRightBrush.Dispose();
145             shadowLeftBrush.Dispose();
146             shadowTopBrush.Dispose();
147 
148             shadowDownBrush = null;
149             shadowRightBrush = null;
150             shadowTopBrush = null;
151             shadowLeftBrush = null;
152         }
153 
154             //Correct resizing
155             protected override void OnResize(EventArgs e)
156             {
157                 base.Invalidate();
158                 base.OnResize(e);
159             }
160     }
161 }

 

转载于:https://www.cnblogs.com/SeeYouLater/p/5074483.html


http://chatgpt.dhexx.cn/article/38eD9Kn4.shtml

相关文章

C# 使用Panel控件实现窗体嵌套

一、准备步骤&#xff1a; 1. 创建一个Windows应用程序 2. 把默认窗口的名字为Form1(如上图) 3. 创建一个Windows窗体&#xff0c;为Form2(如上图) 4. 在Form1窗口中增加一个按钮button&#xff0c;然后增加一个Panel&#xff0c;双击按钮在按钮里面写事件&#xff08;如下…

asp.net panel 加html,ASP.NET中 Panel 控件的使用方法

Panel 控件在 ASP.NET 网页中提供一种容器控件&#xff0c;可以将它用作静态文本和其他控件的父控件。 一、常见 Panel 属性 属性 描述 HorizontalAlign 指定子控件在面板内的对齐方式(左对齐、右对齐、居中或两端对齐)。 Wrap 指定面板内过宽的内容是要换到下一行&#xff0c;…

C#当中如何使用Panel控件显示其它窗体

【效果图】 要实现点击左边不同的功能时&#xff0c;在右面pannel控件中显示对应的窗体 【代码】 窗体是一个顶级控件&#xff0c;要想将其显示在panel控件中&#xff0c;要将窗体设置为非顶级控件 form.TopLevel false; 下面是一个将窗体显示在Panel控件中的方法 this.pa…

panel中html怎么写,panel控件有什么用 请写出Panel控件的用途

当多个panel控件重叠时,把一个panel的visible/设置为true,其它的设置为f例如有3个panel,分别为panel1,panel2,panel3 如果重叠的话,把他们的大小设置为相同大小,直接通过上下层来控制即可,例如想要panel2显示出来,就用 panel2.BringToFront; 要是想panel1显示则用panel1.B…

多个panel控件重合使用时,某个panel控件不显示问题?

前言 在设计一个界面时&#xff0c;为了节省空间&#xff0c;我将控件分类后分别放到了三个重合放置的Panel中&#xff0c;并添加三个了按钮作为调出对应Panel的媒介&#xff0c;如图1-1所示。 图1-1 简化效果图 按钮的调用代码如下&#xff1a; private void btnOne_Click(o…

C#中Panel控件的使用

大家在创建winform的时候&#xff0c;是不是很多时候都需要建立父窗体&#xff0c;然后再父窗体基础上添加子窗体&#xff0c;然后再单击事件的时候还有可能弹出好多的窗口&#xff0c;今天给大家带来有关panel控件福利。 Panel控件相当于在我们主窗体中添加了一个容器&#xf…

机房重构-panel控件

第一种用法&#xff1a; 以前实现这些需要用属性Enabled为False。 其实VS中自带了一个panel控件可以实现这个。 把text控件放到panel上&#xff0c;在修改按钮这里写入下面代码&#xff0c;就可以使panel上所有控件可修改。 private void btnModify_Click(object sender, Ev…

C# panel控件的移动与扩大

开发环境&#xff1a; 基于 VS2019 基于C#语言 解决问题 C# panel控件的移动与扩大 结果展示 4、源代码下载链接&#xff1a;

Panel控件—让你的界面变好看

panel控件对于美化UI窗体有很大的作用&#xff0c;这不&#xff0c;我们在机房合作的时候就使用了panel控件。使用了panel控件之后&#xff0c;减少了弹出窗体的次数&#xff0c;因为窗体都放在了panel控件中显示出来了。下面来看看一成品图。 今天就来教大家如何使用panel控件…

jsonp 详解

JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通&#xff0c;而 HTML 的<script> 元素是一个例…

VUE2.0之Jsonp的使用方法(前端)

本文主要介绍的是在VUE2.0Jsonp的使用方法,通过github引入jsonp和promise封装,实现跨域获取数据。 1.JSONP的用途和原理 使用JSONP主要是目的通过动态创建Script,动态拼接url,进而抓取数据,实现跨域。确切地说,AJAX请求由于同源影响,是不允许进行跨域请求的,而Script标…

JSONP跨域的原理

目录 JSONP跨域原理演示JSONP跨域注意事项JSONP实践jQuery发送JSONP请求 JSONP&#xff08;JSON With Padding&#xff09;是利用script标签的跨域功能&#xff0c;比如script和img的src属性&#xff0c;link的href属性&#xff0c;它只支持get请求。 JSONP跨域原理演示 把外部…

java~jsonp的使用

对于一个后端程序来发&#xff0c;它可能会被多个应用调用&#xff0c;而跨域的问题就来了&#xff0c;使用jsonp来解决这个问题是个不错的方式&#xff0c;下面说一下关于jsonp的知识 JSONP不是新技术&#xff0c;只是在页面上响应一段js对于响应的 MIME type (‘text/plain’…

轻松搞定JSONP跨域请求

一、同源策略 要理解跨域&#xff0c;先要了解一下“同源策略”。所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口相同。所谓“同源策略“&#xff0c;简单的说就是基于安全考虑&#xff0c;当前域不能访问其他域的东西。 一些常见的是否同源示例可参照下表&a…

jsonp

jsonp 我们知道&#xff0c;普通的ajax请求存在跨域无权限访问的问题&#xff0c;这是浏览器的安全策略在起作用 index.php: <?php $info {"code" : 10,"title" : "jsonp","name" : "rgy"};echo $info; ?> test.h…

什么是JSONP及其实现原理

一、为什么会有JSONP 解决跨域问题&#xff1b;因为XMLHttpRequest有同源策略&#xff0c;而在实际开发中又常有跨域的需求&#xff0c;早期开发者为解决跨域问题&#xff0c;设计出了JSONP这个东西 二、JSONP长什么样 类似JSON&#xff0c;一种JSON的变体&#xff0c;样式就…

Ajax中的JSONP

同源策略和跨域的概念 什么是同源 如果两个页面的协议&#xff0c;域名和端口都相同&#xff0c;则两个页面具有相同的源。 什么是同源策略 同源策略(英文全称Same origin policy)是浏览器提供的一个安全功能。 MDN官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如…

JSONP解决跨域问题

一、什么是同源 概念&#xff1a;如果两个页面的协议、域名和端口都相同&#xff0c;则这两个页面具有相同的源。 二、什么是同源策略 概念&#xff1a;是浏览器提供的一个安全功能。 三、什么是跨域 概念&#xff1a;同源指的是两个URL的协议、域名、端口号一致&#xff0c…

关于Jsonp,你知道多少?

# 一、Jsonp为跨域而生 为什么会出现跨域问题&#xff1f; &#x1f64b;‍♀️出于浏览器的同源策略限制。 什么是源? &#x1f64b;‍♀️源&#xff08;origin&#xff09;就是协议&#xff08;protocol&#xff09;&#xff0c;主机&#xff08;host&#xff09;和端口…

JSONP原理及实现

文章目录 基本原理执行过程优缺点 案例分析前期准备后端代码前端简单实现jQuery中ajax实现封装一个JSONP方法简易版同时多个请求最终版JSONP方法 基本原理 基本原理&#xff1a; 主要就是利用了 script 标签的src没有跨域限制来完成的。 执行过程 前端定义一个解析函数(如: …