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