窗体技巧集合

窗体技巧集(原创)

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;

多边形窗体

  1. 引用 using System.Runtime.InteropServices;

  2. 函数

    [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;
    
  3. 创建形状

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);
}
Contributors: FHL