Я пытаюсь создать окно WPF с WindowStyle="None"
(для пользовательских кнопок и без заголовка), размер которого нельзя изменить.Установка ResizeMode
в NoResize
удаляет аэродинамику, которую я хочу сохранить.
Я мог бы установить свойства минимального / максимального размера и покончить с этим, за исключением того, что:
- Курсоры изменения размера все еще видны, и
- Окноотображается в ответ на действие пользователя и соответствует его содержанию.Он отображает изображение, поэтому размер меняется.
Итак, у меня есть простая схема, которая помогает мне на 99% пути:
public class BorderedWindowNoResize : Window
{
[DllImport( "DwmApi.dll" )]
public static extern int DwmExtendFrameIntoClientArea(
IntPtr hwnd,
ref MARGINS pMarInset );
[DllImport( "user32.dll", CharSet = CharSet.Auto )]
public static extern IntPtr DefWindowProc(
IntPtr hWnd,
int msg,
IntPtr wParam,
IntPtr lParam );
public BorderedWindowNoResize()
{
Loaded += BorderedWindowNoResize_Loaded;
}
private void BorderedWindowNoResize_Loaded( object sender, RoutedEventArgs e )
{
IntPtr mainWindowPtr = new WindowInteropHelper( this ).Handle;
HwndSource mainWindowSrc = HwndSource.FromHwnd( mainWindowPtr );
mainWindowSrc.AddHook( WndProc );
}
private IntPtr WndProc( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )
{
var htLocation = DefWindowProc( hwnd, msg, wParam, lParam ).ToInt32();
if( msg == (uint)WM.NCHITTEST )
{
handled = true;
switch( htLocation )
{
case (int)HitTestResult.HTBOTTOM:
case (int)HitTestResult.HTBOTTOMLEFT:
case (int)HitTestResult.HTBOTTOMRIGHT:
case (int)HitTestResult.HTLEFT:
case (int)HitTestResult.HTRIGHT:
case (int)HitTestResult.HTTOP:
case (int)HitTestResult.HTTOPLEFT:
case (int)HitTestResult.HTTOPRIGHT:
htLocation = (int)HitTestResult.HTBORDER;
break;
}
}
return new IntPtr( htLocation );
}
}
В основном;
- Переопределить процедуру окна.
- Вызвать процедуру окна по умолчанию.
- Если сообщение
WM_NCHITTEST
, проверьте результаты для границы. - Если это граница, верните обычное значение
HTBORDER
.
Этоработает так, чтобы позволить мне сохранить границу аэроокна и скрыть курсор (и) изменения размера, но добавляет белую рамку ~ 5 пикселей внутрь моего окна.
На самом деле, даже если я возвращаю результат процедуры Windows по умолчанию вверху WndPrc
и ничего не делаю, граница там все еще .Мне нужен другой цвет фона для моего окна, так что это не сработает для меня.
Есть идеи?Заранее спасибо как всегда.