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

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

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

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

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

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

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

Спасибо!

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
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)