/// <summary> /// If the properties have once been set, only change the important variables. /// </summary> /// <param name="Menu_Text_Array"></param> /// <param name="Window_Position_X"></param> /// <param name="Window_Position_Y"></param> /// <param name="DirectX_Graphics_Device"></param> /// <param name="Drawing_Properties"></param> /// <param name="Sonic_Heroes_Overlay"></param> public static Menu_Base.DirectX_2D_Overlay_Properties Adjust_Menu_Width(string[] Menu_Text_Array, float Window_Position_X, float Window_Position_Y, WindowRenderTarget DirectX_Graphics_Device, Form Windows_Forms_Fake_Transparent_Overlay, Menu_Base.DirectX_2D_Overlay_Properties Current_Drawing_Properties) { try { // Obtain TextLayout in order to obtain text width and height properties. SharpDX.DirectWrite.TextLayout[] All_Text_Layouts = new SharpDX.DirectWrite.TextLayout[Menu_Text_Array.Length]; // Get all text layout info for (int x = 0; x < Menu_Text_Array.Length; x++) { All_Text_Layouts[x] = new TextLayout(new SharpDX.DirectWrite.Factory(), Menu_Text_Array[x], DirectX_2D_Overlay_Properties.Text_Font_DirectX, float.PositiveInfinity, float.PositiveInfinity); } // Obtain Largest Width and Height float Rectangle_Background_Width = All_Text_Layouts[0].Metrics.Width; for (int x = 1; x < All_Text_Layouts.Length; x++) { if (All_Text_Layouts[x].Metrics.Width > Rectangle_Background_Width) { Rectangle_Background_Width = All_Text_Layouts[x].Metrics.Width; } } // Make Rectangle Bigger (Styling) Rectangle_Background_Width += (Current_Drawing_Properties.Line_Spacing * 2); // Obtain X position across the form for the selected location of item. int Window_Position_X_Local = (int)(((Windows_Forms_Fake_Transparent_Overlay.Width / 100.0F) * Window_Position_X)); // Get horizontal location of rectangle int Rectangle_Location_X = Window_Position_X_Local - (int)(Rectangle_Background_Width / 2.0F); // If the right edge will escape the screen, make sure it does not. if ((Rectangle_Background_Width + Rectangle_Location_X) > Windows_Forms_Fake_Transparent_Overlay.Width) { int Menu_Overflow_Pixels = ((int)Rectangle_Background_Width + Rectangle_Location_X) - Windows_Forms_Fake_Transparent_Overlay.Width; // Get the amount of pixels rectangle escapes of screen. Rectangle_Location_X = Rectangle_Location_X - Menu_Overflow_Pixels; // Move the rectangle by the overflow amount. } // Check for top and left edges of overlay if they escape the view. if (Rectangle_Location_X < 0) { Rectangle_Location_X = 0; } // Define Background Rectangle Current_Drawing_Properties.Rectangle_Menu_DirectX.X = Rectangle_Location_X; Current_Drawing_Properties.Rectangle_Menu_DirectX.Width = (int)Rectangle_Background_Width; Current_Drawing_Properties.Rectangle_Title_DirectX.X = Rectangle_Location_X; Current_Drawing_Properties.Rectangle_Title_DirectX.Width = (int)Rectangle_Background_Width; return(Current_Drawing_Properties); } catch (Exception Ex) { Program.Sonic_Heroes_Networking_Client.SendData_Alternate(Message_Type.Client_Call_Send_Message, Encoding.ASCII.GetBytes("[Debug] Tweakbox | " + Ex.Message + " | " + Ex.StackTrace + " | If you see this, you should report this back to me."), false); return(new Menu_Base.DirectX_2D_Overlay_Properties()); } }
/// <summary> /// Accepts a list of strings/text to be drawn, a set of Window Positions, output device & overlay for test drawing and drawing properties. /// </summary> /// <param name="Menu_Text_Array"></param> /// <param name="Window_Position_X"></param> /// <param name="Window_Position_Y"></param> /// <param name="DirectX_Graphics_Device"></param> /// <param name="Drawing_Properties"></param> /// <param name="Sonic_Heroes_Overlay"></param> public static Menu_Base.DirectX_2D_Overlay_Properties Get_Menu_Size_Location(string[] Menu_Text_Array, float Window_Position_X, float Window_Position_Y, WindowRenderTarget DirectX_Graphics_Device, Form Windows_Forms_Fake_Transparent_Overlay) { try { // Drawing Properties Menu_Base.DirectX_2D_Overlay_Properties Drawing_Properties = new Menu_Base.DirectX_2D_Overlay_Properties(); // Set-up UI Scaling such as that the interface scales alongside the resolution used. float Standard_Resolution_Height = 720; // I write and test my stuff on 1280 x 720. int Standard_Font_Size = 18; // Standard font size to be used for display. int Title_Font_Size = 24; // Standard font size to be used for display. float Window_Scale_Overlay = (float)Windows_Forms_Fake_Transparent_Overlay.Height / (float)Standard_Resolution_Height; // Get scaling factor. Standard_Font_Size = (int)(Standard_Font_Size * Window_Scale_Overlay); // Adjust Font Size. Title_Font_Size = (int)(Title_Font_Size * Window_Scale_Overlay); // Adjust Font Size. // Set Brushes and Fonts. DirectX_2D_Overlay_Properties.Text_Font_DirectX = new SharpDX.DirectWrite.TextFormat(new SharpDX.DirectWrite.Factory(), "Consolas", Standard_Font_Size); DirectX_2D_Overlay_Properties.Title_Font_DirectX = new SharpDX.DirectWrite.TextFormat(new SharpDX.DirectWrite.Factory(), "Consolas", Title_Font_Size); DirectX_2D_Overlay_Properties.Title_Font_DirectX.ParagraphAlignment = ParagraphAlignment.Center; DirectX_2D_Overlay_Properties.Title_Font_DirectX.TextAlignment = TextAlignment.Center; DirectX_2D_Overlay_Properties.Text_Font_DirectX.TextAlignment = TextAlignment.Center; DirectX_2D_Overlay_Properties.Drawing_Brush_DirectX = new SharpDX.Direct2D1.SolidColorBrush(DirectX_Graphics_Device, new SharpDX.Mathematics.Interop.RawColor4(255, 255, 255, 180)); DirectX_2D_Overlay_Properties.Title_Brush_DirectX = new SharpDX.Direct2D1.SolidColorBrush(DirectX_Graphics_Device, new SharpDX.Mathematics.Interop.RawColor4(0.78F, 0.78F, 0.78F, 180)); DirectX_2D_Overlay_Properties.Background_Brush_DirectX = new SharpDX.Direct2D1.SolidColorBrush(DirectX_Graphics_Device, new SharpDX.Mathematics.Interop.RawColor4(0.109F, 0.109F, 0.109F, 150)); DirectX_2D_Overlay_Properties.Background_Brush_DirectX.Opacity = 0.8F; // Alpha value is ignored! Use Opacity for Transparency! // Obtain TextLayout in order to obtain text width and height properties. SharpDX.DirectWrite.TextLayout[] All_Text_Layouts = new SharpDX.DirectWrite.TextLayout[Menu_Text_Array.Length]; // Get all text layout info for (int x = 0; x < Menu_Text_Array.Length; x++) { All_Text_Layouts[x] = new TextLayout(new SharpDX.DirectWrite.Factory(), Menu_Text_Array[x], DirectX_2D_Overlay_Properties.Text_Font_DirectX, float.PositiveInfinity, float.PositiveInfinity); } // Calculate Line Height & Spacing (20% of line height). Drawing_Properties.Line_Height = All_Text_Layouts[0].Metrics.Height; Drawing_Properties.Line_Spacing = (All_Text_Layouts[0].Metrics.Height / 100.0F) * 20.0F; Drawing_Properties.Title_Height = All_Text_Layouts[0].Metrics.Height; Drawing_Properties.Title_Spacing = (All_Text_Layouts[0].Metrics.Height / 100.0F) * 20.0F; // Get Title Rectangle Properties float Title_Rectangle_Height = Drawing_Properties.Title_Height + Drawing_Properties.Title_Spacing * 2; // Obtain Largest Width and Height float Rectangle_Background_Width = All_Text_Layouts[0].Metrics.Width; for (int x = 1; x < All_Text_Layouts.Length; x++) { if (All_Text_Layouts[x].Metrics.Width > Rectangle_Background_Width) { Rectangle_Background_Width = All_Text_Layouts[x].Metrics.Width; } } // Get Height of Rectangle float Rectangle_Background_Height = (Drawing_Properties.Line_Spacing * 2.0F); for (int x = 0; x < All_Text_Layouts.Length; x++) { Rectangle_Background_Height += All_Text_Layouts[x].Metrics.Height; } // Make Rectangle Bigger (Styling) Rectangle_Background_Width += (Drawing_Properties.Line_Spacing * 2); // Obtain X and Y position across the form for the selected location of item. int Window_Position_X_Local = (int)(((Windows_Forms_Fake_Transparent_Overlay.Width / 100.0F) * Window_Position_X)); int Window_Position_Y_Local = (int)(((Windows_Forms_Fake_Transparent_Overlay.Height / 100.0F) * Window_Position_Y)); // Get center location of Rectangle & Size // X is left edge. // Y is right edge. Point Rectangle_Location = new Point(Window_Position_X_Local - (int)(Rectangle_Background_Width / 2.0F), Window_Position_Y_Local - (int)(Rectangle_Background_Height / 2.0F)); Size Rectangle_Size = new Size((int)(Rectangle_Background_Width), (int)(Rectangle_Background_Height)); // Ensure Rectangle doesn't escape screen space. // If the right edge will escape the screen, make sure it does not. if ((Rectangle_Size.Width + Rectangle_Location.X) > Windows_Forms_Fake_Transparent_Overlay.Width) { int Menu_Overflow_Pixels = (Rectangle_Size.Width + Rectangle_Location.X) - Windows_Forms_Fake_Transparent_Overlay.Width; // Get the amount of pixels rectangle escapes of screen. Rectangle_Location.X = Rectangle_Location.X - Menu_Overflow_Pixels; // Move the rectangle by the overflow amount. } // If the bottom edge will escape the screen, make sure it does not. if ((Rectangle_Size.Height + Rectangle_Location.Y) > Windows_Forms_Fake_Transparent_Overlay.Height) { int Menu_Overflow_Pixels = (Rectangle_Size.Height + Rectangle_Location.Y) - Windows_Forms_Fake_Transparent_Overlay.Height; // Get the amount of pixels rectangle escapes of screen. Rectangle_Location.Y = Rectangle_Location.Y - Menu_Overflow_Pixels; // Move the rectangle by the overflow amount. } // Check for top and left edges of overlay if they escape the view. if (Rectangle_Location.X < 0) { Rectangle_Location.X = 0; } if (Rectangle_Location.Y < 0) { Rectangle_Location.Y = 0; } // Define Background Rectangle Drawing_Properties.Rectangle_Menu_DirectX = new Rectangle(Rectangle_Location.X, Rectangle_Location.Y, Rectangle_Size.Width, Rectangle_Size.Height); // Define Title Rectangle Drawing_Properties.Rectangle_Title_DirectX = new Rectangle(Rectangle_Location.X, Rectangle_Location.Y - (int)(Title_Rectangle_Height), Rectangle_Size.Width, (int)(Title_Rectangle_Height)); // Load the Current Mod Loader Configurator Theme. var Theme_Style_Tuple = SonicHeroes.Misc.SonicHeroes_Miscallenous.Load_Theme_Configurator(); float Title_R = (Convert.ToSingle(Theme_Style_Tuple.Item2.R) / 255.0F); float Title_G = (Convert.ToSingle(Theme_Style_Tuple.Item2.G) / 255.0F); float Title_B = (Convert.ToSingle(Theme_Style_Tuple.Item2.B) / 255.0F); float Accent_R = (Convert.ToSingle(Theme_Style_Tuple.Item3.R) / 255.0F); float Accent_G = (Convert.ToSingle(Theme_Style_Tuple.Item3.G) / 255.0F); float Accent_B = (Convert.ToSingle(Theme_Style_Tuple.Item3.B) / 255.0F); DirectX_2D_Overlay_Properties.Highlight_Brush_DirectX = new SolidColorBrush(DirectX_Graphics_Device, new RawColor4(Accent_R, Accent_G, Accent_B, 255)); DirectX_2D_Overlay_Properties.Title_Background_Brush_DirectX = new SharpDX.Direct2D1.SolidColorBrush(DirectX_Graphics_Device, new SharpDX.Mathematics.Interop.RawColor4(Title_R, Title_G, Title_B, 255)); DirectX_2D_Overlay_Properties.Title_Background_Brush_DirectX.Opacity = 0.80F; return(Drawing_Properties); } catch (Exception Ex) { Program.Sonic_Heroes_Networking_Client.SendData_Alternate(Message_Type.Client_Call_Send_Message, Encoding.ASCII.GetBytes("[Debug] Tweakbox | " + Ex.Message + " | " + Ex.StackTrace + " | If you see this, you should report this back to me."), false); return(new Menu_Base.DirectX_2D_Overlay_Properties()); } // Return properties. return(new Menu_Base.DirectX_2D_Overlay_Properties()); }