How to Retain Control Size after Dialog Font Change – MFC


Scenario

Suppose you have designed a dialog that are having a lot of controls, and you made it look perfect. Now your client says: “Oh, The font looks a bit small. Can you enlarge it a bit and keep up the same look and feel?”. So, what’s the big deal lets change the font size. OK, Changed? So what do you see? The size of the dialog including all the controls in it has changed according to the font size and everything got bigger. Now maintaining the same font size, you will need to resize and re-position all the controls in it one by one, which is really a hard thing.

Reason

Well, whats the reason behind this? Your resource file (.rc) uses something called dialog units to specify the position and size of the controls. This thing is completely dependent on the font size you set to the dialog, and that is the reason for the size of each control in the dialog even though there is no text in the same. ( refer the msdn doc: http://support.microsoft.com/kb/145994  to get a better understanding about dialog units)

Solution

One solution is to do all things dynamically, that is using SetWindowPos function to set the correct position and sizes in pixels. But that too is hard as if you already designed it. So I decided to create an application that parse your resource code block, identify the control co-ordinates and convert them in such a way that there will not be a size change according to the font size. All you have to do is:

  1. Run the application
  2. Input the previous font name and font size, the new font size and font name
  3. Open the resource file that has the code of the dialog
  4. Copy the code starting from the line below “BEGIN” statement up to the previous line of “END” statement
  5. Click “Convert” button, and you can see the co-ordinate adjusted code on the edit window on right side.
  6. Replace it to the resource file after comparing the original version (ideally using beyond compare).

Application interface

Logic

Very simple. The application looks for and reads the first 4 comma separated integers in each line, which will obviously be the x,y, width and height values of a control. When it gets such a group of values, it will generate the values using the formula in the aforementioned doc. That means, you can also give the desired values in the format: “x,y,width,height” (not “left,top,right,bottom”) to get the converted value, which you will have to do in order to convert co-ordinates of the dialog which in code isn’t properly comma separated.

Note: If the text in new font does not fit in the previous control size, you will need to manually adjust the size of such controls in order for the text to fit in.

Download: DlgUnitFontAdjuster.zip

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s