138 lines
3.7 KiB
C#
138 lines
3.7 KiB
C#
using System;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Use as a popup container for DotNetBar objects.
|
|
/// </summary>
|
|
[System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false),System.Runtime.InteropServices.ComVisible(false)]
|
|
public class PopupContainer:Control
|
|
{
|
|
const int WM_MOUSEACTIVATE = 0x21;
|
|
const int MA_NOACTIVATE = 3;
|
|
const int MA_NOACTIVATEANDEAT = 4;
|
|
const uint WS_POPUP=0x80000000;
|
|
const uint WS_CLIPSIBLINGS=0x04000000;
|
|
const uint WS_CLIPCHILDREN=0x02000000;
|
|
const int WS_EX_TOPMOST=0x00000008;
|
|
const int WS_EX_TOOLWINDOW=0x00000080;
|
|
|
|
private PopupShadow m_DropShadow=null;
|
|
private bool m_ShowDropShadow=false;
|
|
|
|
const int SHADOW_OFFSET=5;
|
|
|
|
public PopupContainer()
|
|
{
|
|
this.IsAccessible=false;
|
|
this.SetStyle(ControlStyles.Selectable,false);
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if(m_DropShadow!=null)
|
|
{
|
|
m_DropShadow.Hide();
|
|
m_DropShadow.Dispose();
|
|
m_DropShadow=null;
|
|
}
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
private MenuPanel HostedMenu
|
|
{
|
|
get
|
|
{
|
|
if(this.Controls.Count>0 && this.Controls[0] is MenuPanel)
|
|
return this.Controls[0] as MenuPanel;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private Bar HostedBar
|
|
{
|
|
get
|
|
{
|
|
if(this.Controls.Count>0 && this.Controls[0] is Bar)
|
|
return this.Controls[0] as Bar;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
protected override void OnVisibleChanged(EventArgs e)
|
|
{
|
|
base.OnVisibleChanged(e);
|
|
if(!this.Visible && m_DropShadow!=null)
|
|
{
|
|
m_DropShadow.Hide();
|
|
m_DropShadow.Dispose();
|
|
m_DropShadow=null;
|
|
}
|
|
}
|
|
|
|
protected override CreateParams CreateParams
|
|
{
|
|
get
|
|
{
|
|
CreateParams p=base.CreateParams;
|
|
p.Style=unchecked((int)(WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
|
|
// Moving to Tool Window only because of Windows 8 and UIAccess=true causing menu not to show
|
|
// Enforcing TopMost in ShowShadow();
|
|
p.ExStyle = WS_EX_TOOLWINDOW; // (int)(WS_EX_TOPMOST | WS_EX_TOOLWINDOW);
|
|
p.Caption=""; // Setting caption would show window under tasks in Windows Task Manager
|
|
return p;
|
|
}
|
|
}
|
|
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
if(m.Msg==WM_MOUSEACTIVATE)
|
|
{
|
|
m.Result=new System.IntPtr(MA_NOACTIVATE);
|
|
return;
|
|
}
|
|
base.WndProc(ref m);
|
|
}
|
|
|
|
public void ShowShadow()
|
|
{
|
|
NativeFunctions.SetWindowPos(this.Handle, new IntPtr(NativeFunctions.HWND_TOPMOST), 0, 0, 0, 0,
|
|
NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE | NativeFunctions.SWP_NOSIZE);
|
|
if(m_ShowDropShadow)
|
|
{
|
|
if(m_DropShadow!=null)
|
|
{
|
|
m_DropShadow.Hide();
|
|
m_DropShadow.Dispose();
|
|
m_DropShadow = null;
|
|
}
|
|
|
|
if (this.Width > 5 && this.Height > 5)
|
|
{
|
|
m_DropShadow = new PopupShadow(true);
|
|
m_DropShadow.CreateControl();
|
|
NativeFunctions.SetWindowPos(m_DropShadow.Handle, new IntPtr(NativeFunctions.HWND_NOTOPMOST), this.Left + SHADOW_OFFSET, this.Top + SHADOW_OFFSET, this.Width - 2, this.Height - 2, NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
|
|
m_DropShadow.UpdateShadow();
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool ShowDropShadow
|
|
{
|
|
get {return m_ShowDropShadow;}
|
|
set {m_ShowDropShadow=value;}
|
|
}
|
|
|
|
protected override void OnResize(EventArgs e)
|
|
{
|
|
if(m_DropShadow!=null)
|
|
{
|
|
NativeFunctions.SetWindowPos(m_DropShadow.Handle,new IntPtr(NativeFunctions.HWND_NOTOPMOST),this.Left+SHADOW_OFFSET,this.Top+SHADOW_OFFSET,this.Width-2,this.Height-2,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
|
|
m_DropShadow.UpdateShadow();
|
|
}
|
|
base.OnResize(e);
|
|
}
|
|
}
|
|
}
|