Темная тема на WinForms - C#
Формулировка задачи:
Народ! Есть у кого-нибудь опыт построение GUI на WinForms с тёмной темой?
Интересует GUI на WinForms со следующими контролами:
- Form
- GroupBox
- Label
- TextBox
- PropertyGrid
- MainMenu
- Button
- LinkLabel
- ComboBox
- CheckBox
- Label
- TextBox
- LinkLabel
- Бордюры окна и заголовок окна - можно ли поменять это малой кровью без сторонних тяжеловесных, тормознутых и кривых библиотек?
- Поменять цветовое оформление PropertyGrid так, что бы он не смотрелся чужеродно?
Решение задачи: «Темная тема на WinForms»
textual
Листинг программы
/// <summary>
/// Метод возвращения курсора в исходное состояние
/// </summary>
/// <param name="CursorOwner">форма, для которой изменяется курсор</param>
public static void CreateNormalCursor(Form CursorOwner)
{
try
{
if (CursorOwner.InvokeRequired)
CursorOwner.BeginInvoke(new MethodInvoker(() => CursorOwner.Cursor = Cursors.Arrow));
else
CursorOwner.Cursor = Cursors.Arrow;
}
catch { }
}
/// <summary>
/// Метод преобразования курсора в силуэт формы
/// </summary>
/// <param name="CursorOwner">форма, для которой изменяется курсор</param>
public static void CreateDragCursor(Form CursorOwner)
{
try
{
Bitmap bitmap = null;
bitmap = new Bitmap(CursorOwner.Width, CursorOwner.Height);
for (int x = 0; x < CursorOwner.Width; x++)
{
bitmap.SetPixel(x, 0, Color.Black);
bitmap.SetPixel(x, CursorOwner.Height - 1, Color.Black);
}
for (int y = 0; y < CursorOwner.Height; y++)
{
bitmap.SetPixel(0, y, Color.Black);
bitmap.SetPixel(CursorOwner.Width - 1, y, Color.Black);
}
System.Windows.Forms.Cursor nowCur = CreateCursor(bitmap, 3, 3);
if (CursorOwner.InvokeRequired)
CursorOwner.BeginInvoke(new MethodInvoker(() => CursorOwner.Cursor = nowCur));
else
CursorOwner.Cursor = nowCur;
bitmap.Dispose();
}
catch { }
}
// API структура для изменения курсора
private struct IconInfo
{
public bool fIcon;
public int xHotspot;
public int yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
// API метод для изменения курсора
[DllImport("user32.dll")]
private static extern IntPtr CreateIconIndirect(ref IconInfo icon);
// API метод для изменения курсора
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
// API метод для изменения курсора
private static System.Windows.Forms.Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
IconInfo tmp = new IconInfo();
GetIconInfo(bmp.GetHicon(), ref tmp);
tmp.xHotspot = xHotSpot;
tmp.yHotspot = yHotSpot;
tmp.fIcon = false;
return new System.Windows.Forms.Cursor(CreateIconIndirect(ref tmp));
}