我想在
Windows Forms应用程序中模拟“Web 2.0”灯箱样式UI技术.也就是说,通过在窗口的客户区域中的所有其他内容进行“调光”来提请注意一些前台控制.
明显的解决方案是创建一个简单的部分透明矩形的控件,可以将其停靠在窗口的客户端区域,并将其带到Z-Order的前面.它需要像玻璃的肮脏的疼痛,其他控制仍然可以看到(因此继续画自己).这可能吗?
我有一个很好的狩猎,并尝试了一些技巧我自己,但迄今为止没有成功.
如果不可能,还有另一种办法呢?
请参阅:http://www.useit.com/alertbox/application-design.html(在灯箱部分的屏幕截图中说明我的意思.)
你可以在.NET / C#中执行此操作吗?
是的,你当然可以,但需要一点点努力.我会推荐以下方法.创建没有边框或标题栏区域的顶级窗体,然后通过将TransparencyKey和BackColor设置为相同的值,确保它不绘制客户区域背景.所以你现在有一个没有任何东西的窗口
public class DarkenArea : Form { public DarkenArea() { FormBorderStyle = FormBorderStyle.None; SizeGripStyle = SizeGripStyle.Hide; StartPosition = FormStartPosition.Manual; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; BackColor = Color.Magenta; TransparencyKey = Color.Magenta; Opacity = 0.5f; } }
在您的窗体的客户区域创建并定位此DarkenArea窗口.然后,您需要能够显示窗口,而不需要重点,因此您将需要以下列方式调用平台来显示,而不会变为活动状态
public void ShowWithoutActivate() { // Show the window without activating it (i.e. do not take focus) PlatformInvoke.ShowWindow(this.Handle,(short)SW_SHOWNOACTIVATE); }
您需要使其实际上绘制一些东西,但不包括要保持突出显示的控件区域中的绘图.所以重写OnPaint处理程序并绘制黑色/蓝色或任何你想要的,但不包括你想要保持明亮的区域…
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // Do your painting here be exclude the area you want to be brighter }
最后你需要覆盖WndProc,以防止鼠标与窗口进行交互,如果用户尝试像点击黑色区域一样疯狂.这样的东西
protected override void WndProc(ref Message m) { if (m.Msg == (int)WM_NCHITTEST) m.Result = (IntPtr)HTTRANSPARENT; else base.WndProc(ref m); }