• 0

[C#] Is it possible to override the Form class?


Question

Sorry, forgot to say in the topic title that this is C#.

Let me explain what I want to do...

We all know that with Windows Vista brought a new UI font, Segoe UI, but XP still uses Tahoma as UI font. This doesn't help us programmers. I've searched in Google and what I found was to use SystemFonts.MessageBoxFont as the Form's font because all other controls Font properties will inherit from it.

Now, I could do this.font = SystemFonts.MessageBoxFont; before InitializeComponent(); on every single form I use but that will have 2 problems:

1) I'll have to repeat this line for every form.

2) The designer will not be updated accordingly.

If I moved this.font = SystemFonts.MessageBoxFont; into InitializeComponent() itself, then, the designer would be updated but I still would need to do it manually for every form.

My first solution:

Create a class (MyForm, for instance) that inherits from Form and change the properties I need in it's constructor. Then, every form I use in my application must be inherited from MyForm instead of Form. This is simpler than to place the line above in every InitializeComponent(), although, I still have to manually change every from to inherit from MyForm instead of Form.

To sum this up... I'm looking for a way (if possible) to change some default properties of Form without creating a new class that inherits from it, which allows me to make all the needed properties changes in one place and all my forms will still inherit from Form (as they are by default).

Is this possible?

Edited by Nazgulled

15 answers to this question

Recommended Posts

  • 0

What he means is create a class with static methods that you use to create instances of your forms:

public static class FormFactory
{
	public static TForm CreateForm<TForm>() where TForm : Form
	{
		TForm form = Activator.CreateInstance<TForm>();
		form.Font = SystemFonts.MessageBoxFont;

		return form;
	}
}

and then you would use it as such:

Form1 myForm = FormFactory.CreateForm<Form1>();

  • 0

Thanks for the suggestion and the whole code but that's almost like that I'm doing now... It's a different way of doing what I want but it's basically the same thing, what I mean is, I'll still need to manually create an instance for every form.

I may be looking for something that doesn't exist or it's not possible, but that's why I'm asking cause one doesn't know everything ;).

  • 0
  Nazgulled said:
Thanks for the suggestion and the whole code but that's almost like that I'm doing now... It's a different way of doing what I want but it's basically the same thing, what I mean is, I'll still need to manually create an instance for every form.

I may be looking for something that doesn't exist or it's not possible, but that's why I'm asking cause one doesn't know everything ;) .

  Quote
To sum this up... I'm looking for a way (if possible) to change some default properties of Form without creating a new class that inherits from it, which allows me to make all the needed properties changes in one place and all my forms will still inherit from Form (as they are by default).

Is this possible?

I'm confused... The method Antaris illustrated allows you to modify all your forms in one place, and have them all keep Form as their base. I don't know what else you're expecting it to do.

  • 0

Nazgulled, I think you might be getting confused with what is actually going on with your Form types.

Although the designer allows you to (as its name suggests) design the form, the form is still instantiated manually in code, its just that the program generates the code to do so. The factory method I illustrated could be used with your designed forms too. Just change the line of code that usually says:

Application.Run(new Form1());

which is generally found in the generated Program.cs, to this:

Application.Run(FormFactory.CreateForm<Form1>;());

All you are doing is using the factory method to apply any property changes ahead of the instance being returned. It doesn't matter if you use the designer, the Form is still being declared manually.

  • 0

But your method is not very different from my own (inheriting from a sub classed form) and that's not what I was looking for...

If I have 100 forms I'll have to do 100 modifications either using your method or mine and that's what I was looking to avoid... I was looking for a one time global change only, if there was one...

What I'm saying is, using my method, I'll have to inherit all my forms from the sub classed form. Using your method, I'll have to use the FormFactory for every form but there are the type of things I was looking to avoid.

Maybe that's not possible at all, but like I said, I don't know everything, so I just asked...

  • 0

Well, if thats the way you want to do it, do the following:

public class SubclassedForm : System.Windows.Forms.Form
{
	protected override void OnLoad(EventArgs e)
	{		
		base.OnLoad(e);
		this.Font = SystemFonts.MessageBoxFont;
	}
}

What you are doing is subclassing the form and overriding the OnLoad method (this is not the OnLoad event, but the method that will call any event subscribers). What will happen, is that any class that inherits from SubclassedForm will call the OnLoad method (unless the inheriting form overrides the OnLoad method itself, in which case it will need to make a call to base.OnLoad(e)).

To be honest, my personal preference is to go with the Factory pattern, as I believe it is much more flexible.

  • 0

You misunderstood the point... I already knew how to do it with inheritance but that's not what I want. Both solutions force me to do lots of code changes (depending on the number of forms) but that's not what I want. I was looking for a way to do one time change only, without needing to change their base class or how they are initialized.

Like I said, I'm probably looking for something that's not possible so just forget about it. Cause I don't know how to explain myself better than this.

Thanks for all your time guys.

  • 0

Its not that I misunderstood the point, the fact is there isn't a one time change. The Form type is sealed. The Designer type is sealed. VS uses that designer to generate code. It won't automatically set the font, because this is inherited from the base classes. You either need to inherit from the Form type, or follow the factory pattern and set your properties in the one place.

  • 0
  Nazgulled said:
You misunderstood the point... I already knew how to do it with inheritance but that's not what I want. Both solutions force me to do lots of code changes (depending on the number of forms) but that's not what I want. I was looking for a way to do one time change only, without needing to change their base class or how they are initialized.

Like I said, I'm probably looking for something that's not possible so just forget about it. Cause I don't know how to explain myself better than this.

Thanks for all your time guys.

If you have a refactoring tool, like Resharper, you should be able to accomplish the changes pretty easily, but I understand your apprehension. It's a lot of work manually, and a lot of regressions that could be introduced.

Good luck. :)

  • 0
  Antaris said:
Its not that I misunderstood the point, the fact is there isn't a one time change. The Form type is sealed. The Designer type is sealed. VS uses that designer to generate code. It won't automatically set the font, because this is inherited from the base classes. You either need to inherit from the Form type, or follow the factory pattern and set your properties in the one place.

That's exactly what I was asking :)

If that's how things works, I'm ok with it, I just wanted to know if it was or it wasn't possible.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • >For instance, if you are watching a tutorial, you could ask for a summary or even for a quiz on the main points. At that point, the content creator should get their cut, Google. Instead: >If people are getting everything they need from a summary without ever clicking through, there's not much reason to watch the actual video. That means fewer views, less watch time, and less money. Do content creators get to write their own summaries or turn off Google's summary content thievery? Somehow I doubt it...
    • I know with my isp they will only support certain models. You might want to check with them,
    • Steam Summer Sale 2025 is here offering weeks of massive discounts for PC gamers by Pulasthi Ariyasinghe It is time to jump into another Steam Summer Sale. The 2025 edition of the yearly massive sale at the biggest PC gaming store on the market has just kicked off, and it is touting thousands of discounts for everything from the oldest classics to the newest releases and everything in between. The Steam servers predictably wobbled for a while at the launch of the sale, but things finally seem to be calming down enough to browse the latest sales. The front page is the place to be for anyone looking for recommendations, with it putting the spotlight on fresh games every day. However, keep in mind that the discounts themselves will not be changing and will remain static throughout the sale. Some recent blockbusters like Metaphor: ReFantazio, Monster Hunter Wilds, Sid Meier's Civilization VII, Black Myth: Wukong, Call of Duty: Black Ops 6, Clair Obscur: Expedition 33, Warhammer 40,000: Space Marine 2, Indiana Jones and the Great Circle, Blue Prince, Kingdom Come: Deliverance II, and much more are currently discounted. Valve has also brought back the special "Deep Discounts" section, letting Steam users find the most deeply discounted games quickly straight from the front page. The page has a selection of "all-time greats" with 85% to 95% cuts to their standard prices. This time, it includes titles like Black Mesa, Little Nightmares II, Kerbal Space Program, Steins Gate, Furi, Crash Bandicoot N. Sane Trilogy, Star Wars Battlefront II, Robocop Rogue City, and much more for just a few dollars each. As for the duration, the Steam Summer Sale of 2025 will be open for business until July 10, giving all of you two whole weeks to try and keep your wallets closed tight. As always, be sure to read our Weekend PC Game Deals special this coming Saturday to check out the biggest highlights from the sale. If you miss this store-wide promotion, Valve's next major sale will land this September as part of a new time slot for the Steam Autumn Sale. Head over here to see the complete 2025 sales roadmap for the platform.
    • Great way to get an entire physical model of the products (i.e. end users) and better market them...definitely not something I'd want on ANY of my personal devices, but can be useful in retail shops for sure.
  • Recent Achievements

    • First Post
      TheRingmaster earned a badge
      First Post
    • Conversation Starter
      Kavin25 earned a badge
      Conversation Starter
    • One Month Later
      Leonard grant earned a badge
      One Month Later
    • Week One Done
      pcdoctorsnet earned a badge
      Week One Done
    • Rising Star
      Phillip0web went up a rank
      Rising Star
  • Popular Contributors

    1. 1
      +primortal
      552
    2. 2
      ATLien_0
      205
    3. 3
      +FloatingFatMan
      180
    4. 4
      Michael Scrip
      147
    5. 5
      Som
      119
  • Tell a friend

    Love Neowin? Tell a friend!