C# 自定义形状窗体控件

C# 自定义形状窗体控件,c#,winforms,pixel,shapes,C#,Winforms,Pixel,Shapes,我对C#知之甚少,我正在尝试制作一个WinForms应用程序来创建8x8像素的单色位图。我希望用户界面如下所示: 在这里,每一个黑色边框代表一个像素,只要用户点击其中一个,它就会被黑色填充,这样就可以设置一个“像素” 我寻找了一种将标准按钮控件转换为自定义形状的方法,但找不到一种优雅的方法。如果可能的话,我不想以编程方式创建这些黑盒。我如何创建类似于切换按钮的黑盒 注意:我使用图形设计工具和VisualStudio创建了示例图片,它不是来自真实的应用程序。这是我想要实现的目标。在最终应用程序中

我对C#知之甚少,我正在尝试制作一个WinForms应用程序来创建8x8像素的单色位图。我希望用户界面如下所示:

在这里,每一个黑色边框代表一个像素,只要用户点击其中一个,它就会被黑色填充,这样就可以设置一个“像素”

我寻找了一种将标准按钮控件转换为自定义形状的方法,但找不到一种优雅的方法。如果可能的话,我不想以编程方式创建这些黑盒。我如何创建类似于切换按钮的黑盒


注意:我使用图形设计工具和VisualStudio创建了示例图片,它不是来自真实的应用程序。这是我想要实现的目标。在最终应用程序中,将有其他表单元素控制创建的位图。

这可以通过标准按钮完成。您需要将按钮的
FlatStyle
属性设置为
Flat
,清空
文本
属性,并添加
单击
事件。然后,可以将每个按钮的单击事件映射到以下方法:

private void Pixel_Click(object sender, EventArgs e)
{
  ((Button)sender).BackColor = ((Button)sender).BackColor == Color.Black
    ? Color.White
    : Color.Black;
}

可以在IDE中轻松调整按钮的大小,使其成为方形。您还可以在IDE中将初始颜色设置为白色或黑色。

您希望使用
复选框
控件。 您需要以下属性(不用担心,可以在属性网格中设置它,它只显示实际的属性和值):


然后在checkedchanged事件中,只需更改背景图像。复选框允许两种状态,您可以很好地使用
Checked
属性来了解更容易处理的状态,即有一个按钮并为每个按钮存储一个值。

首先我创建了一个按钮。
在按钮的属性中设置以下内容:

FlatStyle = Flat  
FlatAppearance => BorderColor = Black  
FlatAppearance => BorderSize = 4
然后复制并创建63个按钮,并像图片一样排列。

对于每个按钮,创建一个单击事件,并且您喜欢下面的代码,以便单击时背景色变为黑色。如果背景已为黑色,则会将其设置回白色

private void button1_Click(object sender, EventArgs e)
{
    if (button1.BackColor == Color.Black)
    {
        button1.BackColor = Color.White;
    }
    else
    {
        button1.BackColor = Color.Black;
    }
}

让我们忽略正方形之间的灰点。这看起来像一个定义矩形的简单类。一个
bool Selected
Color BorderColor
Color FillColor
属性,带有一个管理器类,该类处理
列表
,定义间距大小,并在
矩形时切换
所选
值。在
鼠标上包含(点)
。单击事件。容器的
Paint
/
OnPaint
事件可以将
e.Graphics
对象传递给管理器类,管理器类在当前状态下绘制所有矩形。一旦您有了自定义Cals或image复选框,您就可以通过编程将它们放入2d数组中,以便轻松获得x,y坐标您应该将
像素的所有显示更改为
((按钮)发送者)。
发送者将是按钮本身,如果他创建了许多按钮,他可以将此事件映射到所有按钮,而不是每个按钮都写一个。@Franck谢谢,我已经更新了答案以包含该按钮。这正是我要寻找的答案。看起来很简单,但因为我是C#上的noob,所以很难找到。谢谢
private void button1_Click(object sender, EventArgs e)
{
    if (button1.BackColor == Color.Black)
    {
        button1.BackColor = Color.White;
    }
    else
    {
        button1.BackColor = Color.Black;
    }
}