Rob Shearman : comctl32: Move the getting of the DC outside of ANIMATE_DrawFrame.

Alexandre Julliard julliard at winehq.org
Thu Feb 7 07:59:39 CST 2008


Module: wine
Branch: master
Commit: 2a56d15997558346615b9b65ea76697607c8f289
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2a56d15997558346615b9b65ea76697607c8f289

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu Feb  7 12:37:45 2008 +0000

comctl32: Move the getting of the DC outside of ANIMATE_DrawFrame.

This allows the handle to the DC to be passed in the WM_CTLCOLORSTATIC 
message sent to the parent.

---

 dlls/comctl32/animate.c |   56 ++++++++++++++++++++++++++++------------------
 1 files changed, 34 insertions(+), 22 deletions(-)

diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c
index 6ba05bd..e0730f8 100644
--- a/dlls/comctl32/animate.c
+++ b/dlls/comctl32/animate.c
@@ -345,10 +345,8 @@ static BOOL ANIMATE_PaintFrame(ANIMATE_INFO* infoPtr, HDC hDC)
     return TRUE;
 }
 
-static BOOL ANIMATE_DrawFrame(ANIMATE_INFO *infoPtr)
+static BOOL ANIMATE_DrawFrame(ANIMATE_INFO *infoPtr, HDC hDC)
 {
-    HDC		hDC;
-
     TRACE("Drawing frame %d (loop %d)\n", infoPtr->currFrame, infoPtr->nLoop);
 
     mmioSeek(infoPtr->hMMio, infoPtr->lpIndex[infoPtr->currFrame], SEEK_SET);
@@ -361,10 +359,7 @@ static BOOL ANIMATE_DrawFrame(ANIMATE_INFO *infoPtr)
 	return FALSE;
     }
 
-    if ((hDC = GetDC(infoPtr->hwndSelf)) != 0) {
-	ANIMATE_PaintFrame(infoPtr, hDC);
-	ReleaseDC(infoPtr->hwndSelf, hDC);
-    }
+    ANIMATE_PaintFrame(infoPtr, hDC);
 
     if (infoPtr->currFrame++ >= infoPtr->nToFrame) {
 	infoPtr->currFrame = infoPtr->nFromFrame;
@@ -380,14 +375,20 @@ static BOOL ANIMATE_DrawFrame(ANIMATE_INFO *infoPtr)
 
 static LRESULT ANIMATE_Timer(ANIMATE_INFO *infoPtr)
 {
-   /* FIXME: we should pass the hDC instead of 0 to WM_CTLCOLORSTATIC */
-   if (infoPtr->dwStyle & ACS_TRANSPARENT)
-        infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,
-                                                 WM_CTLCOLORSTATIC,
-                                                 0, (LPARAM)infoPtr->hwndSelf);
-    EnterCriticalSection(&infoPtr->cs);
-    ANIMATE_DrawFrame(infoPtr);
-    LeaveCriticalSection(&infoPtr->cs);
+    HDC	hDC;
+
+    if ((hDC = GetDC(infoPtr->hwndSelf)) != 0)
+    {
+        if (infoPtr->dwStyle & ACS_TRANSPARENT)
+            infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,
+                                                     WM_CTLCOLORSTATIC,
+                                                     (WPARAM)hDC, (LPARAM)infoPtr->hwndSelf);
+        EnterCriticalSection(&infoPtr->cs);
+        ANIMATE_DrawFrame(infoPtr, hDC);
+        LeaveCriticalSection(&infoPtr->cs);
+
+	ReleaseDC(infoPtr->hwndSelf, hDC);
+    }
 
     return 0;
 }
@@ -400,16 +401,20 @@ static DWORD CALLBACK ANIMATE_AnimationThread(LPVOID ptr_)
 
     while(1)
     {
+        HDC hDC = GetDC(infoPtr->hwndSelf);
+
         if (infoPtr->dwStyle & ACS_TRANSPARENT)
             infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,
                                                      WM_CTLCOLORSTATIC,
-                                                     0, (LPARAM)infoPtr->hwndSelf);
+                                                     (WPARAM)hDC, (LPARAM)infoPtr->hwndSelf);
         EnterCriticalSection(&infoPtr->cs);
-        ANIMATE_DrawFrame(infoPtr);
+        ANIMATE_DrawFrame(infoPtr, hDC);
         timeout = infoPtr->mah.dwMicroSecPerFrame;
         event = infoPtr->hStopEvent;
         LeaveCriticalSection(&infoPtr->cs);
 
+        ReleaseDC(infoPtr->hwndSelf, hDC);
+
         /* time is in microseconds, we should convert it to milliseconds */
         if ((event == 0) || WaitForSingleObject( event, (timeout+500)/1000) == WAIT_OBJECT_0)
             break;
@@ -452,11 +457,18 @@ static LRESULT ANIMATE_Play(ANIMATE_INFO *infoPtr, UINT cRepeat, WORD wFrom, WOR
      * does it send a notification */
     if (infoPtr->nFromFrame == infoPtr->nToFrame)
     {
-        if (infoPtr->dwStyle & ACS_TRANSPARENT)
-            infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,
-                                                     WM_CTLCOLORSTATIC,
-                                                     0, (LPARAM)infoPtr->hwndSelf);
-        ANIMATE_DrawFrame(infoPtr);
+        HDC hDC;
+
+        if ((hDC = GetDC(infoPtr->hwndSelf)) != 0)
+        {
+            if (infoPtr->dwStyle & ACS_TRANSPARENT)
+                infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,
+                                                         WM_CTLCOLORSTATIC,
+                                                         (WPARAM)hDC, (LPARAM)infoPtr->hwndSelf);
+            ANIMATE_DrawFrame(infoPtr, hDC);
+
+	    ReleaseDC(infoPtr->hwndSelf, hDC);
+        }
         return TRUE;
     }
 




More information about the wine-cvs mailing list