Add native wxOverlay implementation for wxMSW

Using generic implementation doesn't work any longer since the switch to
using composited windows (i.e. turning on WS_EX_COMPOSITED) by default
as drawing using wxClientDC has no effect.

So implement wxOverlay in a different way by using a layered window
covering the original window and drawing on it instead. This is similar
to Cocoa implementation of wxOverlay.

Closes #23047.
This commit is contained in:
AliKet 2022-12-20 12:44:20 +01:00 committed by Vadim Zeitlin
parent 487018f42e
commit 91031bcfee
10 changed files with 321 additions and 8 deletions

View file

@ -4976,7 +4976,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS = \
monodll_uuid.o \
monodll_msw_evtloop.o \
monodll_access.o \
monodll_msw_bmpbndl.o
monodll_msw_bmpbndl.o \
monodll_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS)
@ -5704,7 +5705,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_uuid.o \
monodll_msw_evtloop.o \
monodll_access.o \
monodll_msw_bmpbndl.o
monodll_msw_bmpbndl.o \
monodll_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_1 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_1)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_1 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS)
@ -6732,7 +6734,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_uuid.o \
monolib_msw_evtloop.o \
monolib_access.o \
monolib_msw_bmpbndl.o
monolib_msw_bmpbndl.o \
monolib_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_2 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_2)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_2 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_17)
@ -7460,7 +7463,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_uuid.o \
monolib_msw_evtloop.o \
monolib_access.o \
monolib_msw_bmpbndl.o
monolib_msw_bmpbndl.o \
monolib_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_3 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_3)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_3 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_17)
@ -8642,7 +8646,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_uuid.o \
coredll_msw_evtloop.o \
coredll_access.o \
coredll_msw_bmpbndl.o
coredll_msw_bmpbndl.o \
coredll_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_4 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_4)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_4 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_1_1)
@ -9370,7 +9375,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_uuid.o \
coredll_msw_evtloop.o \
coredll_access.o \
coredll_msw_bmpbndl.o
coredll_msw_bmpbndl.o \
coredll_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_5 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_5)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_5 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_1_1)
@ -10128,7 +10134,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_uuid.o \
corelib_msw_evtloop.o \
corelib_access.o \
corelib_msw_bmpbndl.o
corelib_msw_bmpbndl.o \
corelib_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_6 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_6)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_6 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_1_4)
@ -10856,7 +10863,8 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_uuid.o \
corelib_msw_evtloop.o \
corelib_access.o \
corelib_msw_bmpbndl.o
corelib_msw_bmpbndl.o \
corelib_msw_overlay.o
@COND_TOOLKIT_MSW@__LOWLEVEL_SRC_OBJECTS_7 = $(COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_7)
@COND_TOOLKIT_OSX_COCOA@__LOWLEVEL_SRC_OBJECTS_7 = \
@COND_TOOLKIT_OSX_COCOA@ $(__OSX_LOWLEVEL_SRC_OBJECTS_1_4)
@ -17407,6 +17415,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_bmpbndl.o: $(srcdir)/src/msw/bmpbndl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/bmpbndl.cpp
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_overlay.o: $(srcdir)/src/msw/overlay.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/overlay.cpp
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@monodll_artmac.o: $(srcdir)/src/osx/artmac.cpp $(MONODLL_ODEP)
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/artmac.cpp
@ -22171,6 +22182,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_bmpbndl.o: $(srcdir)/src/msw/bmpbndl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/bmpbndl.cpp
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_overlay.o: $(srcdir)/src/msw/overlay.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/overlay.cpp
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@monolib_artmac.o: $(srcdir)/src/osx/artmac.cpp $(MONOLIB_ODEP)
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/artmac.cpp
@ -27034,6 +27048,9 @@ coredll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@coredll_msw_bmpbndl.o: $(srcdir)/src/msw/bmpbndl.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/bmpbndl.cpp
@COND_TOOLKIT_MSW_USE_GUI_1@coredll_msw_overlay.o: $(srcdir)/src/msw/overlay.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/overlay.cpp
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@coredll_artmac.o: $(srcdir)/src/osx/artmac.cpp $(COREDLL_ODEP)
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/osx/artmac.cpp
@ -30769,6 +30786,9 @@ corelib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@corelib_msw_bmpbndl.o: $(srcdir)/src/msw/bmpbndl.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/bmpbndl.cpp
@COND_TOOLKIT_MSW_USE_GUI_1@corelib_msw_overlay.o: $(srcdir)/src/msw/overlay.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/overlay.cpp
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@corelib_artmac.o: $(srcdir)/src/osx/artmac.cpp $(CORELIB_ODEP)
@COND_PLATFORM_MACOSX_1_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/osx/artmac.cpp

View file

@ -1764,6 +1764,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/msw/evtloop.cpp
src/msw/ole/access.cpp
src/msw/bmpbndl.cpp
src/msw/overlay.cpp
</set>
<set var="MSW_LOWLEVEL_HDR" hints="files">
wx/msw/nonownedwnd.h

View file

@ -1640,6 +1640,7 @@ set(MSW_LOWLEVEL_SRC
src/msw/evtloop.cpp
src/msw/ole/access.cpp
src/msw/bmpbndl.cpp
src/msw/overlay.cpp
)
set(MSW_LOWLEVEL_HDR

View file

@ -1626,6 +1626,7 @@ MSW_LOWLEVEL_SRC =
src/msw/ole/oleutils.cpp
src/msw/ole/safearray.cpp
src/msw/ole/uuid.cpp
src/msw/overlay.cpp
src/msw/palette.cpp
src/msw/pen.cpp
src/msw/popupwin.cpp

View file

@ -1926,6 +1926,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_evtloop.o \
$(OBJS)\monodll_access.o \
$(OBJS)\monodll_msw_bmpbndl.o \
$(OBJS)\monodll_overlay.o \
$(OBJS)\monodll_clrpickerg.o \
$(OBJS)\monodll_collpaneg.o \
$(OBJS)\monodll_filepickerg.o \
@ -2274,6 +2275,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_evtloop.o \
$(OBJS)\monodll_access.o \
$(OBJS)\monodll_msw_bmpbndl.o \
$(OBJS)\monodll_overlay.o \
$(OBJS)\monodll_generic_accel.o \
$(OBJS)\monodll_clrpickerg.o \
$(OBJS)\monodll_collpaneg.o \
@ -2775,6 +2777,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_evtloop.o \
$(OBJS)\monolib_access.o \
$(OBJS)\monolib_msw_bmpbndl.o \
$(OBJS)\monolib_overlay.o \
$(OBJS)\monolib_clrpickerg.o \
$(OBJS)\monolib_collpaneg.o \
$(OBJS)\monolib_filepickerg.o \
@ -3123,6 +3126,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_evtloop.o \
$(OBJS)\monolib_access.o \
$(OBJS)\monolib_msw_bmpbndl.o \
$(OBJS)\monolib_overlay.o \
$(OBJS)\monolib_generic_accel.o \
$(OBJS)\monolib_clrpickerg.o \
$(OBJS)\monolib_collpaneg.o \
@ -3506,6 +3510,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_evtloop.o \
$(OBJS)\coredll_access.o \
$(OBJS)\coredll_msw_bmpbndl.o \
$(OBJS)\coredll_overlay.o \
$(OBJS)\coredll_clrpickerg.o \
$(OBJS)\coredll_collpaneg.o \
$(OBJS)\coredll_filepickerg.o \
@ -3854,6 +3859,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_evtloop.o \
$(OBJS)\coredll_access.o \
$(OBJS)\coredll_msw_bmpbndl.o \
$(OBJS)\coredll_overlay.o \
$(OBJS)\coredll_generic_accel.o \
$(OBJS)\coredll_clrpickerg.o \
$(OBJS)\coredll_collpaneg.o \
@ -4194,6 +4200,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_evtloop.o \
$(OBJS)\corelib_access.o \
$(OBJS)\corelib_msw_bmpbndl.o \
$(OBJS)\corelib_overlay.o \
$(OBJS)\corelib_clrpickerg.o \
$(OBJS)\corelib_collpaneg.o \
$(OBJS)\corelib_filepickerg.o \
@ -4542,6 +4549,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_evtloop.o \
$(OBJS)\corelib_access.o \
$(OBJS)\corelib_msw_bmpbndl.o \
$(OBJS)\corelib_overlay.o \
$(OBJS)\corelib_generic_accel.o \
$(OBJS)\corelib_clrpickerg.o \
$(OBJS)\corelib_collpaneg.o \
@ -8465,6 +8473,11 @@ $(OBJS)\monodll_msw_bmpbndl.o: ../../src/msw/bmpbndl.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_overlay.o: ../../src/msw/overlay.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_clrpickerg.o: ../../src/generic/clrpickerg.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@ -11052,6 +11065,11 @@ $(OBJS)\monolib_msw_bmpbndl.o: ../../src/msw/bmpbndl.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_overlay.o: ../../src/msw/overlay.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_clrpickerg.o: ../../src/generic/clrpickerg.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@ -13600,6 +13618,11 @@ $(OBJS)\coredll_msw_bmpbndl.o: ../../src/msw/bmpbndl.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_overlay.o: ../../src/msw/overlay.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_clrpickerg.o: ../../src/generic/clrpickerg.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
@ -15353,6 +15376,11 @@ $(OBJS)\corelib_msw_bmpbndl.o: ../../src/msw/bmpbndl.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_overlay.o: ../../src/msw/overlay.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_clrpickerg.o: ../../src/generic/clrpickerg.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<

View file

@ -2243,6 +2243,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_evtloop.obj \
$(OBJS)\monodll_access.obj \
$(OBJS)\monodll_msw_bmpbndl.obj \
$(OBJS)\monodll_overlay.obj \
$(OBJS)\monodll_clrpickerg.obj \
$(OBJS)\monodll_collpaneg.obj \
$(OBJS)\monodll_filepickerg.obj \
@ -2589,6 +2590,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_evtloop.obj \
$(OBJS)\monodll_access.obj \
$(OBJS)\monodll_msw_bmpbndl.obj \
$(OBJS)\monodll_overlay.obj \
$(OBJS)\monodll_generic_accel.obj \
$(OBJS)\monodll_clrpickerg.obj \
$(OBJS)\monodll_collpaneg.obj \
@ -3092,6 +3094,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_evtloop.obj \
$(OBJS)\monolib_access.obj \
$(OBJS)\monolib_msw_bmpbndl.obj \
$(OBJS)\monolib_overlay.obj \
$(OBJS)\monolib_clrpickerg.obj \
$(OBJS)\monolib_collpaneg.obj \
$(OBJS)\monolib_filepickerg.obj \
@ -3438,6 +3441,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_evtloop.obj \
$(OBJS)\monolib_access.obj \
$(OBJS)\monolib_msw_bmpbndl.obj \
$(OBJS)\monolib_overlay.obj \
$(OBJS)\monolib_generic_accel.obj \
$(OBJS)\monolib_clrpickerg.obj \
$(OBJS)\monolib_collpaneg.obj \
@ -3873,6 +3877,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_evtloop.obj \
$(OBJS)\coredll_access.obj \
$(OBJS)\coredll_msw_bmpbndl.obj \
$(OBJS)\coredll_overlay.obj \
$(OBJS)\coredll_clrpickerg.obj \
$(OBJS)\coredll_collpaneg.obj \
$(OBJS)\coredll_filepickerg.obj \
@ -4219,6 +4224,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_evtloop.obj \
$(OBJS)\coredll_access.obj \
$(OBJS)\coredll_msw_bmpbndl.obj \
$(OBJS)\coredll_overlay.obj \
$(OBJS)\coredll_generic_accel.obj \
$(OBJS)\coredll_clrpickerg.obj \
$(OBJS)\coredll_collpaneg.obj \
@ -4559,6 +4565,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_evtloop.obj \
$(OBJS)\corelib_access.obj \
$(OBJS)\corelib_msw_bmpbndl.obj \
$(OBJS)\corelib_overlay.obj \
$(OBJS)\corelib_clrpickerg.obj \
$(OBJS)\corelib_collpaneg.obj \
$(OBJS)\corelib_filepickerg.obj \
@ -4905,6 +4912,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_evtloop.obj \
$(OBJS)\corelib_access.obj \
$(OBJS)\corelib_msw_bmpbndl.obj \
$(OBJS)\corelib_overlay.obj \
$(OBJS)\corelib_generic_accel.obj \
$(OBJS)\corelib_clrpickerg.obj \
$(OBJS)\corelib_collpaneg.obj \
@ -8910,6 +8918,11 @@ $(OBJS)\monodll_msw_bmpbndl.obj: ..\..\src\msw\bmpbndl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\bmpbndl.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_overlay.obj: ..\..\src\msw\overlay.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\overlay.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_clrpickerg.obj: ..\..\src\generic\clrpickerg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\clrpickerg.cpp
@ -11497,6 +11510,11 @@ $(OBJS)\monolib_msw_bmpbndl.obj: ..\..\src\msw\bmpbndl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\bmpbndl.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_overlay.obj: ..\..\src\msw\overlay.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\overlay.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_clrpickerg.obj: ..\..\src\generic\clrpickerg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\clrpickerg.cpp
@ -14045,6 +14063,11 @@ $(OBJS)\coredll_msw_bmpbndl.obj: ..\..\src\msw\bmpbndl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\bmpbndl.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_overlay.obj: ..\..\src\msw\overlay.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\overlay.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_clrpickerg.obj: ..\..\src\generic\clrpickerg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\generic\clrpickerg.cpp
@ -15798,6 +15821,11 @@ $(OBJS)\corelib_msw_bmpbndl.obj: ..\..\src\msw\bmpbndl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\bmpbndl.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_overlay.obj: ..\..\src\msw\overlay.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\overlay.cpp
!endif
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_clrpickerg.obj: ..\..\src\generic\clrpickerg.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\generic\clrpickerg.cpp

View file

@ -1079,6 +1079,7 @@
<ClCompile Include="..\..\src\common\bmpcboxcmn.cpp" />
<ClCompile Include="..\..\src\generic\rowheightcache.cpp" />
<ClCompile Include="..\..\src\generic\creddlgg.cpp" />
<ClCompile Include="..\..\src\msw\overlay.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\src\msw\version.rc">

View file

@ -942,6 +942,9 @@
<ClCompile Include="..\..\src\msw\ole\uuid.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\msw\overlay.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\msw\ownerdrw.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>

View file

@ -17,6 +17,8 @@
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXOSX__) && wxOSX_USE_COCOA
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXMSW__)
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXGTK3__)
#define wxHAS_NATIVE_OVERLAY 1
#define wxHAS_GENERIC_OVERLAY 1

228
src/msw/overlay.cpp Normal file
View file

@ -0,0 +1,228 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/msw/overlay.cpp
// Author: Ali Kettab
// Copyright: (c) 2022 Ali Kettab
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/private/overlay.h"
#include "wx/nativewin.h"
#include "wx/dcclient.h"
#include "wx/dcmemory.h"
#include "wx/msw/dc.h"
#include "wx/msw/private.h"
namespace // anonymous
{
class wxOverlayWindow : public wxNativeContainerWindow
{
public:
static wxWindow* New(const wxRect& rect)
{
WNDCLASS wndclass;
wxZeroMemory(wndclass);
wndclass.lpfnWndProc = ::DefWindowProc;
wndclass.hInstance = wxGetInstance();
wndclass.lpszClassName = GetOverlayWindowClass();
if ( !::RegisterClass(&wndclass) )
{
wxLogLastError(wxS("RegisterClass() in wxOverlayWindow::Create()"));
return nullptr;
}
const wxPoint pos = rect.GetPosition();
const wxSize size = rect.GetSize();
WXDWORD exStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
HWND hwnd = ::CreateWindowEx
(
exStyle,
GetOverlayWindowClass(),
nullptr,
WS_POPUP | WS_VISIBLE,
pos.x, pos.y,
size.x, size.y,
(HWND)nullptr,
(HMENU)nullptr,
wxGetInstance(),
(LPVOID)nullptr
);
if ( !hwnd )
{
wxLogLastError(wxS("CreateWindowEx() in wxOverlayWindow::Create()"));
return nullptr;
}
if ( !::SetLayeredWindowAttributes(hwnd, 0, 128, LWA_COLORKEY|LWA_ALPHA) )
{
wxLogLastError(wxS("SetLayeredWindowAttributes() in wxOverlayWindow::Create()"));
}
return new wxOverlayWindow(hwnd);
}
static const wxChar* GetOverlayWindowClass()
{
return wxS("wxOverlayWindow");
}
virtual bool Show(bool show) override
{
if ( !GetHandle() || !wxWindowBase::Show(show) )
return false;
if ( show )
{
::SetWindowPos(GetHandle(), nullptr, 0, 0, 0, 0,
SWP_NOSIZE |
SWP_NOMOVE |
SWP_NOREDRAW |
SWP_NOOWNERZORDER |
SWP_NOACTIVATE |
SWP_SHOWWINDOW);
}
else
{
::ShowWindow(GetHandle(), SW_HIDE);
}
return true;
}
virtual bool Destroy() override
{
HWND hwnd = GetHandle();
if ( hwnd && !::DestroyWindow(hwnd) )
{
wxLogLastError(wxS("DestroyWindow() in wxOverlayWindow::Destroy()"));
return false;
}
if ( !::UnregisterClass(GetOverlayWindowClass(), wxGetInstance()) )
{
wxLogLastError(wxS("UnregisterClass() in wxOverlayWindow::Destroy()"));
}
return true;
}
private:
wxOverlayWindow(HWND hwnd) : wxNativeContainerWindow(hwnd) {}
~wxOverlayWindow() {}
};
} // anonymous namespace
class wxOverlayImpl : public wxOverlay::Impl
{
public:
wxOverlayImpl() { }
~wxOverlayImpl() { }
virtual bool IsNative() const override { return true; }
virtual void Reset() override;
virtual bool IsOk() override;
virtual void Init(wxDC* dc, int x , int y , int width , int height) override;
virtual void BeginDrawing(wxDC* dc) override;
virtual void EndDrawing(wxDC* dc) override;
virtual void Clear(wxDC* dc) override;
public:
// window the overlay is associated with
wxWindow* m_window = nullptr;
// the overlay window itself. doesn't have to be child of any window
// and is totally managed by this class
wxWindow* m_overlayWindow = nullptr;
wxRect m_rect;
// Drawing on the overlay window is achieved by hijacking the existing wxDC.
// i.e. any drawing done through wxDC should go to the offscreen bitmap m_bitmap
// which will eventually be drawn on the overlay window.
wxBitmap m_bitmap;
wxMemoryDC m_memDC; // for memory dc construction only.
WXHDC m_hdc; // the original HDC
wxDECLARE_NO_COPY_CLASS(wxOverlayImpl);
};
bool wxOverlayImpl::IsOk()
{
return m_overlayWindow != nullptr;
}
void wxOverlayImpl::Init(wxDC* dc, int , int , int , int )
{
if ( IsOk() )
return;
m_window = dc->GetWindow();
m_rect.SetSize(m_window->GetClientSize());
m_rect.SetPosition(m_window->GetScreenPosition());
m_bitmap.CreateWithDIPSize(m_rect.GetSize(), m_window->GetDPIScaleFactor());
m_overlayWindow = wxOverlayWindow::New(m_rect);
}
void wxOverlayImpl::BeginDrawing(wxDC* dc)
{
wxCHECK_RET( IsOk(), wxS("overlay not initialized") );
m_memDC.SelectObject(m_bitmap);
auto impl = dc->GetImpl();
auto msw_impl = static_cast<wxMSWDCImpl*>(impl);
m_hdc = GetHdcOf(*msw_impl); // save the original hdc
msw_impl->SetHDC(GetHdcOf(m_memDC));
msw_impl->UpdateClipBox();
}
void wxOverlayImpl::EndDrawing(wxDC* dc)
{
wxCHECK_RET( IsOk(), wxS("overlay not initialized") );
m_memDC.SelectObject(wxNullBitmap);
auto impl = dc->GetImpl();
auto msw_impl = static_cast<wxMSWDCImpl*>(impl);
msw_impl->SetHDC(m_hdc); // restore the original hdc
msw_impl->UpdateClipBox();
wxWindowDC winDC(m_overlayWindow);
winDC.DrawBitmap(m_bitmap, wxPoint(0, 0));
}
void wxOverlayImpl::Clear(wxDC* WXUNUSED(dc))
{
wxCHECK_RET( IsOk(), wxS("overlay not initialized") );
// doesn't work with non double buffered m_window
// m_memDC.SetBackground(*wxTRANSPARENT_BRUSH);
m_memDC.SetBackground(wxBrush(wxTransparentColour));
m_memDC.Clear();
}
void wxOverlayImpl::Reset()
{
if ( IsOk() )
{
m_overlayWindow->Destroy();
m_overlayWindow = nullptr;
}
}
wxOverlay::Impl* wxOverlay::Create()
{
return new wxOverlayImpl;
}