GetDCEx 和BeginPaint

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值