c#-创建控件的透明部分以查看其下方的控件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-创建控件的透明部分以查看其下方的控件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2166字,纯文字阅读大概需要4分钟。
内容图文
![c#-创建控件的透明部分以查看其下方的控件](/upload/InfoBanner/zyjiaocheng/657/b7e517038a0f45ada5bff666393472b6.jpg)
我已经修改了CodeProject上的SuperContextMenuStrip,以满足我的某些项目需求.我将其用作GMap.NET Map Control上地图标记的工具提示.以下是其外观示例:
我想做的是通过使它看起来更像气泡来稍微改善一下.类似于旧的Google Maps样式工具提示:
我花了一些时间在控件透明度上进行搜索,我知道这不是一件容易的事. This SO question in particular illustrates that.
我已经考虑过重写SuperContextMenuStrip的OnPaint方法来绘制SuperContextMenuStrip下方的GMap.NET控件的背景,但是即使在标记悬垂于GMap.NET控件的情况下,该操作也会失败:
创建我要寻找的透明度类型的正确方法是什么?
解决方法:
在Windows窗体中,可以通过定义区域来实现透明(或绘制形状不规则的窗口).引用MSDN
The window region is a collection of pixels within the window where
the operating system permits drawing.
在您的情况下,您应该有一个位图,它将用作遮罩.位图应至少具有两种不同的颜色.这些颜色之一应表示要透明的控件部分.
然后,您将创建一个如下所示的区域:
// this code assumes that the pixel 0, 0 (the pixel at the top, left corner)
// of the bitmap passed contains the color you wish to make transparent.
private static Region CreateRegion(Bitmap maskImage) {
Color mask = maskImage.GetPixel(0, 0);
GraphicsPath grapicsPath = new GraphicsPath();
for (int x = 0; x < maskImage.Width; x++) {
for (int y = 0; y < maskImage.Height; y++) {
if (!maskImage.GetPixel(x, y).Equals(mask)) {
grapicsPath.AddRectangle(new Rectangle(x, y, 1, 1));
}
}
}
return new Region(grapicsPath);
}
然后,您可以将控件的Region设置为CreateRegion方法返回的Region.
this.Region = CreateRegion(YourMaskBitmap);
删除透明度:
this.Region = new Region();
从上面的代码中可以看出,创建区域在资源上是昂贵的.我建议将区域保存在变量中,如果您需要多次使用它们.如果您以这种方式使用缓存的区域,很快就会遇到另一个问题.该分配将在第一次运行,但在随后的调用中您将获得ObjectDisposedException.
对refrector进行的一些调查将发现Region属性的set访问器中的以下代码:
this.Properties.SetObject(PropRegion, value);
if (region != null)
{
region.Dispose();
}
使用后将销毁Region对象!
幸运的是,Region是可克隆的,并且保留Region对象所需要做的就是分配一个克隆:
private Region _myRegion = null;
private void SomeMethod() {
_myRegion = CreateRegion(YourMaskBitmap);
}
private void SomeOtherMethod() {
this.Region = _myRegion.Clone();
}
内容总结
以上是互联网集市为您收集整理的c#-创建控件的透明部分以查看其下方的控件全部内容,希望文章能够帮你解决c#-创建控件的透明部分以查看其下方的控件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。