- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在制作一个测试程序,看看我可以将事件添加到自定义绘制的 System.Windows.Form.Control 对象中的效果如何。如果我在这方面做得很好,那么我可以为以后做一些更高级的东西。
我遇到的问题与所附图片有关。我有意地画了两个圆圈彼此靠近。目标是让一个圆圈与另一个圆圈重叠。为了这个测试程序的目的,我不关心哪个圆重叠哪个。但是,我确实关心角落。
上图显示中心圆被左圆掩埋,但左圆也在绘制角并用它们覆盖中心圆。我希望隐藏那些角落,或者至少让它们透明。我确实读过有一种方法可以make a control transparent ,但出于某种原因,在 BackColor 上使用 Color.Transparent 会给我黑色,而不是与油漆面板的颜色相匹配。
下面是GUI的代码部分(不包括设计器,但关键部分应该很明显)。
namespace PaintingFirstAttempt
{
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BtnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void BtnClear_Click(object sender, EventArgs e)
{
Graphics g1 = this.paintPanel.CreateGraphics();
g1.Clear(this.paintPanel.BackColor);
g1.Dispose();
}
private void PaintPanel_MouseDown(object sender, MouseEventArgs e)
{
this.paintPanel.Controls.Add(new EventableCircle { Location = new Point(e.X - 16, e.Y - 16), Size = new Size(32, 32) });
}
}
}
下面是自定义圈子。
namespace PaintingFirstAttempt
{
using System;
using System.Drawing;
using System.Windows.Forms;
public class EventableCircle : Control
{
public EventableCircle()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
// this.BackColor = Color.Transparent;
}
private static SolidBrush fillColor = new SolidBrush(Color.Red);
protected override void OnClick(EventArgs e)
{
MessageBox.Show("TODO: Bring up a combo box on right click.");
}
private void DrawCircle(Pen pen)
{
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, 32, 32);
g.FillEllipse(fillColor, 0, 0, 32, 32);
g.DrawEllipse(pen, 0, 0, 32, 32);
g.Dispose();
}
protected override void OnPaint(PaintEventArgs e)
{
this.DrawCircle(Pens.Black);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this.DrawCircle(Pens.Blue);
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this.DrawCircle(Pens.Black);
}
}
}
考虑到这些信息,我该如何让圆角不显示,或者找到解决这个问题的方法?
最佳答案
OK 只需放入一个主窗体 form1,不需要任何代码。这是用户控件的代码,在窗体上绘制 3 或 4,以便它们向右移动时可以重叠。
然后点击它们!效率低下,但宝宝哭了我得走了,这比自己制作保留对象编辑器要好!
Public Class linectl
Public Sub DrawMe(ByVal g As Graphics, ByVal otherctl As Control)
Dim where As New Rectangle(otherctl.Left - Left, otherctl.Top - Top, otherctl.Width - 1, otherctl.Height - 1)
g.FillEllipse(Brushes.Red, where)
g.DrawEllipse(Pens.Black, where)
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaintBackground(e)
DrawMe(e.Graphics, Me)
drawneighbors()
End Sub
Private Sub linectl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Me.Left += 10
End Sub
Private Sub linectl_MoveResize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move, Me.Resize
If Parent IsNot Nothing Then
For Each c In From ctl In Parent.Controls Where TypeOf ctl Is linectl Select CType(ctl, linectl)
Using g = c.CreateGraphics
g.Clear(c.BackColor)
c.DrawMe(g, c)
c.drawneighbors()
End Using
Next
End If
End Sub
Public Sub drawneighbors()
If Parent IsNot Nothing Then
Dim ctls = (From ctl In Parent.Controls Where TypeOf ctl Is linectl Let c = CType(ctl, linectl) _
Select New With {.ctl = c, _
.rect = New Rectangle(c.Left, c.Top, c.Width, c.Height)}).ToArray.Reverse
For Each ctl In ctls
Dim ctl_unclosed = ctl
For Each ictl In (From c In ctls Where ctl_unclosed.rect.IntersectsWith(c.rect))
Using g = ictl.ctl.CreateGraphics
ictl.ctl.DrawMe(g, Me)
End Using
Using g = Me.CreateGraphics
Me.DrawMe(g, ictl.ctl)
End Using
Next
Next
End If
End Sub
End Class
关于c# - Windows 窗体 : What's the right way to allow overlapping Controls?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048714/
我第一次决定切换到 InnoDB 并尝试使用外键和其他 InnoDB 功能。 创建关系时,我应该只在一张表上声明它们吗?还是两个表? 例如,对于以下每种情况,您将在何处以及如何声明关系? 1 用户有很
老方法 当我以前在需要内容被搜索引擎索引的项目中异步加载页面时,我使用了一种非常简单的技术,那就是 Page $('#example').click(function(){
我目前正在为自己创建自己的自定义应用程序来编译 Java 文件。我的应用程序可以完美地编译 Java 文件,但现在我想开始为 Java 文件添加某种类型的测试(例如,我将一些变量传递给许多不同的文件
我需要建立从我的 iPhone 应用程序到客户服务器的 HTTPS 双向 SSL 连接。但是我没有看到任何安全的方式来将客户端证书传递给应用程序(这是一个电子银行应用程序,所以安全性确实是一个问题)。
我从事 Java 工作已经很长时间了,大约 6 个月前开始使用 Scala。我喜欢这门语言。我发现的一件事是,做事有多种方法。我不知道这是因为该语言的性质,还是因为它还很年轻并且在不断发展,习惯用法和
这是我所指的示例代码。 https://sites.google.com/site/ssljavaguide/example-code/2-way-ssl 我是否可以不设置与 keystore 相关的
我读过有关使用 MySQL AES_ENCRYPT/AES_DECRYPT(双向加密)不如使用 PHP - hash()(单向加密)安全的信息。 http://bytes.com/topic/php/
我正在进行一个路线选择项目,我需要使用道路类型和单向/双向交通信息填充道路网络。我想知道Tiger/Line道路数据集是否包含这样的数据。。我下载了加利福尼亚州的Tiger/Line道路数据集,但没有
我需要开发一个 iPad 应用程序,它应该管理两种方向模式(横向和纵向)。 根据 official Apple iOS documentation , 有 2 种方法可以继续。 -第一个包括在收到旋转
我正在训练一个 randomForest 模型,目的是保存它以进行预测(它将被下载并在外部上下文中使用)。我希望这个模型尽可能最小。 我读到有很多options和 packages减少模型的内存大小。
为什么将参数传递给匿名函数会影响结果?例如,下面的脚本将 a1 显示为 function(),将 a2 显示为数组。 var a1=(function(){return [1*2,2*2,3*2];}
我有一个 Python 列表: listx = [["a", 127, "Blue", 0], ["b", 127, "Red", 1], ["b", 127, "
在查看 Java 库时,特别是构造函数,我注意到字段通常会出于某种原因进行初始化和验证: public java.awt.Color(int r, int g, int b, int a) {
我想编写 Git 脚本。只创建一个 Unix 脚本是最好的方法吗? #!/bin/bashgit push origin master &&git checkout develop &&git mer
这个问题在这里已经有了答案: class or method alias in java (8 个回答) 去年关闭。 我有一个类的名称可能不必要地繁琐,其中包含许多我在其他地方使用的静态方法。 而不是
这个问题在这里已经有了答案: Best way to check function arguments? [closed] (14 个回答) Parameter validation, Best pr
在阅读我遇到的代码时,结构的以下定义和初始化: // header file struct foo{ char* name; int value; }; //Implementation file s
我正在使用多页表单方法在 Drupal 中开发一个自定义模块,并且我希望对步骤进行可视化。 步骤 1 > [_Step_2_] > 步骤 3 > 完成 商业规则: 他们总是能看到所有的步骤,以及他们现
Josh 的 answer 给我留下了深刻的印象关于客户端的“Angular 方式”和声明式风格。 但是你能帮我理解一下,怎么做吗: 我有一个单页应用程序,左侧是菜单栏,右侧是 div 容器。 当用户
Subversion 商店正在考虑改用 Mercurial,试图提前弄清楚开发人员的所有提示将是什么。这里有一个相当常见的用例,我不知道如何处理。 我正在研究一些较大的功能,我有一个重要的代码部分——
我是一名优秀的程序员,十分优秀!