HDC GetDCEx(
HWND hWnd, // handle of window
HRGN hrgnClip, // handle of clip region
DWORD flags // device-context creation flags
);
GetDCEx和GetDC相比多了一个hrnClip的参数.
在WINNT以后的版本中hrgnClip是屏幕坐标,而之前的版本是局部坐标相对于hWnd的窗口坐标
返回的HDC 内部结构中系统会维护一个可见区域,这个可见区域是hWnd窗口可见部分的区域组合(不包括被其他窗口覆盖的那些部分).
HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT
*
lps )
... {
HWND full_handle;
HRGN hrgn;
UINT flags = UPDATE_NONCLIENT | UPDATE_ERASE | UPDATE_PAINT | UPDATE_INTERNALPAINT | UPDATE_NOCHILDREN;
if (!lps) return 0;
if (!(full_handle = WIN_IsCurrentThread( hwnd )))
...{
if (IsWindow(hwnd))
FIXME( "window %p belongs to other thread ", hwnd );
return 0;
}
hwnd = full_handle;
HideCaret( hwnd );
if (!(hrgn = send_ncpaint( hwnd, NULL, &flags ))) return 0;
/**//*这里由InvalidateRecg InvalidateRgn等相关函数所构成的无效(需要绘图的)区域,并转换成屏幕坐标,在WINNT之前应该是局部坐标*/
lps->fErase = send_erase( hwnd, flags, hrgn, &lps->rcPaint, &lps->hdc );
//这里会把hrgn传递给GetDCEx(),把 hrgn和窗口可见区域做交运算.并返回到lps->hdc.如果直接调用GetDC,只有可见区域,GetDC的可绘图区域一般来说大于BeginPaint返回的hdc可绘图区域,这也就是BeginPaint比直接调用GetDC绘图快的原因
TRACE("hdc = %p box = (%d,%d - %d,%d), fErase = %d ",
lps->hdc, lps->rcPaint.left, lps->rcPaint.top, lps->rcPaint.right, lps->rcPaint.bottom,
lps->fErase);
return lps->hdc;
}
... {
HWND full_handle;
HRGN hrgn;
UINT flags = UPDATE_NONCLIENT | UPDATE_ERASE | UPDATE_PAINT | UPDATE_INTERNALPAINT | UPDATE_NOCHILDREN;
if (!lps) return 0;
if (!(full_handle = WIN_IsCurrentThread( hwnd )))
...{
if (IsWindow(hwnd))
FIXME( "window %p belongs to other thread ", hwnd );
return 0;
}
hwnd = full_handle;
HideCaret( hwnd );
if (!(hrgn = send_ncpaint( hwnd, NULL, &flags ))) return 0;
/**//*这里由InvalidateRecg InvalidateRgn等相关函数所构成的无效(需要绘图的)区域,并转换成屏幕坐标,在WINNT之前应该是局部坐标*/
lps->fErase = send_erase( hwnd, flags, hrgn, &lps->rcPaint, &lps->hdc );
//这里会把hrgn传递给GetDCEx(),把 hrgn和窗口可见区域做交运算.并返回到lps->hdc.如果直接调用GetDC,只有可见区域,GetDC的可绘图区域一般来说大于BeginPaint返回的hdc可绘图区域,这也就是BeginPaint比直接调用GetDC绘图快的原因
TRACE("hdc = %p box = (%d,%d - %d,%d), fErase = %d ",
lps->hdc, lps->rcPaint.left, lps->rcPaint.top, lps->rcPaint.right, lps->rcPaint.bottom,
lps->fErase);
return lps->hdc;
}