reactos操作系统实现(167)
co_UserRedrawWindow函数是用来实现窗口重画的功能,实现代码如下: #001 BOOL FASTCALL #002 co_UserRedrawWindow(PWINDOW_OBJECT Window,const RECT* UpdateRect,HRGN UpdateRgn, #003 ULONG Flags) #004 { #005 HRGN hRgn = NULL; #006 #007 /* #008 * Step 1. #009 * Validation of passed parameters. #010 */ #011
检验是否合适的参数。 #012 if (!IntIsWindowDrawable(Window) || #013 (Flags & (RDW_VALIDATE | RDW_INVALIDATE)) == #014 (RDW_VALIDATE | RDW_INVALIDATE)) #015 { #016 return FALSE; #017 } #018 #019 /* #020 * Step 2. #021 * Transform the parameters UpdateRgn and UpdateRect into #022 * a region hRgn specified in screen coordinates. #023 */ #024
创建更新的区域。 #025 if (Flags & (RDW_INVALIDATE | RDW_VALIDATE)) #026 {
根据用户指定的区域进行更新。 #027 if (UpdateRgn != NULL) #028 { #029 hRgn = NtGdiCreateRectRgn(0,0); #030 if (NtGdiCombineRgn(hRgn,UpdateRgn,NULL,RGN_COPY) == NULLREGION) #031 { #032 NtGdiDeleteObject(hRgn); #033 hRgn = NULL; #034 }
否则更新整个窗口。 #035 else #036 NtGdiOffsetRgn(hRgn,Window->Wnd->ClientRect.left,Window->Wnd->ClientRect.top); #037 } #038 else if (UpdateRect != NULL) #039 { #040 if (!IntGdiIsEmptyRect(UpdateRect)) #041 { #042 hRgn = UnsafeIntCreateRectRgnIndirect((RECT *)UpdateRect); #043 NtGdiOffsetRgn(hRgn,Window->Wnd->ClientRect.top); #044 } #045 } #046 else if ((Flags & (RDW_INVALIDATE | RDW_FRAME)) == (RDW_INVALIDATE | RDW_FRAME) || #047 (Flags & (RDW_VALIDATE | RDW_NOFRAME)) == (RDW_VALIDATE | RDW_NOFRAME)) #048 { #049 if (!IntGdiIsEmptyRect(&Window->Wnd->WindowRect)) #050 hRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->WindowRect); #051 } #052 else #053 {
创建客户区窗口区域更新。 #054 if (!IntGdiIsEmptyRect(&Window->Wnd->ClientRect)) #055 hRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->ClientRect); #056 } #057 } #058 #059 /* #060 * Step 3. #061 * Adjust the window update region depending on hRgn and flags. #062 */ #063
根据指定的区域进行更新。 #064 if (Flags & (RDW_INVALIDATE | RDW_VALIDATE | RDW_INTERNALPAINT | RDW_NOINTERNALPAINT) && #065 hRgn != NULL) #066 { #067 IntInvalidateWindows(Window,hRgn,Flags); #068 } #069 #070 /* #071 * Step 4. #072 * Repaint and erase windows if needed. #073 */ #074
重新画窗口。 #075 if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) #076 { #077 co_IntPaintWindows(Window,Flags,FALSE); #078 } #079 #080 /* #081 * Step 5. #082 * Cleanup ;-) #083 */ #084 #085 if (hRgn != NULL) #086 { #087 NtGdiDeleteObject(hRgn); #088 } #089 #090 return TRUE; #091} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ajax – 是否可以通过使用CNAME记录来允许跨域请
- 在flash builder中将flex项目导出单独的swf文件
- c# – 使用.NET ThreadPool.QueueUserWorkItem的
- xpath 解析带<![CDATA[ xml
- objective-c – NSPredicate和Regex
- c – 32位应用程序中的64位功能?
- iphone – 在运行时添加标志(Xcode Instruments)
- ruby – 从TestCase调用Sinatra app实例方法
- ruby-on-rails – Rails’public’文件夹中文件的
- Swift教程15-闭包block多种应用方式