Winform实现窗体镂空效果

    今天找到一个名叫LICEcap的录屏软件,录制界面是这样的:

     

  这个炫酷的空心窗口就是镜头,调整好大小,然后对准需要录制的地方按下Record就可以生成gif了.

  卧槽太NB了我也要做一个!

  根据StackOverflow站的提示(在这里),我们需要使用一个在Windows2000及之后平台可用的,用以实现不规则窗体的分层窗口API (SetLayerWindowAttributes).根据百度我们先需要使用一个名为SetWindowLong的Win32 API来把窗体设定为分层窗体.

  为了在.NET平台中调用Win32 API,我们需要复习下P/Invoke的内容:

  • 1.什么是P/Invoke.

  P/Invoke 的全称是Platform Invoke,又称平台调用.是一种在托管平台下调用非托管dll中导出函数的一种调用机制.

  • 2.如何用P/Invoke.

  它长这样:

[DllImportAttribute("user32.dll", EntryPoint="SetCursorPos")]
 public static extern  bool SetCursorPos(int X, int Y) ;

  依次指明调用的dll名称,导出函数名,然后定义成C#标准的方法就行了.

  所以,我们需要: 打开百度百科,搜索API名称,查看宿主dll,抄来函数原型,按照说明定义需要的常量.

  不,懒惰如我们,通常都会找到更方便的办法:打开pinvoke.net,搜索API名称:

  

  按照里边的C#Signature复制过来,再根据Sample Code改改,就OK了.

  然后在Visual Studio里新建一个Winform项目,在主窗口代码里这样写:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.TopMost = true;
            SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
            SetLayeredWindowAttributes(this.Handle, 65280, 255, LWA_COLORKEY);
        }
        private const uint WS_EX_LAYERED = 0x80000;
        private const int GWL_EXSTYLE = -20;
        private const int LWA_COLORKEY = 1;

        [DllImport("user32", EntryPoint = "SetWindowLong")]
        private static extern uint SetWindowLong(IntPtr hwnd,int nIndex,uint dwNewLong);

        [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
        private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags);
    }

先使用SetWindowLong将窗口定义为分层窗体. 然后调用SetLayeredWindowAttributes方法设置透明.其中第二个参数crKey为一个int型的颜色值,转换方式为(int)(0xRRGGBB),本例中Dec(0x00FF00)=65280为绿色.第四个参数为透明方式,本例中使用LWA_COLORKEY = 1,表示将该窗口颜色为crKey的部分都设置为透明.因此相应地,我们需要在窗口设计器中画一个颜色为绿色的方块.本例中使用了一个PictureBox,并设置了背景颜色.

  

  然后,F5运行,效果如图:

  

  能想到的用处之一就是,包装几个不相关的外部程序为一个整体.

时间: 2024-08-14 02:07:05

Winform实现窗体镂空效果的相关文章

C# WinForm 父窗体 子窗体 传值

C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值==================1.点击Form1的button1 打开Form2  父窗体给子窗体传值 可以调用重载子窗体的构造函数 直接传入相关数值 public partial class Form1 : Form    {        public Form1()        {   

Winform跨窗体操作控件(使用委托)

Winform跨窗体操作控件是winform开发中很常见的形式,最常见且简单有效的方式便是使用委托的方式来进行操作,下面我将通过一个小实例来说明如何使用委托跨窗体实现控件操作. 实例介绍:两个窗体,Form1按钮打开Form2,然后在Form2的TextBox输入值在Form1的TextBox中显示出来. 一.项目结构 Form1窗体设计: Form2窗体设计: 二.代码实现 在Form2的代码中声明一个委托(写在Form2类外)-> public delegate void ChangeFor

winform 的窗体美化的心酸

其实一直都很懒,很想做点什么.有时会为自己的一个目标狂热,但经常发觉激情过后更多的总是为自己找借口! 我想做一位狂热的程序猿粪子! 最近感觉奔三将近.逐有感而发,不能再这样下去了. 即拿出以前自己为那狂热好一阵的东西续断下去. 一直想为自己开发一套控件库,但感觉精力确实有限,也没那么多时间,逐当初就停止了这种热情. 这是套窗体皮肤,断断续续所花费的时间也不少. 下面我介绍下我的这套皮肤,其实也算不上一套,只算是个开始吧. 有人可能会想这不就是边框隐藏再绘制客户区么,这是目前大部人会选择的方案.但

Winform子窗体刷新父窗体

调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2   f2   =   new   Form2()   ;f2.Owner   =   this;f2.ShowDialog()   ;//Form2://在需要对其调用者(父)刷新时Form1   f1   ;f1   =  

WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络

详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1.         2,添加新窗体Form2.           3,主窗体Form1中toolStripButton1的Click事件           private void toolStripButton1_Click(object sender, EventArgs e)         {          

让CSS3给你的文字加上边框宽度,并实现镂空效果

这次,我主要向大家介绍一下CSS3下的-webkit-text-stroke属性,并分享几个用该属性制作的镂空文字效果. 1.-webkit-text-stroke属性简介 CSS边框的一个不足就是只有矩形的元素才能使用.-webkit-text-stroke可以为文字添加边框.它不但可以设置文字边框的宽度,也能设置其颜色.而且,配合使用color: transparent属性,你还可以创建镂空的字体. 2.一起看几个利用-webkit-text-stroke制作的文字特效 第一个CSS代码如下

winform 常用窗体属性

WinForm常用窗体属性: Form常用属性 AutoSizeMode属性 :值是: GrowAndShrink不能调整窗体大小 :值是:GrowOnly 可以改变大小 (1)Name属性:用来获取或设置窗体的名称. (2)WindowState属性:用来获取或设置窗体的窗口状态. (3)StartPosition属性:用来获取或设置运行时窗体的起始位置. (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字. (5)Width属性:用来获取或设置窗体的宽度. (

WinForm开发,窗体显示和窗体传值相关知识总结

以前对WinForm窗体显示和窗体间传值了解不是很清楚最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法:Form.ShowDialog方法 (窗体显示为模式窗体)Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下:1.在调用Form.Show方法后,Show方法后面的代码会立即执行2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码3.当窗体显示为模式窗体时,单击"关闭"

WinForm自定义窗体

public partial class Form3 : Form { const int WM_NCHITTEST = 0x0084; const int HT_LEFT = 10; const int HT_RIGHT = 11; const int HT_TOP = 12; const int HT_TOPLEFT = 13; const int HT_TOPRIGHT = 14; const int HT_BOTTOM = 15; const int HT_BOTTOMLEFT = 16