Я пытаюсь создать индивидуальную оконную раму для своей формы с помощью DWM. Платформа - C # WinForms, Pinvoking DWM.
Следуя статье MSDN о создании пользовательских оконной рамы с DWM, основные шаги следующие:
- Удалить стандартный фрейм (неклиентская область), возвращая 0 в ответ на сообщение WM_NCCALCSIZE
- Расширьте фрейм в клиентскую область с помощью функции DwmExtendFrameIntoClientArea
Я обрабатываю сообщение WM_NCCALCSIZE следующим образом:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCCALCSIZE:
if (isDwmWindowFramePaintEnabled() && m.WParam != IntPtr.Zero)
{
m.Result = IntPtr.Zero;
}
else
{
base.WndProc(ref m);
}
return;
}
}
Согласно документации MSDN по WM_NCCALCSIZE < / а>,
Когда wParam имеет значение TRUE, простой возврат 0 без обработки прямоугольников NCCALCSIZE_PARAMS приведет к изменению размера клиентской области до размера окна, включая рамку окна. Это удалит рамку окна и элементы заголовка из вашего окна, оставив отображаемую только клиентскую область.
У меня все нормально, работает, кроме одной проблемы. Когда я увеличиваю / восстанавливаю окно, оно всегда немного увеличивается при восстановлении. Думаю, проблема примерно такая:
- Когда окно восстанавливается, оно содержит только клиентскую область
- Windows пытается предоставить окну неклиентскую область
- В WM_NCCALCSIZE клиентская область увеличивается, чтобы содержать неклиентскую область
Итак, как будто это окно немного увеличивается каждый раз, когда я увеличиваю / восстанавливаю его. Мне нужно удалить неклиентскую область, чтобы нарисовать рамку нестандартной формы с помощью DWM. Я не могу просто установить для стиля границы окна значение «Нет», поскольку тогда DWM не будет рисовать заголовок и границы окна.
Пожалуйста, помогите решить проблему и с радостью сделайте нестандартную оконную раму.