2013-01-09 39 views
4

可能重複:
Setting the start position for OpenFileDialog/SaveFileDialog在指定的位置打開一個 「ColorDialog類」 對話框

我已經表現出ColorDialog類,只是當用戶點擊按鈕的上方。

目前我找不到如何指定位置:

  1. 沒有StartPosition/Location屬性(How can I control the location of a dialog when using ShowDialog to display it?
  2. 構造函數只需要一個窗口參數,並把這個中間

我需要把它直接在上面我的光標,指定X,Y。

關於如何實現這一目標的任何想法?

謝謝!

+1

不同的對話,而應該是相同的解決方案。 –

+0

@JonB:我不明白給出'IWin32Window'的可能性如何幫助我將對話框定位在正確的位置? – J4N

+0

@ J4N請參閱該問題中與代碼項目文章鏈接的答案。 http://stackoverflow.com/a/1256524/860585 – Rotem

回答

6

我終於找到了一種方法,不是最漂亮的事情,但它的工作原理:

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 
} 
-1

你不能!實際上,它既不是ColorDialog的問題,也不是另一個通用對話框。如果要顯示模式對話框,您將直接使用或不使用「DialogBox.Show」方法,在這種情況下,操作系統會決定位置。 唯一的解決方案是使用無模式對話框,並使用DialogBox.Show方法,但是您還需要重新創建整個對話框!

相關問題