Je vyžadována podpora jazyka JavaScript
Některé stránky na tomto webu vyžadují podporu jazyka JavaScript. Váš webový prohlížeč jazyk JavaScript nepodporuje nebo jazyk JavaScript není povolen.
Chcete-li zjistit, zda webový prohlížeč podporuje jazyk JavaScript nebo jazyk JavaScript chcete povolit, přečtěte si nápovědu k vašemu webovému prohlížeči.
DialogWindow.cs
Download fileToto je zdrojový kód souboru DialogWindow.cs
Base class for WPF modal dialogs. Adds ControlBox, ShowIcon
using System;
using System.Windows;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using System.ComponentModel;
using System.Windows.Media;
namespace IMP.Windows.Controls
{
/// <summary>
/// Window for modal dialogs
/// </summary>
public class DialogWindow : Window
{
#region constants
private const string cFakeIcon = @"AAABAAEAEBACAAAAAACwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAgAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////";
#endregion
#region Win32 API
private const Int32 GWL_STYLE = -16;
private const Int32 GWL_EXSTYLE = -20;
private const UInt32 WS_MAXIMIZEBOX = 0x10000;
private const UInt32 WS_MINIMIZEBOX = 0x20000;
private const UInt32 WS_SYSMENU = 0x80000;
private const UInt32 WS_EX_DLGMODALFRAME = 0x1;
private const UInt32 WS_EX_WINDOWEDGE = 0x100;
private static readonly IntPtr HWND_TOP = new IntPtr(0);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 SWP_NOZORDER = 0x0004;
private const UInt32 SWP_NOACTIVATE = 0x0010;
private const UInt32 SWP_FRAMECHANGED = 0x0020; /* The frame changed: send WM_NCCALCSIZE */
[DllImport("user32.dll")]
private extern static UInt32 SetWindowLong(IntPtr hWnd, Int32 nIndex, UInt32 dwNewLong);
[DllImport("user32.dll")]
private extern static UInt32 GetWindowLong(IntPtr hWnd, Int32 nIndex);
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern IntPtr DefWindowProc(IntPtr hWnd, int uMsg, IntPtr wParam, IntPtr lParam);
private const int WM_NCHITTEST = 0x0084;
#endregion
#region member varible and default property initialization
private ResizeMode originalResizeMode = ResizeMode.NoResize;
private MessageBoxResult m_DialogResult;
#endregion
#region constructors and destructors
/// <summary>
/// DialogWindow constructor
/// </summary>
public DialogWindow()
{
this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
this.ShowInTaskbar = false;
this.ResizeMode = ResizeMode.NoResize;
SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
this.UseLayoutRounding = true;
this.Loaded += new RoutedEventHandler(DialogWindow_Loaded);
}
#endregion
#region action methods
/// <summary>
/// Opens the dialog window and returns <see cref="DialogResult"/> after dialog is closed.
/// </summary>
/// <returns>A MessageBoxResult value that specifies which dialog box button is clicked by the user.</returns>
public new MessageBoxResult ShowDialog()
{
return ShowDialog(null);
}
/// <summary>
/// Opens the dialog window and returns <see cref="DialogResult"/> after dialog is closed.
/// </summary>
/// <param name="Owner">The System.Windows.Window that owns this DialogWindow.</param>
/// <returns>A MessageBoxResult value that specifies which dialog box button is clicked by the user.</returns>
public MessageBoxResult ShowDialog(Window Owner)
{
if (Owner != null)
{
this.Owner = Owner;
}
if (this.Owner == null)
{
if (Application.Current != null)
{
this.Owner = Application.Current.MainWindow;
}
}
if (double.IsNaN(this.Height))
{
if (double.IsNaN(this.Width))
{
this.SizeToContent = SizeToContent.WidthAndHeight;
}
else
{
this.SizeToContent = SizeToContent.Height;
}
}
else if (double.IsNaN(this.Width))
{
this.SizeToContent = SizeToContent.Width;
}
base.ShowDialog();
return this.DialogResult;
}
/// <summary>
/// Opens the dialog window and returns <see cref="DialogResult"/> after dialog is closed.
/// </summary>
/// <param name="OwnerHandle">The IntPtr Handle of window that owns this DialogWindow.</param>
/// <returns>A MessageBoxResult value that specifies which dialog box button is clicked by the user.</returns>
public MessageBoxResult ShowDialog(IntPtr OwnerHandle)
{
if (OwnerHandle != IntPtr.Zero)
{
var helper = new WindowInteropHelper(this);
helper.Owner = OwnerHandle;
}
if (double.IsNaN(this.Height))
{
if (double.IsNaN(this.Width))
{
this.SizeToContent = SizeToContent.WidthAndHeight;
}
else
{
this.SizeToContent = SizeToContent.Height;
}
}
else if (double.IsNaN(this.Width))
{
this.SizeToContent = SizeToContent.Width;
}
base.ShowDialog();
return this.DialogResult;
}
#endregion
#region property getters/setters
/// <summary>
/// A MessageBoxResult value that specifies which dialog box button is clicked by the user.
/// </summary>
public new MessageBoxResult DialogResult
{
get { return m_DialogResult; }
set
{
m_DialogResult = value;
//Close the window and return from ShowDialog() call
base.DialogResult = true;
}
}
/// <summary>
/// ControlBox dependency property
/// </summary>
public static readonly DependencyProperty ControlBoxProperty = DependencyProperty.Register("ControlBox", typeof(bool), typeof(DialogWindow), new PropertyMetadata(true));
/// <summary>
/// Gets or sets a value indicating whether a control box is displayed in the caption bar of the window.
/// </summary>
/// <remarks>
/// Hides dialog Icon, Minimize, Maximize and Close buttons in the caption bar.
/// </remarks>
[DefaultValue(true)]
public bool ControlBox
{
get { return (bool)GetValue(ControlBoxProperty); }
set { SetValue(ControlBoxProperty, value); }
}
/// <summary>
/// ShowIcon dependency property
/// </summary>
public static readonly DependencyProperty ShowIconProperty = DependencyProperty.Register("ShowIcon", typeof(bool), typeof(DialogWindow), new PropertyMetadata(false));
/// <summary>
/// Gets or sets a value indicating whether an icon is displayed in the caption bar of the window.
/// </summary>
[DefaultValue(false)]
public bool ShowIcon
{
get { return (bool)GetValue(ShowIconProperty); }
set { SetValue(ShowIconProperty, value); }
}
#endregion
#region private member functions
private void DialogWindow_Loaded(object sender, RoutedEventArgs e)
{
IntPtr hWnd = new WindowInteropHelper(this).Handle;
var source = HwndSource.FromHwnd(hWnd);
source.AddHook(new HwndSourceHook(DialogWindow_WndProc));
originalResizeMode = this.ResizeMode;
if (originalResizeMode == System.Windows.ResizeMode.NoResize || originalResizeMode == System.Windows.ResizeMode.CanMinimize)
{
this.ResizeMode = ResizeMode.CanResize;
}
UInt32 windowStyleex = GetWindowLong(hWnd, GWL_EXSTYLE);
windowStyleex |= WS_EX_DLGMODALFRAME; //Hide dialog icon if icon is not set (Fixed Dialog style)
SetWindowLong(hWnd, GWL_EXSTYLE, windowStyleex);
if (this.ResizeMode == ResizeMode.CanResize || this.ResizeMode == ResizeMode.CanResizeWithGrip || !this.ControlBox)
{
UInt32 windowStyle = GetWindowLong(hWnd, GWL_STYLE);
//Disable Minimize and Maximize buttons
if (this.ResizeMode == ResizeMode.CanResize || this.ResizeMode == ResizeMode.CanResizeWithGrip)
{
if (originalResizeMode == System.Windows.ResizeMode.CanMinimize)
{
windowStyle = windowStyle & ~WS_MAXIMIZEBOX;
}
else
{
windowStyle = windowStyle & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX;
}
}
//Set ControlBox (hides dialog Icon, Minimize, Maximize and Close buttons)
if (!this.ControlBox)
{
windowStyle = windowStyle & ~WS_SYSMENU;
}
SetWindowLong(hWnd, GWL_STYLE, windowStyle);
}
SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
if (!this.ShowIcon)
{
if (this.Icon == null)
{
//Fix hide dialog icon - Set dummy icon and then clear icon
var fakeIconData = new System.IO.MemoryStream(Convert.FromBase64String(cFakeIcon));
this.Icon = System.Windows.Media.Imaging.BitmapFrame.Create(fakeIconData);
this.Icon = null;
}
//Hide icon
SendMessage(hWnd, 0x80, 0, 0);
SendMessage(hWnd, 0x80, 1, 0);
}
}
private IntPtr DialogWindow_WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
const int HTCLIENT = 0x0001;
const int HTSIZE = 4; //Size box (same as HTGROWBOX)
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOP = 12;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 16;
const int HTBOTTOMRIGHT = 17;
const int HTBORDER = 18;
if (msg == WM_NCHITTEST && originalResizeMode != ResizeMode.CanResize && originalResizeMode != ResizeMode.CanResizeWithGrip)
{
//Disable sizing
int result = DefWindowProc(hwnd, WM_NCHITTEST, wParam, lParam).ToInt32();
if (result == HTSIZE || result == HTLEFT || result == HTRIGHT || result == HTTOP || result == HTTOPLEFT ||
result == HTTOPRIGHT || result == HTBOTTOM || result == HTBOTTOMLEFT || result == HTBOTTOMRIGHT || result == HTBORDER)
{
handled = true;
return new IntPtr(HTCLIENT); //Use this result to tell Windows to handle that point of your form like client Area
}
}
return IntPtr.Zero;
}
#endregion
}
}