internal override PaintEventArgs PaintEventStart(ref Message msg, IntPtr handle, bool client) {
PaintEventArgs paint_event;
Hwnd hwnd;
Hwnd paint_hwnd;
//
// handle (and paint_hwnd) refers to the window that is should be painted.
// msg.HWnd (and hwnd) refers to the window that got the paint message.
//
hwnd = Hwnd.ObjectFromHandle(msg.HWnd);
if (msg.HWnd == handle) {
paint_hwnd = hwnd;
} else {
paint_hwnd = Hwnd.ObjectFromHandle (handle);
}
if (Caret.Visible == true) {
Caret.Paused = true;
HideCaret();
}
Graphics dc;
if (client) {
dc = Graphics.FromHwnd (paint_hwnd.client_window);
Region clip_region = new Region ();
clip_region.MakeEmpty();
foreach (Rectangle r in hwnd.ClipRectangles) {
/* Expand the region slightly.
* See bug 464464.
*/
Rectangle r2 = Rectangle.FromLTRB (r.Left, r.Top, r.Right, r.Bottom + 1);
clip_region.Union (r2);
}
if (hwnd.UserClip != null) {
clip_region.Intersect(hwnd.UserClip);
}
dc.Clip = clip_region;
paint_event = new PaintEventArgs(dc, hwnd.Invalid);
hwnd.expose_pending = false;
hwnd.ClearInvalidArea();
hwnd.drawing_stack.Push (paint_event);
hwnd.drawing_stack.Push (dc);
return paint_event;
} else {
dc = Graphics.FromHwnd (paint_hwnd.whole_window);
if (!hwnd.nc_invalid.IsEmpty) {
dc.SetClip (hwnd.nc_invalid);
paint_event = new PaintEventArgs(dc, hwnd.nc_invalid);
} else {
paint_event = new PaintEventArgs(dc, new Rectangle(0, 0, hwnd.width, hwnd.height));
}
hwnd.nc_expose_pending = false;
hwnd.ClearNcInvalidArea ();
hwnd.drawing_stack.Push (paint_event);
hwnd.drawing_stack.Push (dc);
return paint_event;
}
}