ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-创建控件的透明部分以查看其下方的控件

2019-11-27 16:07:19  阅读:416  来源: 互联网

标签:contextmenustrip transparency c winforms


我已经修改了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();
}

标签:contextmenustrip,transparency,c,winforms
来源: https://codeday.me/bug/20191127/2075406.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有