I'm struggling with the same problem. The RTF spec says that the font size (fs) is in half points, which explains the doubling. Another observation is that when you set the Font of the windows forms RichTextBox to size 11, then the SelectionFont will become a different value, and this depends on the dpi of your display. You get different RTF created at 96dpi to that at 120dpi if you just set the Font property.
The font size in points is converted to pixels. There are 72 points per inch. The dpi setting of your monitor (or device context) says how many pixels per inch. At 120dpi, a size 11 font = 11. 120/72 = 18.333 pixels.
RTF Amethyst by Rimmer Type Foundry is sold/licensed through myfonts.com. See the font license on the My Fonts website for more information.
This is rounded down to 18 pixels. This corresponds to a point size of 18. 72 / 120 = 10.8 points. This is 21.6 half points, and rounds up to 22. You get fs22 in the rtf. At 96dpi, a size 11 font = 11. 96/72 = 14.667 pixels.
Rounded up to 15 pixels and backcalculates to 11.25. This is 22.5 half pixels, rounded up to 23. You get fs23 in the rtf.
If you add a handler to the selectionchanged event of the RTB then you can see that the SelectionFont.Size takes this display-dependent font size. I think that you have to be more specific, RichTextBox controls work with rich text which can have multiple fonts, colors, and objects embedded. To append text with a particular font append the text, then select it, then set the font of the selection. Don't rely on just setting the Font property.
On another note, if you show the Windows Forms FontDialog, then the font that is returned will also have this display-dependent font size. And finally, if you want to just set up an empty RichTextBox with the font set to say, 11, then you might find that as soon as the user starts typing, the RTF has the 11.5 size. This is because you need to set the font of the insertion point, and you can't seem to do that from.Net.
I've managed to do it using SendMessage to set the insertion point, and then setting the SelectionFont. The rtf will then start with the correct dpi-independent fs value: Dim masterFont As New System.Drawing.Font('Calibri', 11, FontStyle.Regular, GraphicsUnit.Point, 0) ' select insertion point on an empty rtb. Dim result As IntPtr = SendMessage(RichTextBox1.Handle, &HB1, IntPtr.Zero, New IntPtr(-1)) RichTextBox1.Font = masterFont RichTextBox1.SelectionFont = masterFont.