Eu tenho um complemento ArcGIS 10 ArcMap escrito em C # .NET 3.5 que implementa um ESRI.ArcGIS.Desktop.AddIns.DockableWindow
(que também herda de UserControl
) e um ESRI.ArcGIS.Desktop.AddIns.Tool
que, quando clicado no mapa, atualiza a janela encaixável.
Eu gostaria de trazer a janela encaixável para a frente da ordem Z no OnMouseDown()
método da ferramenta (quando estiver no modo desencaixado). Atualmente, se o usuário abrir outra janela acoplável, colocá-la em cima da minha e clicar com a ferramenta, a janela será atualizada, mas não será trazida para a frente. Já estou ligando IDockableWindow.Show(true)
para garantir que a janela fique visível depois de clicar com a ferramenta. Eu também tentei, UserControl.BringToFront()
mas não tem nenhum efeito.
A melhor solução que eu tenho atualmente é chamar IDockableWindow.Show(false)
seguido por IDockableWindow.Show(true)
, no entanto, isso não é ideal, pois é chocante fazer a janela desaparecer e reaparecer, além de precisar repintar completamente, o que leva uma quantidade substancial de tempo.
A janela interna do Identify não possui esse problema e é trazida para o topo toda vez que a ferramenta Identify é usada, portanto, claramente há uma maneira de fazer isso.
Alguém sabe de uma solução melhor para isso? Obrigado!
Edit: Aqui está o código que acabei usando para resolver isso. Obrigado Kirk e Petr!
public static void BringDockableWindowToFront(IDockableWindow dockableWindow, IntPtr dockableWindowControlHandle)
/// <summary>
/// Workaround for bringing a dockable window to the top of the Z order.
/// dockableWindowControlHandle is the Handle property of the UserControl implemented by the dockable window
/// </summary>
{
IWindowPosition windowPos = dockableWindow as IWindowPosition;
IntPtr parentHwnd = GetParent(dockableWindowControlHandle); // Get parent window handle
switch (windowPos.State)
{
case esriWindowState.esriWSFloating:
IntPtr grandParentHwnd = GetParent(parentHwnd); // Get grandparent window handle
SetActiveWindow(grandParentHwnd); // Activate grandparent window when in floating (undocked) mode
break;
//case esriWindowState.esriWSMaximize: // Mode not yet implemented in ArcGIS 10, check at 10.1
//case esriWindowState.esriWSMinimize: // Mode not yet implemented in ArcGIS 10, check at 10.1
case esriWindowState.esriWSNormal:
SetActiveWindow(parentHwnd); // Activate parent window when in normal (docked) mode
break;
}
SetFocus(dockableWindowControlHandle); // Set keyboard focus to the dockable window
}
// Retrieves a handle to the specified window's parent or owner.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetParent(IntPtr hWnd);
// Sets the keyboard focus to the specified window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetFocus(IntPtr hWnd);
// Activates a window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);
fonte
Respostas:
Tente usar a chamada winapi SetWindowPos com o hWnd do controle de janela encaixável (ou talvez seja o controle de contêiner pai ou avô) com o sinalizador HWND_TOP.
fonte