窗体技巧集合
窗体技巧集(原创)
1。窗体总在最前面: 设置topMost属性
2。将窗体程序编译成类库
项目属性/通用属性/常规/输出类型 选择“类库”
继承窗体的使用
添加继承的窗体/打开/浏览/ 选择一个类库文件(*.dll)
3。设置窗体图标:
- 通过属性栏ICON来设。
Icon i=new Icon("..\\..\\banana.ico"); this.Icon=i;
4.动态设置窗体的光标
Cursor cr;
cr = new Cursor("..\\..\\no.cur");
this.Cursor = cr;
窗体的动画效果
一。形状变化
1 函数AnimateWindow
[System.Runtime.InteropServices.DllImport("user32")]
private static extern bool AnimateWindow(IntPtr hwnd,int dwTime, int dwFlags);
const int AW_HOR_POSITIVE = 0x0001;
const int AW_HOR_NEGATIVE = 0x0002;
const int AW_VER_POSITIVE = 0x0004;
const int AW_VER_NEGATIVE = 0x0008;
const int AW_CENTER = 0x0010;
const int AW_HIDE = 0x10000;
const int AW_ACTIVATE = 0x20000;
const int AW_SLIDE = 0x40000;
const int AW_BLEND = 0x80000;
函数原型:BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags)。
函数功能:该函数能在显示与隐藏窗口时产生两种特殊类型的动画效果:滚动动画和滑动动画。
参数含义:
hWnd:指定产生动画的窗口的句柄。
dwTime:指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒。
dwFags:指定动画类型。这个参数可以是一个或多个下列标志的组合。标志描述:
AW_SLIDE:使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略。
AW_ACTIVATE:激活窗口。在使用了AW_HIDE标志后不能使用这个标志。
AW_BLEND:实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。
AW_HIDE:隐藏窗口,缺省则显示窗口。
AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口。
AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。
AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。
AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。
在下列情况下函数将失败:
1 窗口使用了窗口边界;
2 窗口已经可见仍要显示窗口;
3 窗口已经隐藏仍要隐藏窗口。
2。调用
显示:AnimateWindow(this.Handle,1000, AW_CENTER | AW_ACTIVATE);
消失:
AnimateWindow(this.Handle,1000,AW_CENTER | AW_HIDE);收缩
AnimateWindow(this.Handle,1000,AW_HIDE| AW_BLEND) 淡出
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_HIDE | AW_VER_POSITIVE);上下左右滑动消失
二。设置窗体渐显效果
添加 timer 控件
private void Form1_Load(object sender, System.EventArgs e)
{
this.timer1.Enabled=true;
this.Opacity=0;
}
private void timer1_Tick(object sender, System.EventArgs e)
{
if(this.Opacity<1)
{
this.Opacity=this.Opacity+0.05;
}
else
{
this.timer1.Enabled=false;
}
}
如何使窗体部分区域透明
实现:
向窗体添加 panel 控件,将其设置为一种颜色。
设置窗体的 TransparencyKey 属性设为和 panel 相同的颜色。
this.TransparencyKey = System.Drawing.Color.White;
窗体透明;
this.Opacity=0.5;
多边形窗体
引用
using System.Runtime.InteropServices;
函数
[DllImport("gdi32")] private static extern IntPtr CreatePolygonRgn(Point[] lpPoint,int nCount,int nPolyFillMode); [DllImport("user32")] private static extern IntPtr SetWindowRgn(IntPtr hWnd,IntPtr hRgn,bool bRedraw); const int WINDING = 2;
创建形状
private void Form1_Load(object sender, System.EventArgs e)
{
Point[] pt={
new Point(this.Width /2,0),
new Point(0,this.Height/2),
new Point(this.Width/2,this.Height),
new Point(this.Width,this.Height/2),
new Point(this.Width,0)
};
IntPtr m_rgn;
m_rgn=CreatePolygonRgn(pt,5,WINDING);
SetWindowRgn(this.Handle,m_rgn,true);
}
字型窗体
实现:
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr CreateFont(int H,int W,int E,int O,int FW,int I,int u,int S,int C,int OP,int CP,int Q,int PAF,string F);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr GetDC(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr BeginPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr EndPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr PathToRegion(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int SetBkMode(IntPtr hdc,int nBkMode);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr SelectObject(IntPtr hdc,IntPtr hObject);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int TextOut(IntPtr hdc,int x,int y,string lpString, int nCount);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetWindowRgn(IntPtr hwnd,IntPtr hRgn,bool bRedraw);
const int FW_HEAVY = 900;
const int ANSI_CHARSET = 0;
const int OUT_DEFAULT_PRECIS = 0;
const int CLIP_DEFAULT_PRECIS = 0;
const int DEFAULT_QUALITY = 0;
const int DEFAULT_PITCH = 0;
const int FF_SWISS = 32;
const int TRANSPARENT = 1;
private void Form1_Load(object sender, System.EventArgs e)
{
IntPtr dc=GetDC(this.Handle);
IntPtr m_Font=CreateFont(200, 100, 0, 0, FW_HEAVY, 1, 0,
0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "宋体");
//创建字体
BeginPath(dc);
//开始记录窗体轮廓路径
SetBkMode(dc,TRANSPARENT);
//设置背景为透明模式,这是必须有的
IntPtr m_OldFont=SelectObject(dc,m_Font);
TextOut(dc,0, 0, "C#",2);
SelectObject(dc,m_OldFont);
EndPath(dc); //结束记录窗体轮廓路径
IntPtr m_wndRgn=PathToRegion(dc);
//把所记录的路径转化为窗体轮廓句柄
SetWindowRgn(this.Handle,m_wndRgn,true);
//赋予窗体指定的轮廓形状
}
用获取路径的方法得到圆形窗体
1.相关函数
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr BeginPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int SetBkMode(IntPtr hdc,int nBkMode);
const int TRANSPARENT = 1;
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr EndPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr PathToRegion(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int Ellipse(IntPtr hdc, int X1,int Y1, int X2,int Y2);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetWindowRgn(IntPtr hwnd,IntPtr hRgn,bool bRedraw);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr GetDC(IntPtr hwnd);
2.创建窗体
private void Form1_Load(object sender, System.EventArgs e)
{
IntPtr dc;
IntPtr region;
dc=GetDC(this.Handle);
BeginPath(dc);
//根据路径创建不规则窗体
SetBkMode(dc,TRANSPARENT);
//设置为透明模式
Ellipse(dc,20,20,220,220);
EndPath(dc);
region=PathToRegion(dc);
SetWindowRgn(this.Handle,region,true);
}
3.移动窗体过程
const int WM_NCHITTEST = 0x0084;
const int HTCLIENT = 0x0001;
const int HTCAPTION = 0x0002;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if (m.Result==(IntPtr)HTCLIENT)
m.Result=(IntPtr)HTCAPTION;
break;
default:
base.WndProc(ref m);
break;
}
}
渐变的窗口背景
实现:
1.using System.Drawing.Drawing2D;
2.Form1_Paint
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g=e.Graphics;
Color FColor=Color.Blue;
Color TColor=Color.Yellow;
Brush b =new LinearGradientBrush(this.ClientRectangle, FColor, TColor, LinearGradientMode.ForwardDiagonal);
g.FillRectangle(b,this.ClientRectangle);
}
3.Form1_Resize
private void Form1_Resize(object sender, System.EventArgs e)
{
this.Invalidate();
}
无标题窗体的拖动
方法1:
private Point m_point=new Point(0,0);
private void SmallWindow_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
m_point=new Point(e.X,e.Y);
}
private void SmallWindow_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
//Point cp=new Point(e.X,e.Y);
Point cp=Control.MousePosition;
this.Location=new Point(cp.X-m_point.X,cp.Y-m_point.Y);
}
}
方法2:
1。using System.Runtime.InteropServices;
2。倒入库
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd,int wMsg,int wParam,int lParam);
3。定义常量
public const int WM_SYSCOMMAND=0x0112;
public const int SC_MOVE=0xF010;
public const int HTCAPTION=0x0002;
4。添加 MouseDown 消息
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION, 0);
}