@@ -27,6 +27,7 @@ typedef struct _DATA
27
27
ScreenSaverItem ScreenSaverItems [MAX_SCREENSAVERS ];
28
28
PROCESS_INFORMATION PrevWindowPi ;
29
29
int Selection ;
30
+ WNDPROC OldPreviewProc ;
30
31
UINT ScreenSaverCount ;
31
32
HWND ScreenSaverPreviewParent ;
32
33
} DATA , * PDATA ;
@@ -107,6 +108,33 @@ SelectionChanged(HWND hwndDlg, PDATA pData)
107
108
}
108
109
109
110
111
+ LRESULT CALLBACK
112
+ RedrawSubclassProc (HWND hwndDlg ,
113
+ UINT uMsg ,
114
+ WPARAM wParam ,
115
+ LPARAM lParam )
116
+ {
117
+ HWND hwnd ;
118
+ PDATA pData ;
119
+ LRESULT Ret = FALSE;
120
+
121
+ pData = (PDATA )GetWindowLongPtr (hwndDlg , GWLP_USERDATA );
122
+ if (!pData )
123
+ return Ret ;
124
+
125
+ Ret = CallWindowProc (pData -> OldPreviewProc , hwndDlg , uMsg , wParam , lParam );
126
+
127
+ if (uMsg == WM_PAINT )
128
+ {
129
+ hwnd = pData -> ScreenSaverPreviewParent ;
130
+ if (hwnd )
131
+ RedrawWindow (hwnd , NULL , NULL , RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN );
132
+ }
133
+
134
+ return Ret ;
135
+ }
136
+
137
+
110
138
static VOID
111
139
ShowScreenSaverPreview (IN LPDRAWITEMSTRUCT draw , IN PDATA pData )
112
140
{
@@ -650,8 +678,16 @@ OnInitDialog(HWND hwndDlg, PDATA pData)
650
678
HWND hParent = GetDlgItem (hwndDlg , IDC_SCREENS_PREVIEW );
651
679
HWND hChild ;
652
680
681
+ if (hParent != NULL )
682
+ {
683
+ pData -> OldPreviewProc = (WNDPROC )GetWindowLongPtr (hParent , GWLP_WNDPROC );
684
+ SetWindowLongPtr (hParent , GWLP_WNDPROC , (LONG_PTR )RedrawSubclassProc );
685
+ SetWindowLongPtr (hParent , GWLP_USERDATA , (LONG_PTR )pData );
686
+ }
687
+
653
688
hChild = CreateWindowEx (0 , szPreviewWndClass , NULL ,
654
- WS_CHILD , 0 , 0 , 0 , 0 , hParent ,
689
+ WS_CHILD | WS_CLIPCHILDREN ,
690
+ 0 , 0 , 0 , 0 , hParent ,
655
691
NULL , hApplet , NULL );
656
692
if (hChild != NULL )
657
693
{
@@ -781,6 +817,9 @@ ScreenSaverPageProc(HWND hwndDlg,
781
817
{
782
818
if (pData -> ScreenSaverPreviewParent )
783
819
{
820
+ SetWindowLongPtr (GetDlgItem (hwndDlg , IDC_SCREENS_PREVIEW ),
821
+ GWLP_WNDPROC ,
822
+ (LONG_PTR )pData -> OldPreviewProc );
784
823
DestroyWindow (pData -> ScreenSaverPreviewParent );
785
824
pData -> ScreenSaverPreviewParent = NULL ;
786
825
}
0 commit comments