я использую встроенную Windows 7, и для экономии производительности я изменяю визуальные стили с Windows 7 Basic на Windows Classic.
на котором я запускаю WinForms, примененный с пользовательским индикатором выполнения. ошибка на линии Rectangle.Inflate (x, y);
На основной теме Windows 7 все хорошо, но после того, как я переключаю на Windows Classic, я получаю вышеупомянутую ошибку. Не можете найти информацию об этом, есть ли что-нибудь вокруг этого?
это мой пользовательский элемент управления
public class CustomProgressBar : ProgressBar
{
//Property to set to decide whether to print a % or Text
public ProgressBarDisplayText DisplayStyle { get; set; }
//Property to hold the custom text
public String CustomText { get; set; }
public CustomProgressBar()
{
// Modify the ControlStyles flags -> OptimizedDoubleBuffer to avoid flickering text
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
}
protected override void OnPaint(PaintEventArgs e)
{
Rectangle rect = ClientRectangle;
Graphics g = e.Graphics;
ProgressBarRenderer.DrawHorizontalBar(g, rect);
rect.Inflate(-3, -3); //here im getting the error
if (Value > 0)
{
// As we doing this ourselves we need to draw the chunks on the progress bar
Rectangle clip = new Rectangle(rect.X, rect.Y, (int)Math.Round(((float)Value / Maximum) * rect.Width), rect.Height);
ProgressBarRenderer.DrawHorizontalChunks(g, clip);
}
// Set the Display text (Either a % amount or our custom text
string text = DisplayStyle == ProgressBarDisplayText.Percentage ? Value.ToString() + '%' : CustomText;
using (Font f = new Font(FontFamily.GenericSerif, 14))
{
SizeF len = g.MeasureString(text, f);
// Calculate the location of the text (the middle of progress bar)
// Point location = new Point(Convert.ToInt32((rect.Width / 2) - (len.Width / 2)), Convert.ToInt32((rect.Height / 2) - (len.Height / 2)));
Point location = new Point(Convert.ToInt32((Width / 2) - len.Width / 2), Convert.ToInt32((Height / 2) - len.Height / 2));
// The commented-out code will centre the text into the highlighted area only. This will centre the text regardless of the highlighted area.
// Draw the custom text
g.DrawString(text, f, Brushes.Red, location);
}
}
}
это моя трассировка стека
System.InvalidOperationException: Visual Styles-related operation resulted in an error because no visual style is currently active.
at System.Windows.Forms.VisualStyles.VisualStyleRenderer.IsCombinationDefined(String className, Int32 part)
at System.Windows.Forms.VisualStyles.VisualStyleRenderer..ctor(String className, Int32 part, Int32 state)
at System.Windows.Forms.ProgressBarRenderer.InitializeRenderer(VisualStyleElement element)
at System.Windows.Forms.ProgressBarRenderer.DrawHorizontalBar(Graphics g, Rectangle bounds)
at YonatanDataReader2.CustomProgressBar.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Редактировать
по какой-то причине на компьютере моего клиента, даже если визуальные стили проверены, и он использует тему Windows 7 Aero, я все еще получаю вышеупомянутую ошибку, я также попытался установить Application.SetCompatibleTextRenderingDefault(true);
, который также не помог