/// <summary> /// http://social.msdn.microsoft.com/Forums/silverlight/en-US/0ae40192-e866-480a-9f90-2a8d2a75b045/getting-proplem-with-focus-of-customcontrol /// </summary> /// <returns></returns> public bool Focus(int nField = 0) { Message m; IPv4Field f = this.Field(nField); m = Message.Create(Handle, (int)NativeMethods.WM.WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero); WndProc(ref m); if ((nField == 0) || (f.IsEnabled == false)) { NativeMethods.SetFocus(Handle); } else { iWM_MOUSEACTIVATE = 2; NativeMethods.SetFocus(Handle); iWM_MOUSEACTIVATE = 1; m = Message.Create(Handle, (int)NativeMethods.IPAMess.IPM_SETFOCUS, (IntPtr)nField, IntPtr.Zero); WndProc(ref m); iWM_MOUSEACTIVATE = 0; } m = Message.Create(Handle, (int)NativeMethods.WM.WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); WndProc(ref m); return(NativeMethods.RedrawWindow(new HandleRef(this, Handle), IntPtr.Zero, IntPtr.Zero, NativeMethods.RedrawWindowFlags.RDW_ALLCHILDREN | NativeMethods.RedrawWindowFlags.RDW_INVALIDATE | NativeMethods.RedrawWindowFlags.RDW_ERASENOW)); }
/// <summary> /// Handles MouseActivate message from the contol /// </summary> /// <param name="m">message to process</param> /// <returns>true if process message, false otherwise</returns> private bool ProcessControlMouseActivate(ref Message m) { Debug.WriteLine("WM_MOUSEACTIVATE"); int currentFocus = NativeMethods.GetFocus(); for (int i = 0; i < 4; i++) { if (currentFocus == (int)_hfv.hWnd[i]) { m.Result = (IntPtr)NativeMethods.MouseActivate.MA_NOACTIVATE; return(true); } } NativeMethods.RECT lpRect = new NativeMethods.RECT(); NativeMethods.GetWindowRect(new HandleRef(this, Handle), out lpRect); Size sz = new Size((lpRect.Right - lpRect.Left) / 4, lpRect.Bottom - lpRect.Top); Rectangle[] SplitRects = new Rectangle[4]; Point p = Cursor.Position; int nFieldIPM_SETFOCUS = 0; for (int i = 0; i < 4; i++) { SplitRects[i] = new Rectangle(new Point(lpRect.Left + (sz.Width * i), lpRect.Top), sz); if (SplitRects[i].Contains(p)) { IPv4Field f = this.Field(i); if (!f.IsEnabled) { m.Result = (IntPtr)NativeMethods.MouseActivate.MA_NOACTIVATEANDEAT; return(true); } nFieldIPM_SETFOCUS = i; } } Debug.WriteLine("BeforeIPM_SETFOCUS"); Focus(nFieldIPM_SETFOCUS); Debug.WriteLine("AfterIPM_SETFOCUS"); return(false); }