reactos操作系统实现(166)

NtUserRedrawWindow函数主要用来重画窗口显示。具体代码如下:

#001  BOOL APIENTRY

#002  NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,

#003                     UINT flags)

#004  {

#005     RECT SafeUpdateRect;

#006     NTSTATUS Status;

#007     PWINDOW_OBJECT Wnd;

#008     DECLARE_RETURN(BOOL);

#009     USER_REFERENCE_ENTRY Ref;

#010 

#011     DPRINT("Enter NtUserRedrawWindow/n");

 

进入界面临界区代码。

#012     UserEnterExclusive();

#013 

 

获取窗口对象,或者获取桌面窗口对象。

#014     if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))

#015     {

#016        RETURN( FALSE);

#017     }

#018 

 

如果更新窗口的大小不为空,就是固定大小的窗口更新。

#019     if (lprcUpdate != NULL)

#020     {

#021        Status = MmCopyFromCaller(&SafeUpdateRect, (PRECT)lprcUpdate,

#022                                  sizeof(RECT));

#023 

#024        if (!NT_SUCCESS(Status))

#025        {

#026           SetLastWin32Error(ERROR_INVALID_PARAMETER);

#027           RETURN( FALSE);

#028        }

#029     }

#030 

 

增加窗口的引用计数。

#031     UserRefObjectCo(Wnd, &Ref);

#032 

 

调用函数co_UserRedrawWindow来更新窗口。

#033     Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect,

#034                                  hrgnUpdate, flags);

#035 

 

减少窗口引用计数。

#036     UserDerefObjectCo(Wnd);

#037 

 

如果执行不成功,就返回出错码。

#038     if (!NT_SUCCESS(Status))

#039     {

#040        /* IntRedrawWindow fails only in case that flags are invalid */

#041        SetLastWin32Error(ERROR_INVALID_PARAMETER);

#042        RETURN( FALSE);

#043     }

#044 

#045     RETURN( TRUE);

#046 

#047  CLEANUP:

#048     DPRINT("Leave NtUserRedrawWindow, ret=%i/n",_ret_);

 

退出临界区代码。

#049     UserLeave();

#050     END_CLEANUP;

#051  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值