Preparations

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.  Using 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:

Use 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.

Here's 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[] fArray = new UIDLGLOGFONT[1];
                                    locale.GetDialogFont(fArray);
                                    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) {
                                            break;
                                        }
                                        sb.Append((char)charVal);
                                        ch++;
                                    }
                                    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 {
                                        object dialogFont = Font.FromLogFont(lfAuto);
                                    }
                                    catch (ArgumentException) {
                                    }