如何创建非矩形表格?

时间:2014-11-01 21:36:08

标签: c# winforms

c#中是否存在任何类型的窗口,表单或任何看起来不像通常的表单或对话框且可以包含标签等组件的内容?像这张照片上的黑色矩形:

enter image description here

我还需要这个"窗口"当您单击ControlBox但是在任何位置按住鼠标时,可以像表单一样移动。但是,它(或至少它的背景)在某些层面(高,中,低透明度)应具有透明度等属性。

我应该使用什么?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过将Form属性设置为适当的位图,在WinForms BackgroundImage中实现此目的。 E.g:

enter image description here

然后,将表单的FormBorderStyle设置为None,并将TransparencyKey设置为位图中必须透明的颜色(本例中为Color.Red)。就是这样!

您将无法拥有部分透明的区域;但是,您可以设置表单的整体Opacity(= 100% - 透明度)。

另请注意,由于您没有标题栏(因为FormBorderStyle = None),您将无法使用关闭按钮关闭表单并且通过拖动标题栏移动窗口。您必须通过处理鼠标或键事件来自行处理这些事情。

当然,您可以像往常一样在此表单上放置任何类型的控件。

答案 1 :(得分:2)

如果您需要完整的表单级功能,您可以解决此问题的一种方法是使用FormBorderStyle = None创建一个表单。这将从表单中删除整个边框,它只会显示为一个扁平的矩形,其中包含您放置的任何背景颜色。

这有几个问题:

  1. 除非您实施某种点击处理程序以允许在屏幕上拖动它,否则用户将无法移动它。
  2. 用户必须使用任务栏(假设您已将其保留在那里)或Alt-F4以关闭窗口。
  3. 根据您关于如何解决#2的问题,How to drag a borderless Windows Form by mouse上有一个SO页面。如果它很快被删除,我将重现Joey的代码(基于链接的文章):

    // DllImportAttribute requires reference to System.Runtime.InteropServices
    
    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;
    
    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();
    
    public Form1()
    {
        InitializeComponent();
    }
    
    private void Form1_MouseDown_1(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }
    }
    

    请注意,我没有做任何事情来测试这个,只是将其粘贴并验证,是的,您可以使用鼠标在其内容区域中拖动您的表单。另请注意,此拖动操作仅适用于窗体的空白区域 - 如果鼠标位于窗体的某个控件上,则无法拖动它。

    编辑:问题的标题自最初发布以来就已更改 - 最初,问题主要不是如何创建非矩形表单以及有关如何创建<的更多信息em> borderless 形式 - 但现在问题的非矩形边界部分由Olivier Jacot-Descombes解决。我不会窃取他的贡献,但这两个答案的组合应该能给你你想要的东西。