發(fā)文章
發(fā)文工具
撰寫(xiě)
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
在項(xiàng)目開(kāi)發(fā)中的窗體的設(shè)計(jì)會(huì)影響用戶對(duì)軟件的整體印象,因此窗體的效果要設(shè)計(jì)得美觀一些。
029 制作鼠標(biāo)穿透窗體
在對(duì)桌面進(jìn)行操作時(shí),為了使桌面更加美觀,可以在桌面的上面加一層類似于玻璃的效果,用戶可以用鼠標(biāo)透過(guò)“玻璃”對(duì)桌面進(jìn)行操作。本實(shí)例通過(guò)使用鼠標(biāo)穿透窗體類實(shí)現(xiàn)以上功能。主要用到了 API 函數(shù) SetWindowLong 和 GetWindowLong。
1.創(chuàng)建一個(gè)項(xiàng)目,默認(rèn)窗體為 Form1,將該窗體的 FormBordeStyle 屬性設(shè)置為 None,BackColor 屬性設(shè)置為 Gainsboro,Opacity 屬性設(shè)置為 60%,WindowState 屬性設(shè)置為 Maximized。
2.在 Form1 窗體中添加一個(gè) NotifyIcon 控件,并設(shè)置其 Icon 屬性為指定的圖標(biāo),顯示提示信息;添加一個(gè) 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 =
""
;
//記錄當(dāng)前操作的類型
#region 在窗口結(jié)構(gòu)中為指定的窗口設(shè)置信息
/// <summary>
/// 在窗口結(jié)構(gòu)中為指定的窗口設(shè)置信息
/// </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 從指定窗口的結(jié)構(gòu)中取得信息
/// 從指定窗口的結(jié)構(gòu)中取得信息
/// <param name="hwnd">欲為其獲取信息的窗口的句柄</param>
"GetWindowLong"
GetWindowLong(IntPtr hwnd,
nIndex);
#region 使窗口有鼠標(biāo)穿透功能
/// 使窗口有鼠標(biāo)穿透功能
void
CanPenetrate()
intExTemp = GetWindowLong(
this
.Handle, GWL_EXSTYLE);
//從當(dāng)前窗口的結(jié)構(gòu)中取得信息
//在窗口結(jié)構(gòu)中為當(dāng)前窗口設(shè)置信息
oldGWLEx = SetWindowLong(
.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
Form1_Load(
object
sender, EventArgs e)
.ShowInTaskbar =
false
//窗體不出現(xiàn)在Windows任務(wù)欄中
CanPenetrate();
//自定義方法,用來(lái)通過(guò)API函數(shù)SetWindowLong和GetWindowLong實(shí)現(xiàn)鼠標(biāo)的穿透效果
.TopMost =
true
//使窗體始終在其它窗體之上
#region 設(shè)置顏色和透明度的狀態(tài)
/// 設(shè)置顏色和透明度的狀態(tài)
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 窗體換膚程序
本實(shí)例的基本原理是給窗體的各個(gè)組成部分更換圖片,基于該原理,首先需要分析窗體的組成部分,主要包括標(biāo)題欄、左邊框、右邊框、下邊框、窗體中間區(qū)域及可能存在的菜單欄,其中標(biāo)題欄和3個(gè)邊框無(wú)法通過(guò)設(shè)置相關(guān)屬性來(lái)達(dá)到更換背景圖片的目的。對(duì)于這個(gè)問(wèn)題,可以通過(guò)取消窗體的 FormBorderStyle 屬性,同時(shí)在標(biāo)題欄和3個(gè)邊框的位置添加 Panel 控件來(lái)解決,然后通過(guò)選擇不同的皮膚類型,為窗體的各個(gè)組成部分設(shè)置圖片,最終達(dá)到窗體換膚的效果。在以上過(guò)程中,最主要的技術(shù)問(wèn)題是如何從指定的文件創(chuàng)建 Image 對(duì)象,以及如何獲取圖片的路徑。
1.創(chuàng)建一個(gè)項(xiàng)目,默認(rèn)窗體為 Form1,設(shè)置 Form1 的 AutoscaleMode 屬性為 Inherit,DoubleBuffered 屬性為 True,IsMdiContainer 屬性為 True。
2.在窗體中添加6個(gè) Panel 控件,分別用來(lái)作為窗體的標(biāo)題欄、下邊框、左邊框、右邊框、左下角邊框和右下角邊框;添加一個(gè) ContextMenuStrip 控件,用來(lái)作為更換皮膚的快捷菜單;添加3個(gè) PictureBox 控件,分別用來(lái)顯示最大化、最小化和關(guān)閉圖片。
_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;
//關(guān)閉事件。
picClose_Click(
sender, System.EventArgs e)
Application.Exit();
//最大化事件。
picMaximize_Click(
(!bol)
//若窗體處于普通狀態(tài)
top =
.Top;
//獲取窗體的Top屬性值
left =
.Left;
//獲取窗體的Left屬性值
hei =
.Height;
//獲取窗體的Height屬性值
wid =
.Width;
//獲取窗體的Width屬性值
.Top = 0;
//設(shè)置窗體的Top屬性值為零
.Left = 0;
//設(shè)置窗體的Left屬性值為零
hg = SystemInformation.MaxWindowTrackSize.Height;
//獲取窗口的默認(rèn)最大高度
wh = SystemInformation.MaxWindowTrackSize.Width;
//獲取窗口的默認(rèn)最大寬度
.Height = hg;
//設(shè)置窗體的Height屬性值
.Width = wh;
//設(shè)置窗體的Width屬性值
//設(shè)置窗體標(biāo)記表示最大化
(menItemSkin1.Checked)
//若選擇“紫色小花”菜單項(xiàng),設(shè)置最大化圖片的Image屬性
.picMaximize.Image = Image.FromFile(strImagesPath +
@"\images\purple\max.png"
);
(menItemSkin2.Checked)
//若選擇“藍(lán)色經(jīng)典”菜單項(xiàng),設(shè)置最大化圖片的Image屬性
@"\images\blue\max.png"
(menItemSkin3.Checked)
//若選擇“綠色菜園”菜單項(xiàng),設(shè)置最大化圖片的Image屬性
@"\images\green\max.png"
else
//若窗體處于最大化狀態(tài)
.Top = top;
//設(shè)置窗體的Top屬性值
.Left = left;
//設(shè)置窗體的Left屬性值
.Height = hei;
.Width = wid;
//設(shè)置窗體標(biāo)記表示普通狀態(tài)
@"\images\purple\max_Normal.png"
@"\images\blue\max_Normal.png"
@"\images\green\max_Normal.png"
//最小化事件。
picMinimize_Click(
.Height = 0;
.Width = 0;
bo =
//窗口再次被激活時(shí)。
Form_Activated(
(bo)
//選擇關(guān)閉。
mItemColse_Click(
//上邊框鼠標(biāo)按下。
panel_Top_MouseDown(
sender, System.Windows.Forms.MouseEventArgs e)
x = e.X;
y = e.Y;
.bolTop =
//上邊框鼠標(biāo)移動(dòng)。
panel_Top_MouseMove(
(bolTop)
.Top += e.Y - y;
.Left += e.X - x;
//上邊框鼠標(biāo)釋放。
panel_Top_MouseUp(
//左邊框鼠標(biāo)按下。
panel_Left_MouseDown(
.bolLeft =
//左邊框鼠標(biāo)移動(dòng)。
panel_Left_MouseMove(
(bolLeft)
.Width += x - e.X;
//左邊框鼠標(biāo)離開(kāi)。
panel_Left_MouseUp(
//右邊框鼠標(biāo)按下。
panel_Right_MouseDown(
.bolRight =
//右邊框鼠標(biāo)移動(dòng)。
panel_Right_MouseMove(
(bolRight)
.Width += e.X - x;
//右邊框鼠標(biāo)離開(kāi)。
panel_Right_MouseUp(
//下邊框鼠標(biāo)按下。
panel_Bottom_MouseDown(
.bolBottom =
//下邊框鼠標(biāo)移動(dòng)。
panel_Bottom_MouseMove(
(bolBottom)
.Height += e.Y - y;
//下邊框鼠標(biāo)離開(kāi)。
panel_Bottom_MouseUp(
//左下角鼠標(biāo)按下。
panelLeftCornu_MouseDown(
.bolLeftCornu =
//左下角鼠標(biāo)移動(dòng)。
panelLeftCornu_MouseMove(
(bolLeftCornu)
//左下角鼠標(biāo)離開(kāi)。
panelLeftCornu_MouseUp(
//右下角鼠標(biāo)按下。
panelRightCornu_MouseDown(
.bolRightCornu =
//右下角鼠標(biāo)移動(dòng)。
panelRightCornu_MouseMove(
(bolRightCornu)
//右下角鼠標(biāo)離開(kāi)。
panelRightCornu_MouseUp(
Form_Load(
menItemSkin2_Click(sender, e);
//默認(rèn)藍(lán)色經(jīng)典
menItemSkin1_Click(
//設(shè)置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"
//設(shè)置最小化圖片控件的Image屬性
.picMinimize.Image = Image.FromFile(strImagesPath +
@"\images\purple\min.png"
(bol ==
)
//若當(dāng)前窗體處于最大化狀態(tài)
//設(shè)置最大化圖片控件的Image屬性
@"\images\purple\max_normal.png"
//設(shè)置關(guān)閉圖片控件的Image屬性
.picClose.Image = Image.FromFile(strImagesPath +
@"\images\purple\close.png"
//設(shè)置菜單的選中標(biāo)記
.menItemSkin1.Checked =
.menItemSkin2.Checked =
.menItemSkin3.Checked =
//設(shè)置窗體主菜單的背景圖像屬性
.menuStrip1.BackgroundImage = Image.FromFile(strImagesPath +
@"\images\purple\menu.gif"
//設(shè)置窗體的背景圖像屬性
.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);
來(lái)自: 昵稱10504424 > 《C#》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
方法和屬性
在 Visual Basic 2005 中,System.Drawing.Pen 控件的 Pen.Width 屬性決定線的粗細(xì);下面的代碼示例演示 Visual Basic 6.0 和 Visual Basic 2005 在編碼方法上的不同之處。'' Visual Basic 6.0...
用C#做一個(gè)懸浮窗口[含三種移動(dòng)無(wú)標(biāo)題窗體的辦法]
第一步:建立一個(gè)窗體,設(shè)置其屬性:再添加三個(gè)鼠標(biāo)事件: private void Form2_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) ...
無(wú)邊框窗體的移動(dòng)(C#)(轉(zhuǎn)載)
C#無(wú)標(biāo)題窗體移動(dòng)注意窗體上的控件是否把窗體覆蓋了。。。MouseDown、MouseMove、MouseUp事件應(yīng)該是鼠標(biāo)所處位置最頂層的控件的事件在窗體的類中聲明兩個(gè)變量 private Point mouseOffset; //記錄鼠標(biāo)指...
窗體應(yīng)用程序中的Panel和Style——WindowsForm系列教程
窗體應(yīng)用程序中的Panel和Style——WindowsForm系列教程。Forms import Application, Form, BorderStyle, Panelclass FunnyBIM(Form): de...
C#圖片縮放平移從功能分析到編碼實(shí)現(xiàn)
調(diào)整到右邊界www.77884.net?{?if(pel.Width-width>0)left=0;?elseleft=pel.Width-width;?width=pel.Width-left;?}??if(top>0)//上側(cè)在顯示范圍內(nèi)部,調(diào)整到上邊界?{?if(heigth-top.
窗體定位
C# 窗體(Form)中如何實(shí)現(xiàn)全局快捷鍵 如:[Ctrl + Enter]
C# 窗體(Form)中如何實(shí)現(xiàn)全局快捷鍵 如:[Ctrl + Enter]但是這個(gè)只能實(shí)現(xiàn)回車啊....如果想實(shí)現(xiàn)Ctrl + Enter或者其他的Ctrl+ XXX 怎么辦呢(如:QQ一樣,按Ctrl + Enter發(fā)送消息).....如果在屬性欄上設(shè)置Sho...
第一章 Delphi快速入門(五)
應(yīng)用自動(dòng)創(chuàng)建窗體、窗體樣板、對(duì)話框?qū)<?、?yīng)用專家等,可以使得創(chuàng)建應(yīng)用程序更為方便快捷,而且可重復(fù)利用,大大地降低了工作量。再運(yùn)行程序,除了與上述功能相同顯示About對(duì)話框外,該程序只有當(dāng)用戶...
窗體的常用屬性
窗體的常用屬性。控件窗體屬性與事件。2、設(shè)置窗體邊框的外觀、以前叫窗體的風(fēng)格。Formclosed 窗體關(guān)閉(窗體已經(jīng)關(guān)閉時(shí))窗體類 窗體對(duì)象 = new 窗體類() ;if(窗體對(duì)象==null || 窗體對(duì)象.IsDisposed...
微信掃碼,在手機(jī)上查看選中內(nèi)容