/// <include file='doc\ToolTip.uex' path='docs/doc[@for="ToolTip.WndProc"]/*' /> /// <devdoc> /// WNDPROC /// </devdoc> /// <internalonly/> private void WndProc(ref Message msg) { switch (msg.Msg) { case NativeMethods.WM_REFLECT + NativeMethods.WM_NOTIFY: NativeMethods.NMHDR nmhdr = (NativeMethods.NMHDR) msg.GetLParam(typeof(NativeMethods.NMHDR)); if (nmhdr.code == NativeMethods.TTN_SHOW && !trackPosition) { WmShow(); } else if (nmhdr.code == NativeMethods.TTN_POP) { WmPop(); window.DefWndProc(ref msg); } break; case NativeMethods.WM_WINDOWPOSCHANGING: WmWindowPosChanging(ref msg); break; case NativeMethods.WM_WINDOWPOSCHANGED: if (!WmWindowPosChanged()) { window.DefWndProc(ref msg); } break; case NativeMethods.WM_MOUSEACTIVATE: WmMouseActivate(ref msg); break; case NativeMethods.WM_MOVE: WmMove(); break; case NativeMethods.TTM_WINDOWFROMPOINT: WmWindowFromPoint(ref msg); break; case NativeMethods.WM_PRINTCLIENT: goto case NativeMethods.WM_PAINT; case NativeMethods.WM_PAINT: if (ownerDraw && !isBalloon && !trackPosition) { NativeMethods.PAINTSTRUCT ps = new NativeMethods.PAINTSTRUCT(); IntPtr dc = UnsafeNativeMethods.BeginPaint(new HandleRef(this,Handle),ref ps); Graphics g = Graphics.FromHdcInternal(dc); try { Rectangle bounds = new Rectangle(ps.rcPaint_left,ps.rcPaint_top, ps.rcPaint_right - ps.rcPaint_left, ps.rcPaint_bottom - ps.rcPaint_top); if (bounds == Rectangle.Empty ) { return; } NativeMethods.TOOLINFO_TOOLTIP ti = new NativeMethods.TOOLINFO_TOOLTIP(); ti.cbSize = Marshal.SizeOf(typeof(NativeMethods.TOOLINFO_TOOLTIP)); int ret = unchecked( (int) (long)UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.TTM_GETCURRENTTOOL, 0, ti)); if (ret != 0) { IWin32Window win = (IWin32Window)owners[ti.hwnd]; Control ac = Control.FromHandleInternal(ti.hwnd); if (win == null) { win = (IWin32Window)ac; } Font font; IntSecurity.ObjectFromWin32Handle.Assert(); try { font = Font.FromHfont(UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.WM_GETFONT, 0, 0)); } catch (ArgumentException) { // VSWhidbey 209345 - if the current default tooltip font is a non-TrueType font, then // Font.FromHfont throws this exception, so fall back to the default control font. font = Control.DefaultFont; } finally { CodeAccessPermission.RevertAssert(); } OnDraw(new DrawToolTipEventArgs(g, win, ac, bounds, GetToolTip(ac), BackColor, ForeColor, font)); break; } } finally { g.Dispose(); UnsafeNativeMethods.EndPaint(new HandleRef(this,Handle),ref ps); } } //If not OwnerDraw, fall through goto default; default: window.DefWndProc(ref msg); break; } }
protected override void WndProc(ref Message m) { switch (m.Msg) { // We don't want to fire the focus events twice - // once in the combobox and once in the ChildWndProc. case NativeMethods.WM_SETFOCUS: try { fireSetFocus = false; base.WndProc(ref m); } finally { fireSetFocus = true; } break; case NativeMethods.WM_KILLFOCUS: try { fireLostFocus = false; base.WndProc(ref m); // Nothing to see here... Just keep on walking... VSWhidbey 504477. // Turns out that with Theming off, we don't get quite the same messages as with theming on. // With theming on we get a WM_MOUSELEAVE after a WM_KILLFOCUS even if you use the Tab key // to move focus. Our response to WM_MOUSELEAVE causes us to repaint everything correctly. // With theming off, we do not get a WM_MOUSELEAVE after a WM_KILLFOCUS, and since we don't have a childwndproc // when we are a Flat DropDownList, we need to force a repaint. The easiest way to do this is to send a // WM_MOUSELEAVE to ourselves, since that also sets up the right state. Or... at least the state is the same // as with Theming on. // This is such a @#$(*&#@$ hack. if (!Application.RenderWithVisualStyles && GetStyle(ControlStyles.UserPaint) == false && this.DropDownStyle == ComboBoxStyle.DropDownList && (FlatStyle == FlatStyle.Flat || FlatStyle == FlatStyle.Popup)) { UnsafeNativeMethods.PostMessage(new HandleRef(this, Handle), NativeMethods.WM_MOUSELEAVE, 0, 0); } } finally { fireLostFocus = true; } break; case NativeMethods.WM_CTLCOLOREDIT: case NativeMethods.WM_CTLCOLORLISTBOX: m.Result = InitializeDCForWmCtlColor(m.WParam, m.Msg); break; case NativeMethods.WM_ERASEBKGND: WmEraseBkgnd(ref m); break; case NativeMethods.WM_PARENTNOTIFY: WmParentNotify(ref m); break; case NativeMethods.WM_REFLECT + NativeMethods.WM_COMMAND: WmReflectCommand(ref m); break; case NativeMethods.WM_REFLECT + NativeMethods.WM_DRAWITEM: WmReflectDrawItem(ref m); break; case NativeMethods.WM_REFLECT + NativeMethods.WM_MEASUREITEM: WmReflectMeasureItem(ref m); break; case NativeMethods.WM_LBUTTONDOWN: mouseEvents = true; base.WndProc(ref m); break; case NativeMethods.WM_LBUTTONUP: // Get the mouse location // NativeMethods.RECT r = new NativeMethods.RECT(); UnsafeNativeMethods.GetWindowRect(new HandleRef(this, Handle), ref r); Rectangle ClientRect = new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top); int x = NativeMethods.Util.SignedLOWORD(m.LParam); int y = NativeMethods.Util.SignedHIWORD(m.LParam); Point pt = new Point(x, y); pt = PointToScreen(pt); //mouseEvents is used to keep the check that we get the WM_LBUTTONUP after //WM_LBUTTONDOWN or WM_LBUTTONDBLBCLK // combo box gets a WM_LBUTTONUP for focus change ... // if (mouseEvents && !ValidationCancelled) { mouseEvents = false; bool captured = Capture; if (captured && ClientRect.Contains(pt)) { OnClick(new MouseEventArgs(MouseButtons.Left, 1, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); OnMouseClick(new MouseEventArgs(MouseButtons.Left, 1, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); } base.WndProc(ref m); } else { CaptureInternal = false; DefWndProc(ref m); } break; case NativeMethods.WM_MOUSELEAVE: DefWndProc(ref m); OnMouseLeaveInternal(EventArgs.Empty); break; case NativeMethods.WM_PAINT: if (GetStyle(ControlStyles.UserPaint) == false && (FlatStyle == FlatStyle.Flat || FlatStyle == FlatStyle.Popup)) { using (WindowsRegion dr = new WindowsRegion(FlatComboBoxAdapter.dropDownRect)) { using (WindowsRegion wr = new WindowsRegion(this.Bounds)) { // Stash off the region we have to update (the base is going to clear this off in BeginPaint) NativeMethods.RegionFlags updateRegionFlags = (NativeMethods.RegionFlags)SafeNativeMethods.GetUpdateRgn(new HandleRef(this, this.Handle), new HandleRef(this, wr.HRegion), true); dr.CombineRegion(wr, dr, RegionCombineMode.DIFF); Rectangle updateRegionBoundingRect = wr.ToRectangle(); FlatComboBoxAdapter.ValidateOwnerDrawRegions(this, updateRegionBoundingRect); // Call the base class to do its painting (with a clipped DC). NativeMethods.PAINTSTRUCT ps = new NativeMethods.PAINTSTRUCT(); IntPtr dc; bool disposeDc = false; if (m.WParam == IntPtr.Zero) { dc = UnsafeNativeMethods.BeginPaint(new HandleRef(this, Handle), ref ps); disposeDc = true; } else { dc = m.WParam; } using (DeviceContext mDC = DeviceContext.FromHdc(dc)) { using (WindowsGraphics wg = new WindowsGraphics(mDC)) { if (updateRegionFlags != NativeMethods.RegionFlags.ERROR) { wg.DeviceContext.SetClip(dr); } m.WParam = dc; DefWndProc(ref m); if (updateRegionFlags != NativeMethods.RegionFlags.ERROR) { wg.DeviceContext.SetClip(wr); } using (Graphics g = Graphics.FromHdcInternal(dc)) { FlatComboBoxAdapter.DrawFlatCombo(this, g); } } } if (disposeDc) { UnsafeNativeMethods.EndPaint(new HandleRef(this, Handle), ref ps); } } return; } } base.WndProc(ref m); break; case NativeMethods.WM_PRINTCLIENT: // all the fancy stuff we do in OnPaint has to happen again in OnPrint. if (GetStyle(ControlStyles.UserPaint) == false && FlatStyle == FlatStyle.Flat || FlatStyle == FlatStyle.Popup) { DefWndProc(ref m); if ((unchecked( (int) (long)m.LParam) & NativeMethods.PRF_CLIENT) == NativeMethods.PRF_CLIENT) { if (GetStyle(ControlStyles.UserPaint) == false && FlatStyle == FlatStyle.Flat || FlatStyle == FlatStyle.Popup) { using (Graphics g = Graphics.FromHdcInternal(m.WParam)) { FlatComboBoxAdapter.DrawFlatCombo(this,g); } } return; } } base.WndProc(ref m); return; case NativeMethods.WM_SETCURSOR: base.WndProc(ref m); break; case NativeMethods.WM_SETFONT: //(bug 119265) if (Width == 0) { suppressNextWindosPos = true; } base.WndProc(ref m); break; case NativeMethods.WM_WINDOWPOSCHANGED: if (!suppressNextWindosPos) { base.WndProc(ref m); } suppressNextWindosPos = false; break; case NativeMethods.WM_NCDESTROY: base.WndProc(ref m); ReleaseChildWindow(); break; default: if (m.Msg == NativeMethods.WM_MOUSEENTER) { DefWndProc(ref m); OnMouseEnterInternal(EventArgs.Empty); break; } base.WndProc(ref m); break; } }
/// <include file='doc\ErrorProvider.uex' path='docs/doc[@for="ErrorProvider.ErrorWindow.OnPaint"]/*' /> /// <devdoc> /// This is called when the error window needs to paint. We paint each icon at its /// correct location. /// </devdoc> void OnPaint(ref Message m) { NativeMethods.PAINTSTRUCT ps = new NativeMethods.PAINTSTRUCT(); IntPtr hdc = UnsafeNativeMethods.BeginPaint(new HandleRef(this, Handle), ref ps); try { CreateMirrorDC(hdc, windowBounds.Width - 1); try { for (int i = 0; i < items.Count; i++) { ControlItem item = (ControlItem)items[i]; Rectangle bounds = item.GetIconBounds(provider.Region.Size); SafeNativeMethods.DrawIconEx(new HandleRef(this, mirrordc.Hdc), bounds.X - windowBounds.X, bounds.Y - windowBounds.Y, new HandleRef(provider.Region, provider.Region.IconHandle), bounds.Width, bounds.Height, 0, NativeMethods.NullHandleRef, NativeMethods.DI_NORMAL); } } finally { RestoreMirrorDC(); } } finally { UnsafeNativeMethods.EndPaint(new HandleRef(this, Handle), ref ps); } }