2012-02-17 69 views
4

我想通过左键点击移动自己的状态窗口中的任意拖动并保持在背景区,就像我们平常使用的标题栏移动创建非矩形形式。可以通过在背景区域

然后我也想我的应用程序(即,矩形窗)形式的窗口更改为我的定制设计的图形窗口。我在许多其他应用程序中看到过这种类型的窗口,所以我相信这是可能的。

回答

5

问题1:

要允许拖动它的客户区时,被移动的形式,你需要告诉窗口管理器来处理客户区就好像它是标题栏(标题区)。你在你的问题中提出了类似的建议。

这可以在.NET中通过重写表单的WndProc method,响应WM_NCHITTEST消息,并返回HTCAPTION表明,一切都应该作为标题(标题)栏的一部分进行处理来完成,而不是默认HTCLIENT, ,这表明它应该被视为表单的客户区域。下面的代码添加到您的窗体类:

private const int WM_NCHITTEST = 0x84; 
private const int HTCLIENT = 0x1; 
private const int HTCAPTION = 0x2; 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    if (m.Msg == WM_NCHITTEST) 
    { 
     // Convert HTCLIENT to HTCAPTION 
     if (m.Result.ToInt32() == HTCLIENT) 
     { 
      m.Result = (IntPtr)HTCAPTION; 
     } 
    } 
} 

问题2:

您可以通过表单的Region property设置的自定义Region创建一个任意的,非矩形形状的一种形式你的选择。如果您有像Photoshop这样的图形程序的经验,您可以将其视为为表单设置“裁剪区域”:窗口管理器不会在您指定的边界之外绘制任何内容。描述此形状的像素甚至可以是不连续的。

创建区域的最简单方法可能是使用GraphicsPath class,然后使用接受单个GraphicsPath对象作为参数的constructor for the Region class

而且我假设你已经知道了,给定第一个问题,你必须将FormBorderStyle property设置为None,以确保窗口管理器绘制的默认边框消失。

不幸的是,这些区域不能反锯齿。有关这些限制的更多详细信息,请参阅Hans's answer to this question

最后,值得注意的是,后一种方法来创建非矩形形式可以产生完全不提高产品的可用性,像这样一些彻头彻尾的丑陋的用户界面:

Windows Media Player "alien head"

请谨慎使用此技巧并运用良好的判断力。如果有疑问,矩形对于窗户来说实际上是一个非常好的形状。

+0

谢谢科迪你的回答对我来说非常有用。我已经应用了这个,但是我的背景变为禁用了。有什么办法可以让我为背景同时举办两个活动吗? – Prince123 2012-02-17 04:03:44

+0

你应该知道使用WM_NCHITTEST和HTCAPTION会产生副作用。例如:双击表单将使其最大化。 – AVIDeveloper 2012-02-17 08:43:34

+0

我可以通过禁用MaximizeBox来解决这个问题。但是,如何解决它受到影响的情况。 – Prince123 2012-02-17 16:00:38

1

这里有令人印象深刻的CodeProject上的文章,这将回答这两个问题你一个链接:An Alpha Channel Composited Windows Form with Designer Support。该实现使用前后窗组合。 它使用WS_EX_LAYERED来显示一个基于位图的窗口,并将鼠标事件挂钩到主窗体以允许拖动它。

一两件事,看起来有点假时被周围拖动窗口 - 有前窗和后窗的运动之间有一个小的延迟,使它们看起来像他们互相追逐。

接下来的这个CodeProject上的文章显示了一种方法通过使用DeferWindowPos来解决这一问题:Alpha Blended Windows Forms

祝你好运!