Откройте диалог "ColorDialog" в указанном местоположении

Возможный Дубликат:
Урегулирование положения начала для OpenFileDialog/SaveFileDialog

Я должен показать ColorDialog, чуть выше кнопки где пользователь, по которому щелкают.

В настоящее время я не могу найти, как определить это местоположение:

  1. Там не StartPosition / Местоположение свойства ( Как я могу управлять местоположением диалога, используя ShowDialog, чтобы показать его? )
  2. конструктор только берет окна параметр и поместил это в середине

Я должен поместить его непосредственно выше моего курсора, определив X; Y.

Какая-либо идея о том, как достигнуть этого?

Спасибо!

4
добавлено отредактировано
Просмотры: 4
nl ja de
@JonB: Я don' t понимают, как возможность предоставления IWin32Window поможет мне поместить диалог в правильное место?
добавлено автор J4N, источник
Различный диалог, но должно быть то же самое решение.
добавлено автор Jon B, источник
@J4N Видят ответ в том вопросе, который связывается с codeproject статьей. stackoverflow.com/a/1256524/860585
добавлено автор Rotem, источник
@J4N - Диалог - окно. Урегулирование положения окна приведет к тому, что вы хотите сделать.
добавлено автор Security Hound, источник

2 ответы

Я наконец нашел путь, не самую симпатичную вещь, но она работает:

public class ColorDialogExtension : ColorDialog
{
    #region private const
    //Windows Message Constants
    private const Int32 WM_INITDIALOG = 0x0110;

    //uFlag Constants
    private const uint SWP_NOSIZE = 0x0001;
    private const uint SWP_SHOWWINDOW = 0x0040;
    private const uint SWP_NOZORDER = 0x0004;
    private const uint UFLAGS = SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW;
    #endregion

    #region private readonly
    //Windows Handle Constants
    private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    private static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
    private static readonly IntPtr HWND_TOP = new IntPtr(0);
    private static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
    #endregion

    #region private vars
    //Module vars
    private int _x;
    private int _y;
    private string _title = null;
    #endregion

    #region private static methods imports
    //WinAPI definitions

    /// 
/// Sets the window text. ///
 
    /// 
The h WND.
    /// 
The text.
    /// 
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool SetWindowText(IntPtr hWnd, string text);

    /// 
/// Sets the window pos. ///
 
    /// 
The h WND.
    /// 
The h WND insert after.
    /// 
The x.
    /// 
The y.
    /// 
The cx.
    /// 
The cy.
    /// 
The u flags.
    /// 
    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
    #endregion

    #region public constructor
    /// 
/// Initializes a new instance of the class. ///
 
    /// 
The X position
    /// 
The Y position
    /// 
The title of the windows. If set to null(by default), the title will not be changed
    public ColorDialogExtension(int x, int y, String title = null)
    {
        _x = x;
        _y = y;
        _title = title;
    }
    #endregion

    #region protected override methods
    /// 
/// Defines the common dialog box hook procedure that is overridden to add specific functionality to a common dialog box. ///
 
    /// 
The handle to the dialog box window.
    /// 
The message being received.
    /// 
Additional information about the message.
    /// 
Additional information about the message.
    /// 
    /// A zero value if the default dialog box procedure processes the message; a nonzero value if the default dialog box procedure ignores the message.
    /// 
    protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
    {
        //We do the base initialization
        IntPtr hookProc = base.HookProc(hWnd, msg, wparam, lparam);
        //When we init the dialog
        if (msg == WM_INITDIALOG)
        {
            //We change the title
            if (!String.IsNullOrEmpty(_title))
            {
                SetWindowText(hWnd, _title);
            }
            //We move the position
            SetWindowPos(hWnd, HWND_TOP, _x, _y, 0, 0, UFLAGS); 

        }
        return hookProc;
    }
    #endregion
}
6
добавлено

Вы не можете! На самом деле это ни проблема ColorDialog, ни другой Стандартный диалог. Если вы захотите показать модальный диалог bon, вы будете использовать непосредственно или не "DialogBox. Покажите" метод, и в этом случае, Операционная система решает положения. Единственное решение состоит в том, чтобы использовать немодальное Диалоговое окно, и использовать DialogBox. Покажите метод, но также необходимо воссоздать целый dialogBox!

1
добавлено