2014-11-01 74 views
1

c#中是否存在任何类型的窗口,窗体或任何看起来不像通常的窗体或对话框并且可以包含标签之类的组件的东西?像这张图片上的黑色矩形:如何创建非矩形窗体?

enter image description here

我还需要一个“窗口”是可移动就像当你在ControlBox,但在它的任何地方按住鼠标点击的形式。然而,它(或者至少它的背景)应该在某些层次上具有透明度等特性(高,中,低透明度)。

我应该使用什么?

谢谢。

+2

表单无国界? – Mephy 2014-11-01 21:45:02

+0

这是一个工具提示 – 2014-11-01 21:49:25

+2

您可以修改WinForms表单的外观以查看所需的内容。从技术上讲,这与C#完全无关。你需要明确你在问什么框架,Winforms或WPF? – 2014-11-01 21:50:39

回答

2

如果您需要完整的Form级别的功能,则可以通过FormBorderStyle = None来创建Form。这将从窗体中移除整个边框,并且它将显示为一个扁平的矩形,并带有背景颜色。

有几个问题与此:

  1. 用户将不能移动它,除非实现某种形式的点击处理程序,以允许拖动屏幕周围。
  2. 用户将不得不使用任务栏(假设您已经在那里看到它)或Alt-F4关闭窗口。

根据你关于如何解决#2的问题,有一个关于How to drag a borderless Windows Form by mouse的SO页面。如果它被很快删除,我会重现乔伊的代码(基于链接的文章):

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

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

编辑:这个问题的标题被改变了,因为它最初发布 - 原来,这个问题基本上没有致力于如何创建一个非矩形形式,更多的是如何创建一个无国界形式 - 但问题的非矩形边界部分现在由Olivier Jacot-Descombes解决。我不会偷他的贡献,但这两个答案的组合应该给你你想要的东西。

+0

我怎么能实现第二点?我只是一个初学者(只是一个学生)。 – Drumnbass 2014-11-01 22:05:09

+0

@Drumnbass添加了一些可能适合你的代码。如果它帮助你,请不要忘记检查这是你选择的答案。 – furkle 2014-11-01 22:30:32

+0

说实话,我几乎不懂任何代码(为什么需要导入dll,什么是(或代表)这些常量),但它绝对有效。我真的很想理解它(我根本不是一个顺从者),但我认为你已经做了足够的工作来帮助我,只有当你有时间,知识并且能够通过简单的方式向我解释我会非常感谢它; D – Drumnbass 2014-11-01 22:45:08

3

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

enter image description here

然后,设置形式的FormBorderStyleNone并设置TransparencyKey到具有要在该位图(Color.Red在本例中)的透明的颜色。而已!

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

请注意,由于您没有标题栏(因为FormBorderStyle = None),您将无法使用关闭按钮关闭窗体,并通过拖动标题来移动窗口酒吧。你将不得不通过处理鼠标或键盘事件来处理这些事情。

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