/// <summary> /// Returns a TEXTMETRIC structure for the font selected in the device context /// represented by this object, in units of pixels. /// </summary> public Gdi32.TEXTMETRICW GetTextMetrics() { // Set the mapping mode to MM_TEXT so we deal with units of pixels. Gdi32.MM mapMode = DeviceContext.MapMode; bool setupDC = mapMode != Gdi32.MM.TEXT; if (setupDC) { // Changing the MapMode will affect viewport and window extent and origin, we save the dc // state so all those properties can be properly restored once done. DeviceContext.SaveHdc(); } try { if (setupDC) { mapMode = DeviceContext.SetMapMode(Gdi32.MM.TEXT); } var tm = new Gdi32.TEXTMETRICW(); Gdi32.GetTextMetricsW(DeviceContext, ref tm); return(tm); } finally { if (setupDC) { DeviceContext.RestoreHdc(); } } }
private void ActivateDropDown() { if (_editor != null) { try { object newValue = _editor.EditValue(TypeDescriptorContext, this, Value); SetValue(newValue); } catch (Exception ex) { ActionPanel.ShowError(string.Format(SR.DesignerActionPanel_ErrorActivatingDropDown, ex.Message)); } } else { ListBox listBox = new ListBox { BorderStyle = BorderStyle.None, IntegralHeight = false, Font = ActionPanel.Font }; listBox.SelectedIndexChanged += new EventHandler(OnListBoxSelectedIndexChanged); listBox.KeyDown += new KeyEventHandler(OnListBoxKeyDown); TypeConverter.StandardValuesCollection standardValues = GetStandardValues(); if (standardValues != null) { foreach (object o in standardValues) { string newItem = PropertyDescriptor.Converter.ConvertToString(TypeDescriptorContext, CultureInfo.CurrentCulture, o); listBox.Items.Add(newItem); if ((o != null) && o.Equals(Value)) { listBox.SelectedItem = newItem; } } } // All measurement code borrowed from WinForms PropertyGridView.cs int maxWidth = 0; // The listbox draws with GDI, not GDI+. So, we use a normal DC here. using (var hdc = new User32.GetDcScope(listBox.Handle)) { using var hFont = new Gdi32.ObjectScope(listBox.Font.ToHFONT()); using var fontSelection = new Gdi32.SelectObjectScope(hdc, hFont); var tm = new Gdi32.TEXTMETRICW(); if (listBox.Items.Count > 0) { foreach (string s in listBox.Items) { var textSize = new Size(); Gdi32.GetTextExtentPoint32W(hdc, s, s.Length, ref textSize); maxWidth = Math.Max(textSize.Width, maxWidth); } } Gdi32.GetTextMetricsW(hdc, ref tm); // border + padding + scrollbar maxWidth += 2 + tm.tmMaxCharWidth + SystemInformation.VerticalScrollBarWidth; listBox.Height = Math.Max(tm.tmHeight + 2, Math.Min(ListBoxMaximumHeight, listBox.PreferredHeight)); listBox.Width = Math.Max(maxWidth, EditRegionSize.Width); _ignoreDropDownValue = false; } try { ShowDropDown(listBox, SystemColors.ControlDark); } finally { listBox.SelectedIndexChanged -= new EventHandler(OnListBoxSelectedIndexChanged); listBox.KeyDown -= new KeyEventHandler(OnListBoxKeyDown); } if (!_ignoreDropDownValue) { if (listBox.SelectedItem != null) { SetValue(listBox.SelectedItem); } } } }