VS Dialog font and dying my hair, maybe


I'm in the mode where everything needs to get done before I can leave.  Don't
you hate that mode?!  It's like going on a long vacation.  You get extra
productive making sure everything is OK before you leave.  If only I could work
this way everyday!

Giving Campaign

Well, my Product Unit (Visual Studio Core) may just win for the Giving Campaign Challenge. 
Remember, if 80% participate in this year's campaign, I said I'd dye my hair. 
The deadline was extended and it's looking grim for my dark brown hair.  As of
today they've reached 59%.  At this pace, they'll win for sure.  I'll keep
you posted here.

VS dialog font from managed code

An internal MS integrator posted this question:

  • I
    have a managed package, where I'd like to reflect the font selected in the shell for
    Toolwindows and Dialogs into my package's toolwindows. 
    the interop assemblies for the Shell, there is a QueryService to get an IUIHostLocale,
    which then has a GetDialogFont method.  My question is how do I transform the
    resulting UIDLGLOGFONT into a managed System::Drawing::Font object.  The static
    System::Drawing::Font::FromLogFont throws an invalid arg exception if I try to use
    it.  Anyone got any advice?

Here's how to do this using the VSIP SDK from Everett Extras:

the LOGFONT struct out of the NativeMethods namespace in the VSIP Helper classes, filling
in that struct with the info you get from the IUIHostLocale::GetDialogFont method. 
Then use the .NET Framework's Font.FromLogFont method to create a Font object for your use.

some code (I've not compiled, but it is close to what is expected to work):

IUIHostLocale locale = (IUIHostLocale) GetService(typeof(IUIHostLocale));
if (locale != null) {
UIDLGLOGFONT font = fArray[0];

// Convert the face name from ushort[32] to string
StringBuilder sb = new StringBuilder();
int ch = 0;
while (ch < 32) {
ushort charVal = font.lfFaceName[ch];
if (charVal == 0) {
if (sb.Length == 0) {
Debug.Fail("Unable to get face name of VS dialog font.");

// Copy one LOGFONT to the other...
NativeMethods.LOGFONT lfAuto = new NativeMethods.LOGFONT();
lfAuto.lfHeight = font.lfHeight;
lfAuto.lfWidth = font.lfWidth;
lfAuto.lfEscapement = font.lfEscapement;
lfAuto.lfOrientation = font.lfOrientation;
lfAuto.lfWeight = font.lfWeight;
lfAuto.lfItalic = font.lfItalic;
lfAuto.lfUnderline = font.lfUnderline;
lfAuto.lfStrikeOut = font.lfStrikeOut;
lfAuto.lfCharSet = font.lfCharSet;
lfAuto.lfOutPrecision = font.lfOutPrecision;
lfAuto.lfClipPrecision = font.lfClipPrecision;
lfAuto.lfQuality = font.lfQuality;
lfAuto.lfPitchAndFamily = font.lfPitchAndFamily;
lfAuto.lfFaceName = sb.ToString();

try {
dialogFont = Font.FromLogFont(lfAuto);
catch (ArgumentException) {

Skip to main content