Я хотел бы нарисовать несколько простых прямоугольников и текст над рамкой окна, чтобы он выглядел как Visual Studio. Можно ли это сделать, или я должен сделать окно без полей и самостоятельно управлять перемещением и изменением размера?
Обновлено: Я написал это. Но как мне теперь рисовать?
protected override void WndProc(ref Message m)
{
if (m.Msg == WndProcMsg.WM_PAINT) //0x000f
{
}
base.WndProc(ref m);
}
Стандартный путь с Vista - с DWM (в основном Двмекстендфрейминтоклиентареа) Тест на C#/Winforms, из образца MSDN: Пользовательская подпись (DirectComposition тоже можно использовать, но сложнее...)
Ссылка @Castorix на образец / код?
Я преобразовал/адаптировал код MS C++ в C# из: Пользовательская оконная рама с использованием DWM





Вместо этого вы должны обрабатывать WM_NCPAINT:
if (m.Msg == WM_NCPAINT)
{
IntPtr hdc = GetWindowDC(m.HWnd);
if ((int)hdc != 0)
{
Graphics g = Graphics.FromHdc(hdc);
.... work with graphics
ReleaseDC(m.HWnd, hdc);
}
}
с объектом Graphics вы можете выполнять все операции рисования, которые вам нужны. Насколько я помню, когда владелец рисует окно, вы можете испытывать некоторое мерцание, в таком случае вы должны рассмотреть возможность обработки WM_ERASEBACKGROUND и вернуть false.
https://docs.microsoft.com/en-us/windows/desktop/dwm/customframe отлично работает. Он был переведен на C# автором @Крис Тейлор. Скачать проект можно с его Один диск
Просто исправьте case Win32Messages.WM_NCHITTEST с помощью:
int ht = NCHitText(m);
if (callDWP)
{
callDWP = (ht == Win32Constants.HTNOWHERE);
result = new IntPtr(ht);
}
Когда я погуглил ваше название, было несколько результатов. Не могли бы вы обновить свой вопрос, какой из этих методов вы уже пробовали?