手头目前的一个项目(.Net4.0)中有这样一个需求:在程序中要进行视频采集,并且要在视频影像区域进行绘图编辑,对绘图能进行拉伸,拖拽和删除。从需求来看,必须得在视频影像区的上方盖一层画布才能这么操作了。

  首先是找视频成像控件,在网上找了一圈,找到AForge(http://www.aforgenet.com/framework/downloads.html),写了个测试代码,直接用办公用的笔记本摄像头进行视频采集,发现还不错,DevExpress也有一个视频控件,不过那个设置起来比较麻烦,而且我们也不需要用那么多附加功能,只要能够输出影像就可以。

  然后就开始折腾视频层的上一层了。一开始想法挺简单,panel不就是可以透明的吗,找了网上的一个方法,对panel进行透明设置:

BackColor=Color.Transparent

设置完成后调试,哦哟,果然是透明的,然后兴冲冲的把视频控件开启,悲剧的发现那层白花花的panel挡了,看来此法不通。

然后仔细研究了一下Winform的透明机制,控件的BackColor应该是一个“静态”属性,是在重绘的时候进行颜色的传递,达到透明的目的,其实是把Panel做成了完美的“变色龙”,而视频流应该是无法通过这种方式透传的(不知道我的理解对不对),而我们要的是一块玻璃,因此这种方式不能达到目的。

然后又开始了各种google,网上找到另一种方式的透明:控制重绘。具体参看[http://my.oschina.net/HenuToater/blog/520649]

结果还是没法把视频流透传上来。

这下抓瞎了,病急乱投医,开始尝试各种方法,而网上能找到的都是第一种方式。

后来找到一个Demo,是利用Form来做这个透明的,因为Form本身就有透明属性:Opacity,把这个属性调到1以下,就能产生透明效果。

OK,就用Form的透明吧,然后紧接着第二个问题来了,怎么盖到目标控件上面呢?

一开始也是各种瞎试,后来找到一个老司机带路

Form a = new Form();
a.Show(this); //设置a的Location

然后再监听主窗体的移动事件,基本上就可以了。

接着,我又兴高采烈的开始往下做,在这层Form上画了几个图形,惨烈的发现画出来的图形也是透明的,颜色非常淡。这个就是Form透明设置的结果吧——一透到底,上面的控件什么的都透明了,这个可不是我想要的。

继续在网上瞎几把找(Winform开发真是累),后来找到了一个商业库(DSkin),国人开发的,价格也算良心,跟作者沟通了自己遇到的问题,作者表示自己的库能解决这个问题,于是花了199大洋买了授权,(以下内容为安利DSkin)看了一下DSkin做得还算不错的,整个控件库看下来,大多是针对特效这块做的,作者对Winform应该是非常通透的。

买了授权后,开始心急火燎的写测试程序,在和作者一轮沟通交流后,顺利的解决了这个折腾我2天的东西。

代码:

GlassDraw.cs 部分

    public partial class GlassDrawer : DSkinForm
{
private Image _Backup; public GlassDrawer()
{
FormBorderStyle = FormBorderStyle.None;
BackColor = Color.Transparent;
DoubleBuffered = true;
ShowInTaskbar = false;
ShowSystemButtons = false;
DrawIcon = false;
ShowIcon = false;
EnableAnimation = false;
Text = string.Empty;
InitializeComponent();
_Backup = new Bitmap(this.Width, this.Height);
_LastLocation = Location;
} public Func<GlassDrawer,bool> MoveAssert
{
get;set;
} public void Draw(Action<Graphics> drawer)
{
try
{
Graphics g = Graphics.FromImage(_Backup);
drawer(g);
g.Dispose();
Invalidate();
}
catch(Exception e)
{ }
}
protected override void OnLayeredPaint(PaintEventArgs e)
{
if (_Backup != null)
{
e.Graphics.DrawImage(_Backup, , );
}
}
protected override void OnMove(EventArgs e)
{ base.OnMove(e);
}
private Point _LastLocation;
protected override void OnLocationChanged(EventArgs e)
{
if (MoveAssert != null)
{
if (!MoveAssert(this))
{
Location = _LastLocation;
return;
}
}
_LastLocation = Location;
base.OnLocationChanged(e);
} private Point _TargetLocation;
private Control _Target;
public void Follow(Control target)
{
if(_Target != null)
{
_Target.LocationChanged -= Target_LocationChanged;
}
_Target = target;
target.LocationChanged += Target_LocationChanged;
_TargetLocation = PointToScreen( target.Location);
} private void Target_LocationChanged(object sender, EventArgs e)
{
var p = PointToScreen(_Target.Location); }
}

Form1.cs 部分

InitializeComponent();
gd.Width = cameraFrame1.Width;
gd.Height = cameraFrame1.Height;
gd.Location = PointToScreen(cameraFrame1.Location);
gd.Text = string.Empty;
gd.MoveAssert = (g) =>
{
var srcp = PointToScreen(g.Location);
int top = srcp.Y;
int left = srcp.X;
int right = srcp.X + g.Width;
int bottom = srcp.Y + g.Height;
var targetp = PointToScreen(this.Location); if (top < targetp.Y ||
left < targetp.X ||
right > targetp.X + this.Width ||
bottom > targetp.Y + this.Height)
return false;
return true;
};
gd.Show(this);
cameraFrame1.Start();

Winform的"透明"的更多相关文章

  1. C#Winform 自定义透明按钮和单窗体模块化实现

    技术看点 WinForm自定义控件的使用 WinForm单窗体应用如何模块化 需求及效果 又来一波 C# GDI自定义控件show .这个控件已经使用几年了,最近找出来重构一下.原来是没有边框的,那么 ...

  2. XP下Winform背景透明问题

    win 7上usercontrol控件背景色设置为透明,显示无异常.到XP上一看,变成Control颜色了,即常见的灰色.网上搜了一堆,没发现有用的.偶然看到XP上Label的背景色可以透明,于是用L ...

  3. Winform下透明Panel

    网上很多写着透明Panel的方法,都是把BackColor属性设置为透明,然后指定Parent,实验了一下,对于部分情况下,是可用的,例如下层本身有自带的控件,但是,如果是用Graphic绘制的内容, ...

  4. C# WinForm设置透明

    1:通过设置窗体的 TransparencyKey实现  例:窗体中的白色会变成透明      this.BackColor =Color.White; this.TransparencyKey = ...

  5. C#:Winform技巧

    1.如何设置winform窗体透明,但是显示的内容不透明? 方法:BackColor设置:Red(任意)在窗体属性里设置一个“TransparenceKey”的属性为Red 2.如何让C#编译不安全代 ...

  6. C# Winform中如何让PictureBox的背景透明

    最近做winform程序,其中有个需求:有两个PictureBox完全重叠,上面一个需要透明,不能遮挡下面的,以为设置上面的BackColor为透明色就可以了,结果不行,上网搜了一下,发现对于我这种需 ...

  7. C# Winform实现炫酷的透明动画界面

    做过.NET Winform窗体美化的人应该都很熟悉UpdateLayeredWindow吧,UpdateLayeredWindow可以实现窗体的任意透明,效果很好,不会有毛边.不过使用这个API之后 ...

  8. C# WinForm 透明控件 PictureBox透明 分类: WinForm 2014-07-30 13:27 591人阅读 评论(0) 收藏

    1.要实现C# WinForm中的控件与背景的透明,可以通过设置控件的BackColor属性为Transparent,同时设置其父控件.因为在C#中,控件的透明指对父窗体透明.如果不设置Parent属 ...

  9. winform控件背景透明问题(label..等)

    在使用winform写界面的时候,要想label这种控件实现对背景色透明,并且也懒得每次拖动一次控件都要在后台写一遍label1.Parent=PictureBox1 那么下面方法就介绍了比较简单便捷 ...

随机推荐

  1. django -model

    Model 属性 STATUS=( (0,"正常"), (-1 ,"删除") ) Choices =STATUS  //是用户处理数据返回参数做处理 如果增加了 ...

  2. mybatis 调用存储过程

    <select id="selectGenCodeBySql" parameterType="hashmap" statementType="C ...

  3. 关于js中this关键字的补充

    前面: 前面虽然综合了网络上不少大牛的心得,但感觉还是意犹未尽,为了彻底搞清楚js中this的相关知识,决定再写一篇.个人觉得,在技术上,除非钻到细枝末节,否则很难达至非常高的水平. 补充1: 无法重 ...

  4. form 表单跨域提交

    <!DOCTYPE html><html> <head> <title>form 表单上传文件</title> <script src ...

  5. OS命令注入中的空格

    1.bash 空格可以替换为%20.%09(tab).%2b(+) in url.{IFS} 2.Win shell 空格可以替换为%20.%09(tab).%0b.%0c.%2b(+) in url

  6. Linux CentOS6.x ip设置(网卡设置)

    修改IP永久生效按以下方法vi /etc/sysconfig/network-scripts/ifcfg-eth0(eth0,第一块网卡,如果是第二块则为eth1)按如下修改ip: DEVICE=et ...

  7. C#微信公众平台接入示例代码

    http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...

  8. win10 右键菜单添加Git Hash Here

    1.通过在"运行"中输入'regedit',打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background] ...

  9. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  10. PostgreSQL

    PostgreSQL新手入门   作者: 阮一峰 日期: 2013年12月22日 自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQ ...