3

Open a & ldquo; ColorDialog & rdquo; Dialog at a specified location

 2 years ago
source link: https://www.codesd.com/item/open-a-colordialog-dialog-at-a-specified-location.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Open a & ldquo; ColorDialog & rdquo; Dialog at a specified location

advertisements

Possible Duplicate:
Setting the start position for OpenFileDialog/SaveFileDialog

I've to show a ColorDialog, just above the button where the user clicked.

Currently I can't find how to specify this location:

  1. There is no StartPosition/Location properties ( How can I control the location of a dialog when using ShowDialog to display it? )
  2. The constructor only take a windows a parameter and put this in the middle

I need to place it directly above my cursor, specifying a X;Y.

Any idea about how to achieve this?

Thank you!


I finally found a way, not the prettiest thing, but it works:

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

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

    /// <summary>
    /// Sets the window pos.
    /// </summary>
    /// <param name="hWnd">The h WND.</param>
    /// <param name="hWndInsertAfter">The h WND insert after.</param>
    /// <param name="x">The x.</param>
    /// <param name="y">The y.</param>
    /// <param name="cx">The cx.</param>
    /// <param name="cy">The cy.</param>
    /// <param name="uFlags">The u flags.</param>
    /// <returns></returns>
    [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
    /// <summary>
    /// Initializes a new instance of the <see cref="ColorDialogExtension"/> class.
    /// </summary>
    /// <param name="x">The X position</param>
    /// <param name="y">The Y position</param>
    /// <param name="title">The title of the windows. If set to null(by default), the title will not be changed</param>
    public ColorDialogExtension(int x, int y, String title = null)
    {
        _x = x;
        _y = y;
        _title = title;
    }
    #endregion

    #region protected override methods
    /// <summary>
    /// Defines the common dialog box hook procedure that is overridden to add specific functionality to a common dialog box.
    /// </summary>
    /// <param name="hWnd">The handle to the dialog box window.</param>
    /// <param name="msg">The message being received.</param>
    /// <param name="wparam">Additional information about the message.</param>
    /// <param name="lparam">Additional information about the message.</param>
    /// <returns>
    /// A zero value if the default dialog box procedure processes the message; a nonzero value if the default dialog box procedure ignores the message.
    /// </returns>
    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
}




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK