IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
IntPtr retVal = IntPtr.Zero;
if (!handled)
{
var wmsg = (WindowMessage)msg;
//Debug.WriteLine(wmsg);
switch (wmsg)
{
case WindowMessage.WM_MOUSEHWHEEL:
// do our own horizontal wheel event
var element = Mouse.DirectlyOver;
if (element != null)
{
var delta = wParam.ToInt32() >> 16;
var arg = new MouseWheelEventArgs(InputManager.Current.PrimaryMouseDevice, Environment.TickCount, delta)
{
RoutedEvent = MouseEvents.PreviewMouseHWheelEvent
};
element.RaiseEvent(arg);
if (!arg.Handled)
{
arg.RoutedEvent = MouseEvents.MouseHWheelEvent;
arg.Handled = false;
element.RaiseEvent(arg);
handled = arg.Handled;
}
}
break;
//case WindowMessage.WM_SETTEXT:
//case WindowMessage.WM_SETICON:
// var changed = User32Ex.ModifyStyle(hwnd, WindowStyles.WS_VISIBLE, WindowStyles.WS_OVERLAPPED);
// retVal = User32.DefWindowProc(hwnd, (uint)msg, wParam, lParam);
// if (changed) { User32Ex.ModifyStyle(hwnd, WindowStyles.WS_OVERLAPPED, WindowStyles.WS_VISIBLE); }
// handled = true;
// break;
case WindowMessage.WM_NCUAHDRAWCAPTION:
case WindowMessage.WM_NCUAHDRAWFRAME:
// undocumented stuff for non-dwm themes that will sometimes draw old control buttons
handled = true;
break;
case WindowMessage.WM_NCCALCSIZE:
//remove non-client borders completely
HandleNcCalcSize(hwnd, wParam, lParam);
handled = true;
break;
case WindowMessage.WM_NCPAINT:
// prevent non-dwm flicker
handled = !Dwmapi.IsCompositionEnabled;
break;
case WindowMessage.WM_NCACTIVATE:
// handled to prevent default non-client border from showing in classic mode
// wParam False means draw inactive title bar (which we do nothing).
retVal = HandleNcActivate(hwnd, msg, wParam, retVal);
handled = true;
break;
case WindowMessage.WM_NCHITTEST:
retVal = new IntPtr((int)HandleNcHitTest(lParam.ToPoint()));
handled = true;
break;
case WindowMessage.WM_NCRBUTTONDOWN:
switch ((NcHitTest)wParam.ToInt32())
{
case NcHitTest.HTCAPTION:
case NcHitTest.HTSYSMENU:
// display sys menu
User32.PostMessage(hwnd, (uint)WindowMessage.WM_POPUPSYSTEMMENU, IntPtr.Zero, lParam);
handled = true;
break;
}
break;
case WindowMessage.WM_WINDOWPOSCHANGED:
HandleWindowPosChanged(hwnd, lParam);
break;
case WindowMessage.WM_DWMCOMPOSITIONCHANGED:
SetRegion(hwnd, 0, 0, true);
break;
case WindowMessage.WM_ERASEBKGND:
// prevent more flickers?
handled = true;
break;
}
}
return retVal;
}