public bool PreFilterMessage(ref Message m) { if ((WM)m.Msg == WM.MOUSEWHEEL) { // Only handle messages if the control belongs to our form. Win32.POINT cursorPoint = new Win32.POINT(); Win32.GetCursorPos(ref cursorPoint); IntPtr targetWindow = Win32.WindowFromPoint(cursorPoint); Control control = Control.FromChildHandle(targetWindow); if (control != null && ControlUtilities.ContainsControl(form.contentHeaderPanel, control)) { // Forward the message to the control or the first of its parents which can have scrollbars. while (control != null && !(control is ScrollableControl)) control = control.Parent; if (control != null) { Win32.SendMessage(control.Handle, m.Msg, m.WParam, m.LParam); return true; } } } return false; }
/// <summary> /// Sets the given bitmap as window content with transparent parts via the /// layered windows API. /// </summary> /// <param name="bitmap">The bitmap to set.</param> /// <param name="opacity">The overall opacity (255 = opaque).</param> public static void SetBitmap(Control control, Bitmap bitmap, int opacity) { if (bitmap.PixelFormat != PixelFormat.Format32bppArgb) throw new ApplicationException("The bitmap must be 32ppp with alpha-channel."); IntPtr screenDc = Win32.GetDC(IntPtr.Zero); IntPtr memDc = Win32.CreateCompatibleDC(screenDc); IntPtr hBitmap = IntPtr.Zero; IntPtr oldBitmap = IntPtr.Zero; try { hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); // grab a GDI handle from this GDI+ bitmap oldBitmap = Win32.SelectObject(memDc, hBitmap); Win32.SIZE size = new Win32.SIZE(bitmap.Width, bitmap.Height); Win32.POINT pointSource = new Win32.POINT(0, 0); Win32.POINT topPos = new Win32.POINT(control.Left, control.Top); Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION(); blend.BlendOp = Win32.AC_SRC_OVER; blend.BlendFlags = 0; blend.SourceConstantAlpha = (byte)opacity; blend.AlphaFormat = Win32.AC_SRC_ALPHA; if (!control.IsDisposed && !control.Disposing) { Win32.UpdateLayeredWindow(control.Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, Win32.ULW_ALPHA); } } finally { Win32.ReleaseDC(IntPtr.Zero, screenDc); if (hBitmap != IntPtr.Zero) { Win32.SelectObject(memDc, oldBitmap); Win32.DeleteObject(hBitmap); } Win32.DeleteDC(memDc); } }