gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:22:16 25 4
gpt4 key购买 nike

我修改了 SuperContextMenuStrip在 CodeProject 找到,可以满足我的一些项目需求。我将它用作 GMap.NET Map Control 上 map 标记的工具提示.这是它的外观示例:

enter image description here

我想做的是让它看起来更像一个气泡,让它变得漂亮一点。类似于旧的 Google map 样式工具提示:

enter image description here

我花了一些时间搜索控件透明度,我知道这不是一件容易的事。 This SO question in particular illustrates that.

我考虑过覆盖 SuperContextMenuStripOnPaint 方法来绘制 SuperContextMenuStrip 下的 GMap.NET 控件的背景,但如果标记悬卡在 GMap.NET 控件之外,即使那样也会失败:

enter image description here

创建我正在寻找的透明度类型的正确方法是什么?

最佳答案

在 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);
}

然后您可以将控件的区域设置为 CreateRegion 方法返回的区域。

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# - 创建控件的透明部分以查看其下方的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12581578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com