发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
在项目开发中的窗体的设计会影响用户对软件的整体印象,因此窗体的效果要设计得美观一些。
029 制作鼠标穿透窗体
在对桌面进行操作时,为了使桌面更加美观,可以在桌面的上面加一层类似于玻璃的效果,用户可以用鼠标透过“玻璃”对桌面进行操作。本实例通过使用鼠标穿透窗体类实现以上功能。主要用到了 API 函数 SetWindowLong 和 GetWindowLong。
1.创建一个项目,默认窗体为 Form1,将该窗体的 FormBordeStyle 属性设置为 None,BackColor 属性设置为 Gainsboro,Opacity 属性设置为 60%,WindowState 属性设置为 Maximized。
2.在 Form1 窗体中添加一个 NotifyIcon 控件,并设置其 Icon 属性为指定的图标,显示提示信息;添加一个 ContextMenuStrip 控件,作为程序的快捷菜单。
namespace
_029_MouseThroughForm
{
public
partial
class
Form1 : Form
Form1()
InitializeComponent();
}
private
const
uint
WS_EX_LAYERED = 0x80000;
int
WS_EX_TRANSPARENT = 0x20;
GWL_EXSTYLE = (-20);
string
Var_genre =
""
;
//记录当前操作的类型
#region 在窗口结构中为指定的窗口设置信息
/// <summary>
/// 在窗口结构中为指定的窗口设置信息
/// </summary>
/// <param name="hwnd">欲为其取得信息的窗口的句柄</param>
/// <param name="nIndex">欲取回的信息</param>
/// <param name="dwNewLong">由nIndex指定的窗口信息的新值</param>
/// <returns></returns>
[DllImport(
"user32"
, EntryPoint =
"SetWindowLong"
)]
static
extern
SetWindowLong(IntPtr hwnd,
nIndex,
dwNewLong);
#endregion
#region 从指定窗口的结构中取得信息
/// 从指定窗口的结构中取得信息
/// <param name="hwnd">欲为其获取信息的窗口的句柄</param>
"GetWindowLong"
GetWindowLong(IntPtr hwnd,
nIndex);
#region 使窗口有鼠标穿透功能
/// 使窗口有鼠标穿透功能
void
CanPenetrate()
intExTemp = GetWindowLong(
this
.Handle, GWL_EXSTYLE);
//从当前窗口的结构中取得信息
//在窗口结构中为当前窗口设置信息
oldGWLEx = SetWindowLong(
.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
Form1_Load(
object
sender, EventArgs e)
.ShowInTaskbar =
false
//窗体不出现在Windows任务栏中
CanPenetrate();
//自定义方法,用来通过API函数SetWindowLong和GetWindowLong实现鼠标的穿透效果
.TopMost =
true
//使窗体始终在其它窗体之上
#region 设置颜色和透明度的状态
/// 设置颜色和透明度的状态
SetEstate(Form Frm,
sender)
Var_genre = ((ToolStripMenuItem)sender).Name;
Tem_Str = Var_genre;
if
(Var_genre.IndexOf(
'_'
) >= 0)
Var_genre = Tem_Str.Substring(0, Tem_Str.IndexOf(
));
switch
(Var_genre)
case
"ToolColor"
:
Color Tem_Color = Color.Gainsboro;
(Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()))
1: Tem_Color = Color.Gainsboro;
break
2: Tem_Color = Color.DarkOrchid;
3: Tem_Color = Color.RoyalBlue;
4: Tem_Color = Color.Gold;
5: Tem_Color = Color.LightGreen;
Frm.BackColor = Tem_Color;
"ToolClarity"
double
Tem_Double = 0.0;
1: Tem_Double = 0.1;
2: Tem_Double = 0.2;
3: Tem_Double = 0.3;
4: Tem_Double = 0.4;
5: Tem_Double = 0.5;
6: Tem_Double = 0.6;
7: Tem_Double = 0.7;
8: Tem_Double = 0.8;
9: Tem_Double = 0.9;
Frm.Opacity = Tem_Double;
"ToolAcquiescence"
Frm.BackColor = Color.Gainsboro;
Frm.Opacity = 0.6;
"ToolClose"
Close();
ToolColor_Glass_Click(
SetEstate(
, sender);
030 窗体换肤程序
本实例的基本原理是给窗体的各个组成部分更换图片,基于该原理,首先需要分析窗体的组成部分,主要包括标题栏、左边框、右边框、下边框、窗体中间区域及可能存在的菜单栏,其中标题栏和3个边框无法通过设置相关属性来达到更换背景图片的目的。对于这个问题,可以通过取消窗体的 FormBorderStyle 属性,同时在标题栏和3个边框的位置添加 Panel 控件来解决,然后通过选择不同的皮肤类型,为窗体的各个组成部分设置图片,最终达到窗体换肤的效果。在以上过程中,最主要的技术问题是如何从指定的文件创建 Image 对象,以及如何获取图片的路径。
1.创建一个项目,默认窗体为 Form1,设置 Form1 的 AutoscaleMode 属性为 Inherit,DoubleBuffered 属性为 True,IsMdiContainer 属性为 True。
2.在窗体中添加6个 Panel 控件,分别用来作为窗体的标题栏、下边框、左边框、右边框、左下角边框和右下角边框;添加一个 ContextMenuStrip 控件,用来作为更换皮肤的快捷菜单;添加3个 PictureBox 控件,分别用来显示最大化、最小化和关闭图片。
_030_WinCusSkin
String strImagesPath = Application.StartupPath.Substring(0, Application.StartupPath.Substring(0, Application.StartupPath.LastIndexOf(
"\\"
)).LastIndexOf(
top, left, hei, wid;
bool
bol =
, bo =
, bolTop =
, bolLeft =
, bolRight =
, bolBottom =
, bolLeftCornu =
, bolRightCornu =
x = 0, y = 0;
//关闭事件。
picClose_Click(
sender, System.EventArgs e)
Application.Exit();
//最大化事件。
picMaximize_Click(
(!bol)
//若窗体处于普通状态
top =
.Top;
//获取窗体的Top属性值
left =
.Left;
//获取窗体的Left属性值
hei =
.Height;
//获取窗体的Height属性值
wid =
.Width;
//获取窗体的Width属性值
.Top = 0;
//设置窗体的Top属性值为零
.Left = 0;
//设置窗体的Left属性值为零
hg = SystemInformation.MaxWindowTrackSize.Height;
//获取窗口的默认最大高度
wh = SystemInformation.MaxWindowTrackSize.Width;
//获取窗口的默认最大宽度
.Height = hg;
//设置窗体的Height属性值
.Width = wh;
//设置窗体的Width属性值
//设置窗体标记表示最大化
(menItemSkin1.Checked)
//若选择“紫色小花”菜单项,设置最大化图片的Image属性
.picMaximize.Image = Image.FromFile(strImagesPath +
@"\images\purple\max.png"
);
(menItemSkin2.Checked)
//若选择“蓝色经典”菜单项,设置最大化图片的Image属性
@"\images\blue\max.png"
(menItemSkin3.Checked)
//若选择“绿色菜园”菜单项,设置最大化图片的Image属性
@"\images\green\max.png"
else
//若窗体处于最大化状态
.Top = top;
//设置窗体的Top属性值
.Left = left;
//设置窗体的Left属性值
.Height = hei;
.Width = wid;
//设置窗体标记表示普通状态
@"\images\purple\max_Normal.png"
@"\images\blue\max_Normal.png"
@"\images\green\max_Normal.png"
//最小化事件。
picMinimize_Click(
.Height = 0;
.Width = 0;
bo =
//窗口再次被激活时。
Form_Activated(
(bo)
//选择关闭。
mItemColse_Click(
//上边框鼠标按下。
panel_Top_MouseDown(
sender, System.Windows.Forms.MouseEventArgs e)
x = e.X;
y = e.Y;
.bolTop =
//上边框鼠标移动。
panel_Top_MouseMove(
(bolTop)
.Top += e.Y - y;
.Left += e.X - x;
//上边框鼠标释放。
panel_Top_MouseUp(
//左边框鼠标按下。
panel_Left_MouseDown(
.bolLeft =
//左边框鼠标移动。
panel_Left_MouseMove(
(bolLeft)
.Width += x - e.X;
//左边框鼠标离开。
panel_Left_MouseUp(
//右边框鼠标按下。
panel_Right_MouseDown(
.bolRight =
//右边框鼠标移动。
panel_Right_MouseMove(
(bolRight)
.Width += e.X - x;
//右边框鼠标离开。
panel_Right_MouseUp(
//下边框鼠标按下。
panel_Bottom_MouseDown(
.bolBottom =
//下边框鼠标移动。
panel_Bottom_MouseMove(
(bolBottom)
.Height += e.Y - y;
//下边框鼠标离开。
panel_Bottom_MouseUp(
//左下角鼠标按下。
panelLeftCornu_MouseDown(
.bolLeftCornu =
//左下角鼠标移动。
panelLeftCornu_MouseMove(
(bolLeftCornu)
//左下角鼠标离开。
panelLeftCornu_MouseUp(
//右下角鼠标按下。
panelRightCornu_MouseDown(
.bolRightCornu =
//右下角鼠标移动。
panelRightCornu_MouseMove(
(bolRightCornu)
//右下角鼠标离开。
panelRightCornu_MouseUp(
Form_Load(
menItemSkin2_Click(sender, e);
//默认蓝色经典
menItemSkin1_Click(
//设置Panel控件的BackgroundImage属性
.panel_Top.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\top.png"
.panel_Left.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\left.png"
.panel_Right.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\right.png"
.panel_Bottom.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\bottom.png"
//设置最小化图片控件的Image属性
.picMinimize.Image = Image.FromFile(strImagesPath +
@"\images\purple\min.png"
(bol ==
)
//若当前窗体处于最大化状态
//设置最大化图片控件的Image属性
@"\images\purple\max_normal.png"
//设置关闭图片控件的Image属性
.picClose.Image = Image.FromFile(strImagesPath +
@"\images\purple\close.png"
//设置菜单的选中标记
.menItemSkin1.Checked =
.menItemSkin2.Checked =
.menItemSkin3.Checked =
//设置窗体主菜单的背景图像属性
.menuStrip1.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\menu.gif"
//设置窗体的背景图像属性
.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\background.gif"
menItemSkin2_Click(
@"\images\blue\top.png"
@"\images\blue\left.png"
@"\images\blue\right.png"
@"\images\blue\bottom.png"
@"\images\blue\min.png"
@"\images\blue\max_normal.png"
@"\images\blue\close.png"
@"\images\blue\menu.gif"
@"\images\blue\background.gif"
menItemSkin3_Click(
@"\images\green\top.png"
@"\images\green\left.png"
@"\images\green\right.png"
@"\images\green\bottom.png"
@"\images\green\min.png"
@"\images\green\max_normal.png"
@"\images\green\close.png"
@"\images\green\menu.gif"
@"\images\green\background.gif"
退出ToolStripMenuItem_Click(
panel_Top_DoubleClick(
picMaximize_Click(sender, e);
来自: 昵称10504424 > 《C#》
0条评论
发表
请遵守用户 评论公约
方法和属性
在 Visual Basic 2005 中,System.Drawing.Pen 控件的 Pen.Width 属性决定线的粗细;下面的代码示例演示 Visual Basic 6.0 和 Visual Basic 2005 在编码方法上的不同之处。'' Visual Basic 6.0...
用C#做一个悬浮窗口[含三种移动无标题窗体的办法]
第一步:建立一个窗体,设置其属性:再添加三个鼠标事件: private void Form2_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) ...
无边框窗体的移动(C#)(转载)
C#无标题窗体移动注意窗体上的控件是否把窗体覆盖了。。。MouseDown、MouseMove、MouseUp事件应该是鼠标所处位置最顶层的控件的事件在窗体的类中声明两个变量 private Point mouseOffset; //记录鼠标指...
窗体应用程序中的Panel和Style——WindowsForm系列教程
窗体应用程序中的Panel和Style——WindowsForm系列教程。Forms import Application, Form, BorderStyle, Panelclass FunnyBIM(Form): de...
C#图片缩放平移从功能分析到编码实现
调整到右边界www.77884.net?{?if(pel.Width-width>0)left=0;?elseleft=pel.Width-width;?width=pel.Width-left;?}??if(top>0)//上侧在显示范围内部,调整到上边界?{?if(heigth-top.
窗体定位
C# 窗体(Form)中如何实现全局快捷键 如:[Ctrl + Enter]
C# 窗体(Form)中如何实现全局快捷键 如:[Ctrl + Enter]但是这个只能实现回车啊....如果想实现Ctrl + Enter或者其他的Ctrl+ XXX 怎么办呢(如:QQ一样,按Ctrl + Enter发送消息).....如果在属性栏上设置Sho...
第一章 Delphi快速入门(五)
应用自动创建窗体、窗体样板、对话框专家、应用专家等,可以使得创建应用程序更为方便快捷,而且可重复利用,大大地降低了工作量。再运行程序,除了与上述功能相同显示About对话框外,该程序只有当用户...
窗体的常用属性
窗体的常用属性。控件窗体属性与事件。2、设置窗体边框的外观、以前叫窗体的风格。Formclosed 窗体关闭(窗体已经关闭时)窗体类 窗体对象 = new 窗体类() ;if(窗体对象==null || 窗体对象.IsDisposed...
微信扫码,在手机上查看选中内容