From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Tue, 18 Oct 2011 21:57:02 +0000 (+0000)
Subject: Added wxRichToolTip class.
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/e520c3f75cbfb0ed6a751576d7032ef196a1817d

Added wxRichToolTip class.

It can be used to show more customizable tooltips than the native wxToolTip
but at the price of using generic implementation in some cases (actually
almost always now, with the exceptions of text control tooltips under MSW).

Extra features include:
 - The balloon-like tooltip form.
 - Possibility to show an icon.
 - Title display in a different form.

More customization could be added later. It should be also possible to fully
implement this class natively under MSW.

Update the dialogs sample to show the rich tooltips in action.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69463 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/Makefile.in b/Makefile.in
index fb031f6d7c..e9174f95fb 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -3759,6 +3759,7 @@ COND_WXUNIV_0_ADVANCED_HDR =  \
 	wx/notifmsg.h \
 	wx/odcombo.h \
 	wx/propdlg.h \
+	wx/richtooltip.h \
 	wx/sashwin.h \
 	wx/sound.h \
 	wx/splash.h \
@@ -3810,6 +3811,7 @@ COND_WXUNIV_1_ADVANCED_HDR =  \
 	wx/notifmsg.h \
 	wx/odcombo.h \
 	wx/propdlg.h \
+	wx/richtooltip.h \
 	wx/sashwin.h \
 	wx/sound.h \
 	wx/splash.h \
@@ -6143,6 +6145,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS =  \
 	monodll_gridcmn.o \
 	monodll_hyperlnkcmn.o \
 	monodll_odcombocmn.o \
+	monodll_richtooltipcmn.o \
 	monodll_aboutdlgg.o \
 	monodll_bannerwindow.o \
 	monodll_bmpcboxg.o \
@@ -6161,6 +6164,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS =  \
 	monodll_notifmsgg.o \
 	monodll_odcombo.o \
 	monodll_propdlg.o \
+	monodll_generic_richtooltip.o \
 	monodll_sashwin.o \
 	monodll_splash.o \
 	monodll_generic_timectrl.o \
@@ -6178,6 +6182,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS =  \
 	monodll_gridcmn.o \
 	monodll_hyperlnkcmn.o \
 	monodll_odcombocmn.o \
+	monodll_richtooltipcmn.o \
 	monodll_aboutdlgg.o \
 	monodll_bannerwindow.o \
 	monodll_bmpcboxg.o \
@@ -6196,6 +6201,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS =  \
 	monodll_notifmsgg.o \
 	monodll_odcombo.o \
 	monodll_propdlg.o \
+	monodll_generic_richtooltip.o \
 	monodll_sashwin.o \
 	monodll_splash.o \
 	monodll_generic_timectrl.o \
@@ -8097,6 +8103,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 =  \
 	monolib_gridcmn.o \
 	monolib_hyperlnkcmn.o \
 	monolib_odcombocmn.o \
+	monolib_richtooltipcmn.o \
 	monolib_aboutdlgg.o \
 	monolib_bannerwindow.o \
 	monolib_bmpcboxg.o \
@@ -8115,6 +8122,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 =  \
 	monolib_notifmsgg.o \
 	monolib_odcombo.o \
 	monolib_propdlg.o \
+	monolib_generic_richtooltip.o \
 	monolib_sashwin.o \
 	monolib_splash.o \
 	monolib_generic_timectrl.o \
@@ -8132,6 +8140,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 =  \
 	monolib_gridcmn.o \
 	monolib_hyperlnkcmn.o \
 	monolib_odcombocmn.o \
+	monolib_richtooltipcmn.o \
 	monolib_aboutdlgg.o \
 	monolib_bannerwindow.o \
 	monolib_bmpcboxg.o \
@@ -8150,6 +8159,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 =  \
 	monolib_notifmsgg.o \
 	monolib_odcombo.o \
 	monolib_propdlg.o \
+	monolib_generic_richtooltip.o \
 	monolib_sashwin.o \
 	monolib_splash.o \
 	monolib_generic_timectrl.o \
@@ -11893,6 +11903,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 =  \
 	advdll_gridcmn.o \
 	advdll_hyperlnkcmn.o \
 	advdll_odcombocmn.o \
+	advdll_richtooltipcmn.o \
 	advdll_aboutdlgg.o \
 	advdll_bannerwindow.o \
 	advdll_bmpcboxg.o \
@@ -11911,6 +11922,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 =  \
 	advdll_notifmsgg.o \
 	advdll_odcombo.o \
 	advdll_propdlg.o \
+	advdll_generic_richtooltip.o \
 	advdll_sashwin.o \
 	advdll_splash.o \
 	advdll_generic_timectrl.o \
@@ -11928,6 +11940,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 =  \
 	advdll_gridcmn.o \
 	advdll_hyperlnkcmn.o \
 	advdll_odcombocmn.o \
+	advdll_richtooltipcmn.o \
 	advdll_aboutdlgg.o \
 	advdll_bannerwindow.o \
 	advdll_bmpcboxg.o \
@@ -11946,6 +11959,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 =  \
 	advdll_notifmsgg.o \
 	advdll_odcombo.o \
 	advdll_propdlg.o \
+	advdll_generic_richtooltip.o \
 	advdll_sashwin.o \
 	advdll_splash.o \
 	advdll_generic_timectrl.o \
@@ -12007,6 +12021,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 =  \
 	advlib_gridcmn.o \
 	advlib_hyperlnkcmn.o \
 	advlib_odcombocmn.o \
+	advlib_richtooltipcmn.o \
 	advlib_aboutdlgg.o \
 	advlib_bannerwindow.o \
 	advlib_bmpcboxg.o \
@@ -12025,6 +12040,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 =  \
 	advlib_notifmsgg.o \
 	advlib_odcombo.o \
 	advlib_propdlg.o \
+	advlib_generic_richtooltip.o \
 	advlib_sashwin.o \
 	advlib_splash.o \
 	advlib_generic_timectrl.o \
@@ -12042,6 +12058,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 =  \
 	advlib_gridcmn.o \
 	advlib_hyperlnkcmn.o \
 	advlib_odcombocmn.o \
+	advlib_richtooltipcmn.o \
 	advlib_aboutdlgg.o \
 	advlib_bannerwindow.o \
 	advlib_bmpcboxg.o \
@@ -12060,6 +12077,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 =  \
 	advlib_notifmsgg.o \
 	advlib_odcombo.o \
 	advlib_propdlg.o \
+	advlib_generic_richtooltip.o \
 	advlib_sashwin.o \
 	advlib_splash.o \
 	advlib_generic_timectrl.o \
@@ -13348,6 +13366,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_taskbarcmn.o \
 	monodll_msw_aboutdlg.o \
 	monodll_msw_notifmsg.o \
+	monodll_msw_richtooltip.o \
 	monodll_msw_sound.o \
 	monodll_msw_taskbar.o \
 	monodll_msw_joystick.o
@@ -13386,6 +13405,7 @@ COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS =  \
 	monodll_taskbarcmn.o \
 	monodll_msw_aboutdlg.o \
 	monodll_msw_notifmsg.o \
+	monodll_msw_richtooltip.o \
 	monodll_msw_sound.o \
 	monodll_msw_taskbar.o
 @COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS)
@@ -13534,6 +13554,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_taskbarcmn.o \
 	monolib_msw_aboutdlg.o \
 	monolib_msw_notifmsg.o \
+	monolib_msw_richtooltip.o \
 	monolib_msw_sound.o \
 	monolib_msw_taskbar.o \
 	monolib_msw_joystick.o
@@ -13572,6 +13593,7 @@ COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_0 =  \
 	monolib_taskbarcmn.o \
 	monolib_msw_aboutdlg.o \
 	monolib_msw_notifmsg.o \
+	monolib_msw_richtooltip.o \
 	monolib_msw_sound.o \
 	monolib_msw_taskbar.o
 @COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_0 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_0)
@@ -13818,6 +13840,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
 	advdll_taskbarcmn.o \
 	advdll_msw_aboutdlg.o \
 	advdll_msw_notifmsg.o \
+	advdll_msw_richtooltip.o \
 	advdll_msw_sound.o \
 	advdll_msw_taskbar.o \
 	advdll_msw_joystick.o
@@ -13856,6 +13879,7 @@ COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_8 =  \
 	advdll_taskbarcmn.o \
 	advdll_msw_aboutdlg.o \
 	advdll_msw_notifmsg.o \
+	advdll_msw_richtooltip.o \
 	advdll_msw_sound.o \
 	advdll_msw_taskbar.o
 @COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_8 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_8)
@@ -13906,6 +13930,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
 	advlib_taskbarcmn.o \
 	advlib_msw_aboutdlg.o \
 	advlib_msw_notifmsg.o \
+	advlib_msw_richtooltip.o \
 	advlib_msw_sound.o \
 	advlib_msw_taskbar.o \
 	advlib_msw_joystick.o
@@ -13944,6 +13969,7 @@ COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_9 =  \
 	advlib_taskbarcmn.o \
 	advlib_msw_aboutdlg.o \
 	advlib_msw_notifmsg.o \
+	advlib_msw_richtooltip.o \
 	advlib_msw_sound.o \
 	advlib_msw_taskbar.o
 @COND_TOOLKIT_WINCE@__ADVANCED_PLATFORM_SRC_OBJECTS_9 = $(COND_TOOLKIT_WINCE___ADVANCED_PLATFORM_SRC_OBJECTS_9)
@@ -20643,6 +20669,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@monodll_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/odcombocmn.cpp
 
+@COND_USE_GUI_1@monodll_richtooltipcmn.o: $(srcdir)/src/common/richtooltipcmn.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/richtooltipcmn.cpp
+
 @COND_USE_GUI_1@monodll_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp
 
@@ -20697,6 +20726,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@monodll_propdlg.o: $(srcdir)/src/generic/propdlg.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/propdlg.cpp
 
+@COND_USE_GUI_1@monodll_generic_richtooltip.o: $(srcdir)/src/generic/richtooltip.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/richtooltip.cpp
+
 @COND_USE_GUI_1@monodll_sashwin.o: $(srcdir)/src/generic/sashwin.cpp $(MONODLL_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/sashwin.cpp
 
@@ -20757,6 +20789,12 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_WINCE_USE_GUI_1@monodll_msw_notifmsg.o: $(srcdir)/src/msw/notifmsg.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/notifmsg.cpp
 
+@COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
+@COND_TOOLKIT_WINCE_USE_GUI_1@monodll_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
 @COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_sound.o: $(srcdir)/src/msw/sound.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/sound.cpp
 
@@ -26016,6 +26054,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@monolib_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/odcombocmn.cpp
 
+@COND_USE_GUI_1@monolib_richtooltipcmn.o: $(srcdir)/src/common/richtooltipcmn.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/richtooltipcmn.cpp
+
 @COND_USE_GUI_1@monolib_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp
 
@@ -26070,6 +26111,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@monolib_propdlg.o: $(srcdir)/src/generic/propdlg.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/propdlg.cpp
 
+@COND_USE_GUI_1@monolib_generic_richtooltip.o: $(srcdir)/src/generic/richtooltip.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/richtooltip.cpp
+
 @COND_USE_GUI_1@monolib_sashwin.o: $(srcdir)/src/generic/sashwin.cpp $(MONOLIB_ODEP)
 @COND_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/sashwin.cpp
 
@@ -26130,6 +26174,12 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_WINCE_USE_GUI_1@monolib_msw_notifmsg.o: $(srcdir)/src/msw/notifmsg.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/notifmsg.cpp
 
+@COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
+@COND_TOOLKIT_WINCE_USE_GUI_1@monolib_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_WINCE_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
 @COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_sound.o: $(srcdir)/src/msw/sound.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MSW_USE_GUI_1@	$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/sound.cpp
 
@@ -35586,6 +35636,9 @@ advdll_hyperlnkcmn.o: $(srcdir)/src/common/hyperlnkcmn.cpp $(ADVDLL_ODEP)
 advdll_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/odcombocmn.cpp
 
+advdll_richtooltipcmn.o: $(srcdir)/src/common/richtooltipcmn.cpp $(ADVDLL_ODEP)
+	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/richtooltipcmn.cpp
+
 advdll_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp
 
@@ -35640,6 +35693,9 @@ advdll_odcombo.o: $(srcdir)/src/generic/odcombo.cpp $(ADVDLL_ODEP)
 advdll_propdlg.o: $(srcdir)/src/generic/propdlg.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/propdlg.cpp
 
+advdll_generic_richtooltip.o: $(srcdir)/src/generic/richtooltip.cpp $(ADVDLL_ODEP)
+	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/richtooltip.cpp
+
 advdll_sashwin.o: $(srcdir)/src/generic/sashwin.cpp $(ADVDLL_ODEP)
 	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/sashwin.cpp
 
@@ -35700,6 +35756,12 @@ advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_WINCE@advdll_msw_notifmsg.o: $(srcdir)/src/msw/notifmsg.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/notifmsg.cpp
 
+@COND_TOOLKIT_MSW@advdll_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
+@COND_TOOLKIT_WINCE@advdll_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
 @COND_TOOLKIT_MSW@advdll_msw_sound.o: $(srcdir)/src/msw/sound.cpp $(ADVDLL_ODEP)
 @COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/sound.cpp
 
@@ -35961,6 +36023,9 @@ advlib_hyperlnkcmn.o: $(srcdir)/src/common/hyperlnkcmn.cpp $(ADVLIB_ODEP)
 advlib_odcombocmn.o: $(srcdir)/src/common/odcombocmn.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/odcombocmn.cpp
 
+advlib_richtooltipcmn.o: $(srcdir)/src/common/richtooltipcmn.cpp $(ADVLIB_ODEP)
+	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/richtooltipcmn.cpp
+
 advlib_aboutdlgg.o: $(srcdir)/src/generic/aboutdlgg.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/aboutdlgg.cpp
 
@@ -36015,6 +36080,9 @@ advlib_odcombo.o: $(srcdir)/src/generic/odcombo.cpp $(ADVLIB_ODEP)
 advlib_propdlg.o: $(srcdir)/src/generic/propdlg.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/propdlg.cpp
 
+advlib_generic_richtooltip.o: $(srcdir)/src/generic/richtooltip.cpp $(ADVLIB_ODEP)
+	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/richtooltip.cpp
+
 advlib_sashwin.o: $(srcdir)/src/generic/sashwin.cpp $(ADVLIB_ODEP)
 	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/sashwin.cpp
 
@@ -36075,6 +36143,12 @@ advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_WINCE@advlib_msw_notifmsg.o: $(srcdir)/src/msw/notifmsg.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/notifmsg.cpp
 
+@COND_TOOLKIT_MSW@advlib_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
+@COND_TOOLKIT_WINCE@advlib_msw_richtooltip.o: $(srcdir)/src/msw/richtooltip.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_WINCE@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/richtooltip.cpp
+
 @COND_TOOLKIT_MSW@advlib_msw_sound.o: $(srcdir)/src/msw/sound.cpp $(ADVLIB_ODEP)
 @COND_TOOLKIT_MSW@	$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/sound.cpp
 
diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl
index 1e73c71304..ad1aeda0e7 100644
--- a/build/bakefiles/files.bkl
+++ b/build/bakefiles/files.bkl
@@ -2961,6 +2961,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/common/gridcmn.cpp
     src/common/hyperlnkcmn.cpp
     src/common/odcombocmn.cpp
+    src/common/richtooltipcmn.cpp
     src/generic/aboutdlgg.cpp
     src/generic/bannerwindow.cpp
     src/generic/bmpcboxg.cpp
@@ -2979,6 +2980,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/generic/notifmsgg.cpp
     src/generic/odcombo.cpp
     src/generic/propdlg.cpp
+    src/generic/richtooltip.cpp
     src/generic/sashwin.cpp
     src/generic/splash.cpp
     src/generic/timectrl.cpp
@@ -3027,6 +3029,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/notifmsg.h
     wx/odcombo.h
     wx/propdlg.h
+    wx/richtooltip.h
     wx/sashwin.h
     wx/sound.h
     wx/splash.h
@@ -3041,6 +3044,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/common/taskbarcmn.cpp
     src/msw/aboutdlg.cpp
     src/msw/notifmsg.cpp
+    src/msw/richtooltip.cpp
     src/msw/sound.cpp
     src/msw/taskbar.cpp
 </set>
diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc
index d5711717d8..47b46c3e3c 100644
--- a/build/msw/makefile.bcc
+++ b/build/msw/makefile.bcc
@@ -2263,6 +2263,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.obj \
 	$(OBJS)\monodll_hyperlnkcmn.obj \
 	$(OBJS)\monodll_odcombocmn.obj \
+	$(OBJS)\monodll_richtooltipcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bannerwindow.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -2281,6 +2282,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.obj \
 	$(OBJS)\monodll_odcombo.obj \
 	$(OBJS)\monodll_propdlg.obj \
+	$(OBJS)\monodll_generic_richtooltip.obj \
 	$(OBJS)\monodll_sashwin.obj \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_generic_timectrl.obj \
@@ -2290,6 +2292,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_notifmsg.obj \
+	$(OBJS)\monodll_msw_richtooltip.obj \
 	$(OBJS)\monodll_sound.obj \
 	$(OBJS)\monodll_taskbar.obj \
 	$(OBJS)\monodll_joystick.obj \
@@ -2312,6 +2315,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.obj \
 	$(OBJS)\monodll_hyperlnkcmn.obj \
 	$(OBJS)\monodll_odcombocmn.obj \
+	$(OBJS)\monodll_richtooltipcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bannerwindow.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -2330,6 +2334,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.obj \
 	$(OBJS)\monodll_odcombo.obj \
 	$(OBJS)\monodll_propdlg.obj \
+	$(OBJS)\monodll_generic_richtooltip.obj \
 	$(OBJS)\monodll_sashwin.obj \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_generic_timectrl.obj \
@@ -2339,6 +2344,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_notifmsg.obj \
+	$(OBJS)\monodll_msw_richtooltip.obj \
 	$(OBJS)\monodll_sound.obj \
 	$(OBJS)\monodll_taskbar.obj \
 	$(OBJS)\monodll_joystick.obj \
@@ -3040,6 +3046,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.obj \
 	$(OBJS)\monolib_hyperlnkcmn.obj \
 	$(OBJS)\monolib_odcombocmn.obj \
+	$(OBJS)\monolib_richtooltipcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bannerwindow.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -3058,6 +3065,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.obj \
 	$(OBJS)\monolib_odcombo.obj \
 	$(OBJS)\monolib_propdlg.obj \
+	$(OBJS)\monolib_generic_richtooltip.obj \
 	$(OBJS)\monolib_sashwin.obj \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_generic_timectrl.obj \
@@ -3067,6 +3075,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_notifmsg.obj \
+	$(OBJS)\monolib_msw_richtooltip.obj \
 	$(OBJS)\monolib_sound.obj \
 	$(OBJS)\monolib_taskbar.obj \
 	$(OBJS)\monolib_joystick.obj \
@@ -3089,6 +3098,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.obj \
 	$(OBJS)\monolib_hyperlnkcmn.obj \
 	$(OBJS)\monolib_odcombocmn.obj \
+	$(OBJS)\monolib_richtooltipcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bannerwindow.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -3107,6 +3117,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.obj \
 	$(OBJS)\monolib_odcombo.obj \
 	$(OBJS)\monolib_propdlg.obj \
+	$(OBJS)\monolib_generic_richtooltip.obj \
 	$(OBJS)\monolib_sashwin.obj \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_generic_timectrl.obj \
@@ -3116,6 +3127,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_notifmsg.obj \
+	$(OBJS)\monolib_msw_richtooltip.obj \
 	$(OBJS)\monolib_sound.obj \
 	$(OBJS)\monolib_taskbar.obj \
 	$(OBJS)\monolib_joystick.obj \
@@ -4252,6 +4264,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.obj \
 	$(OBJS)\advdll_hyperlnkcmn.obj \
 	$(OBJS)\advdll_odcombocmn.obj \
+	$(OBJS)\advdll_richtooltipcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bannerwindow.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -4270,6 +4283,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.obj \
 	$(OBJS)\advdll_odcombo.obj \
 	$(OBJS)\advdll_propdlg.obj \
+	$(OBJS)\advdll_generic_richtooltip.obj \
 	$(OBJS)\advdll_sashwin.obj \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_generic_timectrl.obj \
@@ -4279,6 +4293,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_notifmsg.obj \
+	$(OBJS)\advdll_msw_richtooltip.obj \
 	$(OBJS)\advdll_sound.obj \
 	$(OBJS)\advdll_taskbar.obj \
 	$(OBJS)\advdll_joystick.obj \
@@ -4301,6 +4316,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.obj \
 	$(OBJS)\advdll_hyperlnkcmn.obj \
 	$(OBJS)\advdll_odcombocmn.obj \
+	$(OBJS)\advdll_richtooltipcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bannerwindow.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -4319,6 +4335,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.obj \
 	$(OBJS)\advdll_odcombo.obj \
 	$(OBJS)\advdll_propdlg.obj \
+	$(OBJS)\advdll_generic_richtooltip.obj \
 	$(OBJS)\advdll_sashwin.obj \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_generic_timectrl.obj \
@@ -4328,6 +4345,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_notifmsg.obj \
+	$(OBJS)\advdll_msw_richtooltip.obj \
 	$(OBJS)\advdll_sound.obj \
 	$(OBJS)\advdll_taskbar.obj \
 	$(OBJS)\advdll_joystick.obj \
@@ -4346,6 +4364,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.obj \
 	$(OBJS)\advlib_hyperlnkcmn.obj \
 	$(OBJS)\advlib_odcombocmn.obj \
+	$(OBJS)\advlib_richtooltipcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bannerwindow.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -4364,6 +4383,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.obj \
 	$(OBJS)\advlib_odcombo.obj \
 	$(OBJS)\advlib_propdlg.obj \
+	$(OBJS)\advlib_generic_richtooltip.obj \
 	$(OBJS)\advlib_sashwin.obj \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_generic_timectrl.obj \
@@ -4373,6 +4393,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_notifmsg.obj \
+	$(OBJS)\advlib_msw_richtooltip.obj \
 	$(OBJS)\advlib_sound.obj \
 	$(OBJS)\advlib_taskbar.obj \
 	$(OBJS)\advlib_joystick.obj \
@@ -4395,6 +4416,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.obj \
 	$(OBJS)\advlib_hyperlnkcmn.obj \
 	$(OBJS)\advlib_odcombocmn.obj \
+	$(OBJS)\advlib_richtooltipcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bannerwindow.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -4413,6 +4435,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.obj \
 	$(OBJS)\advlib_odcombo.obj \
 	$(OBJS)\advlib_propdlg.obj \
+	$(OBJS)\advlib_generic_richtooltip.obj \
 	$(OBJS)\advlib_sashwin.obj \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_generic_timectrl.obj \
@@ -4422,6 +4445,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_notifmsg.obj \
+	$(OBJS)\advlib_msw_richtooltip.obj \
 	$(OBJS)\advlib_sound.obj \
 	$(OBJS)\advlib_taskbar.obj \
 	$(OBJS)\advlib_joystick.obj \
@@ -8251,6 +8275,11 @@ $(OBJS)\monodll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 !endif
@@ -8341,6 +8370,11 @@ $(OBJS)\monodll_propdlg.obj: ..\..\src\generic\propdlg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 !endif
@@ -8386,6 +8420,11 @@ $(OBJS)\monodll_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\sound.cpp
 !endif
@@ -10638,6 +10677,11 @@ $(OBJS)\monolib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 !endif
@@ -10728,6 +10772,11 @@ $(OBJS)\monolib_propdlg.obj: ..\..\src\generic\propdlg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 !endif
@@ -10773,6 +10822,11 @@ $(OBJS)\monolib_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\sound.cpp
 !endif
@@ -14418,6 +14472,9 @@ $(OBJS)\advdll_hyperlnkcmn.obj: ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advdll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\odcombocmn.cpp
 
+$(OBJS)\advdll_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+
 $(OBJS)\advdll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 
@@ -14472,6 +14529,9 @@ $(OBJS)\advdll_odcombo.obj: ..\..\src\generic\odcombo.cpp
 $(OBJS)\advdll_propdlg.obj: ..\..\src\generic\propdlg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\propdlg.cpp
 
+$(OBJS)\advdll_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+
 $(OBJS)\advdll_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 
@@ -14499,6 +14559,9 @@ $(OBJS)\advdll_aboutdlg.obj: ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advdll_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\notifmsg.cpp
 
+$(OBJS)\advdll_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+
 $(OBJS)\advdll_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\sound.cpp
 
@@ -14559,6 +14622,9 @@ $(OBJS)\advlib_hyperlnkcmn.obj: ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advlib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\odcombocmn.cpp
 
+$(OBJS)\advlib_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+
 $(OBJS)\advlib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 
@@ -14613,6 +14679,9 @@ $(OBJS)\advlib_odcombo.obj: ..\..\src\generic\odcombo.cpp
 $(OBJS)\advlib_propdlg.obj: ..\..\src\generic\propdlg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\propdlg.cpp
 
+$(OBJS)\advlib_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+
 $(OBJS)\advlib_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 
@@ -14640,6 +14709,9 @@ $(OBJS)\advlib_aboutdlg.obj: ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advlib_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\notifmsg.cpp
 
+$(OBJS)\advlib_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+
 $(OBJS)\advlib_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\sound.cpp
 
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index 7ecbd48b78..1d29168a4c 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -2278,6 +2278,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.o \
 	$(OBJS)\monodll_hyperlnkcmn.o \
 	$(OBJS)\monodll_odcombocmn.o \
+	$(OBJS)\monodll_richtooltipcmn.o \
 	$(OBJS)\monodll_aboutdlgg.o \
 	$(OBJS)\monodll_bannerwindow.o \
 	$(OBJS)\monodll_bmpcboxg.o \
@@ -2296,6 +2297,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.o \
 	$(OBJS)\monodll_odcombo.o \
 	$(OBJS)\monodll_propdlg.o \
+	$(OBJS)\monodll_generic_richtooltip.o \
 	$(OBJS)\monodll_sashwin.o \
 	$(OBJS)\monodll_splash.o \
 	$(OBJS)\monodll_generic_timectrl.o \
@@ -2305,6 +2307,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.o \
 	$(OBJS)\monodll_aboutdlg.o \
 	$(OBJS)\monodll_notifmsg.o \
+	$(OBJS)\monodll_msw_richtooltip.o \
 	$(OBJS)\monodll_sound.o \
 	$(OBJS)\monodll_taskbar.o \
 	$(OBJS)\monodll_joystick.o \
@@ -2327,6 +2330,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.o \
 	$(OBJS)\monodll_hyperlnkcmn.o \
 	$(OBJS)\monodll_odcombocmn.o \
+	$(OBJS)\monodll_richtooltipcmn.o \
 	$(OBJS)\monodll_aboutdlgg.o \
 	$(OBJS)\monodll_bannerwindow.o \
 	$(OBJS)\monodll_bmpcboxg.o \
@@ -2345,6 +2349,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.o \
 	$(OBJS)\monodll_odcombo.o \
 	$(OBJS)\monodll_propdlg.o \
+	$(OBJS)\monodll_generic_richtooltip.o \
 	$(OBJS)\monodll_sashwin.o \
 	$(OBJS)\monodll_splash.o \
 	$(OBJS)\monodll_generic_timectrl.o \
@@ -2354,6 +2359,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.o \
 	$(OBJS)\monodll_aboutdlg.o \
 	$(OBJS)\monodll_notifmsg.o \
+	$(OBJS)\monodll_msw_richtooltip.o \
 	$(OBJS)\monodll_sound.o \
 	$(OBJS)\monodll_taskbar.o \
 	$(OBJS)\monodll_joystick.o \
@@ -3061,6 +3067,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.o \
 	$(OBJS)\monolib_hyperlnkcmn.o \
 	$(OBJS)\monolib_odcombocmn.o \
+	$(OBJS)\monolib_richtooltipcmn.o \
 	$(OBJS)\monolib_aboutdlgg.o \
 	$(OBJS)\monolib_bannerwindow.o \
 	$(OBJS)\monolib_bmpcboxg.o \
@@ -3079,6 +3086,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.o \
 	$(OBJS)\monolib_odcombo.o \
 	$(OBJS)\monolib_propdlg.o \
+	$(OBJS)\monolib_generic_richtooltip.o \
 	$(OBJS)\monolib_sashwin.o \
 	$(OBJS)\monolib_splash.o \
 	$(OBJS)\monolib_generic_timectrl.o \
@@ -3088,6 +3096,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.o \
 	$(OBJS)\monolib_aboutdlg.o \
 	$(OBJS)\monolib_notifmsg.o \
+	$(OBJS)\monolib_msw_richtooltip.o \
 	$(OBJS)\monolib_sound.o \
 	$(OBJS)\monolib_taskbar.o \
 	$(OBJS)\monolib_joystick.o \
@@ -3110,6 +3119,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.o \
 	$(OBJS)\monolib_hyperlnkcmn.o \
 	$(OBJS)\monolib_odcombocmn.o \
+	$(OBJS)\monolib_richtooltipcmn.o \
 	$(OBJS)\monolib_aboutdlgg.o \
 	$(OBJS)\monolib_bannerwindow.o \
 	$(OBJS)\monolib_bmpcboxg.o \
@@ -3128,6 +3138,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.o \
 	$(OBJS)\monolib_odcombo.o \
 	$(OBJS)\monolib_propdlg.o \
+	$(OBJS)\monolib_generic_richtooltip.o \
 	$(OBJS)\monolib_sashwin.o \
 	$(OBJS)\monolib_splash.o \
 	$(OBJS)\monolib_generic_timectrl.o \
@@ -3137,6 +3148,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.o \
 	$(OBJS)\monolib_aboutdlg.o \
 	$(OBJS)\monolib_notifmsg.o \
+	$(OBJS)\monolib_msw_richtooltip.o \
 	$(OBJS)\monolib_sound.o \
 	$(OBJS)\monolib_taskbar.o \
 	$(OBJS)\monolib_joystick.o \
@@ -4301,6 +4313,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.o \
 	$(OBJS)\advdll_hyperlnkcmn.o \
 	$(OBJS)\advdll_odcombocmn.o \
+	$(OBJS)\advdll_richtooltipcmn.o \
 	$(OBJS)\advdll_aboutdlgg.o \
 	$(OBJS)\advdll_bannerwindow.o \
 	$(OBJS)\advdll_bmpcboxg.o \
@@ -4319,6 +4332,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.o \
 	$(OBJS)\advdll_odcombo.o \
 	$(OBJS)\advdll_propdlg.o \
+	$(OBJS)\advdll_generic_richtooltip.o \
 	$(OBJS)\advdll_sashwin.o \
 	$(OBJS)\advdll_splash.o \
 	$(OBJS)\advdll_generic_timectrl.o \
@@ -4328,6 +4342,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.o \
 	$(OBJS)\advdll_aboutdlg.o \
 	$(OBJS)\advdll_notifmsg.o \
+	$(OBJS)\advdll_msw_richtooltip.o \
 	$(OBJS)\advdll_sound.o \
 	$(OBJS)\advdll_taskbar.o \
 	$(OBJS)\advdll_joystick.o \
@@ -4350,6 +4365,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.o \
 	$(OBJS)\advdll_hyperlnkcmn.o \
 	$(OBJS)\advdll_odcombocmn.o \
+	$(OBJS)\advdll_richtooltipcmn.o \
 	$(OBJS)\advdll_aboutdlgg.o \
 	$(OBJS)\advdll_bannerwindow.o \
 	$(OBJS)\advdll_bmpcboxg.o \
@@ -4368,6 +4384,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.o \
 	$(OBJS)\advdll_odcombo.o \
 	$(OBJS)\advdll_propdlg.o \
+	$(OBJS)\advdll_generic_richtooltip.o \
 	$(OBJS)\advdll_sashwin.o \
 	$(OBJS)\advdll_splash.o \
 	$(OBJS)\advdll_generic_timectrl.o \
@@ -4377,6 +4394,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.o \
 	$(OBJS)\advdll_aboutdlg.o \
 	$(OBJS)\advdll_notifmsg.o \
+	$(OBJS)\advdll_msw_richtooltip.o \
 	$(OBJS)\advdll_sound.o \
 	$(OBJS)\advdll_taskbar.o \
 	$(OBJS)\advdll_joystick.o \
@@ -4399,6 +4417,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.o \
 	$(OBJS)\advlib_hyperlnkcmn.o \
 	$(OBJS)\advlib_odcombocmn.o \
+	$(OBJS)\advlib_richtooltipcmn.o \
 	$(OBJS)\advlib_aboutdlgg.o \
 	$(OBJS)\advlib_bannerwindow.o \
 	$(OBJS)\advlib_bmpcboxg.o \
@@ -4417,6 +4436,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.o \
 	$(OBJS)\advlib_odcombo.o \
 	$(OBJS)\advlib_propdlg.o \
+	$(OBJS)\advlib_generic_richtooltip.o \
 	$(OBJS)\advlib_sashwin.o \
 	$(OBJS)\advlib_splash.o \
 	$(OBJS)\advlib_generic_timectrl.o \
@@ -4426,6 +4446,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.o \
 	$(OBJS)\advlib_aboutdlg.o \
 	$(OBJS)\advlib_notifmsg.o \
+	$(OBJS)\advlib_msw_richtooltip.o \
 	$(OBJS)\advlib_sound.o \
 	$(OBJS)\advlib_taskbar.o \
 	$(OBJS)\advlib_joystick.o \
@@ -4448,6 +4469,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.o \
 	$(OBJS)\advlib_hyperlnkcmn.o \
 	$(OBJS)\advlib_odcombocmn.o \
+	$(OBJS)\advlib_richtooltipcmn.o \
 	$(OBJS)\advlib_aboutdlgg.o \
 	$(OBJS)\advlib_bannerwindow.o \
 	$(OBJS)\advlib_bmpcboxg.o \
@@ -4466,6 +4488,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.o \
 	$(OBJS)\advlib_odcombo.o \
 	$(OBJS)\advlib_propdlg.o \
+	$(OBJS)\advlib_generic_richtooltip.o \
 	$(OBJS)\advlib_sashwin.o \
 	$(OBJS)\advlib_splash.o \
 	$(OBJS)\advlib_generic_timectrl.o \
@@ -4475,6 +4498,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.o \
 	$(OBJS)\advlib_aboutdlg.o \
 	$(OBJS)\advlib_notifmsg.o \
+	$(OBJS)\advlib_msw_richtooltip.o \
 	$(OBJS)\advlib_sound.o \
 	$(OBJS)\advlib_taskbar.o \
 	$(OBJS)\advlib_joystick.o \
@@ -8419,6 +8443,11 @@ $(OBJS)\monodll_odcombocmn.o: ../../src/common/odcombocmn.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_richtooltipcmn.o: ../../src/common/richtooltipcmn.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -8509,6 +8538,11 @@ $(OBJS)\monodll_propdlg.o: ../../src/generic/propdlg.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_generic_richtooltip.o: ../../src/generic/richtooltip.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_sashwin.o: ../../src/generic/sashwin.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -8554,6 +8588,11 @@ $(OBJS)\monodll_notifmsg.o: ../../src/msw/notifmsg.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_msw_richtooltip.o: ../../src/msw/richtooltip.cpp
+	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monodll_sound.o: ../../src/msw/sound.cpp
 	$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -10806,6 +10845,11 @@ $(OBJS)\monolib_odcombocmn.o: ../../src/common/odcombocmn.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_richtooltipcmn.o: ../../src/common/richtooltipcmn.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -10896,6 +10940,11 @@ $(OBJS)\monolib_propdlg.o: ../../src/generic/propdlg.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_generic_richtooltip.o: ../../src/generic/richtooltip.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_sashwin.o: ../../src/generic/sashwin.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -10941,6 +10990,11 @@ $(OBJS)\monolib_notifmsg.o: ../../src/msw/notifmsg.cpp
 endif
 
 ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_msw_richtooltip.o: ../../src/msw/richtooltip.cpp
+	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
+ifeq ($(USE_GUI),1)
 $(OBJS)\monolib_sound.o: ../../src/msw/sound.cpp
 	$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
 endif
@@ -14586,6 +14640,9 @@ $(OBJS)\advdll_hyperlnkcmn.o: ../../src/common/hyperlnkcmn.cpp
 $(OBJS)\advdll_odcombocmn.o: ../../src/common/odcombocmn.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advdll_richtooltipcmn.o: ../../src/common/richtooltipcmn.cpp
+	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advdll_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -14640,6 +14697,9 @@ $(OBJS)\advdll_odcombo.o: ../../src/generic/odcombo.cpp
 $(OBJS)\advdll_propdlg.o: ../../src/generic/propdlg.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advdll_generic_richtooltip.o: ../../src/generic/richtooltip.cpp
+	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advdll_sashwin.o: ../../src/generic/sashwin.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -14667,6 +14727,9 @@ $(OBJS)\advdll_aboutdlg.o: ../../src/msw/aboutdlg.cpp
 $(OBJS)\advdll_notifmsg.o: ../../src/msw/notifmsg.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advdll_msw_richtooltip.o: ../../src/msw/richtooltip.cpp
+	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advdll_sound.o: ../../src/msw/sound.cpp
 	$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -14727,6 +14790,9 @@ $(OBJS)\advlib_hyperlnkcmn.o: ../../src/common/hyperlnkcmn.cpp
 $(OBJS)\advlib_odcombocmn.o: ../../src/common/odcombocmn.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advlib_richtooltipcmn.o: ../../src/common/richtooltipcmn.cpp
+	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advlib_aboutdlgg.o: ../../src/generic/aboutdlgg.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -14781,6 +14847,9 @@ $(OBJS)\advlib_odcombo.o: ../../src/generic/odcombo.cpp
 $(OBJS)\advlib_propdlg.o: ../../src/generic/propdlg.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advlib_generic_richtooltip.o: ../../src/generic/richtooltip.cpp
+	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advlib_sashwin.o: ../../src/generic/sashwin.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -14808,6 +14877,9 @@ $(OBJS)\advlib_aboutdlg.o: ../../src/msw/aboutdlg.cpp
 $(OBJS)\advlib_notifmsg.o: ../../src/msw/notifmsg.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\advlib_msw_richtooltip.o: ../../src/msw/richtooltip.cpp
+	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\advlib_sound.o: ../../src/msw/sound.cpp
 	$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
 
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index 51871e75ab..42bae81a24 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -2477,6 +2477,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.obj \
 	$(OBJS)\monodll_hyperlnkcmn.obj \
 	$(OBJS)\monodll_odcombocmn.obj \
+	$(OBJS)\monodll_richtooltipcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bannerwindow.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -2495,6 +2496,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.obj \
 	$(OBJS)\monodll_odcombo.obj \
 	$(OBJS)\monodll_propdlg.obj \
+	$(OBJS)\monodll_generic_richtooltip.obj \
 	$(OBJS)\monodll_sashwin.obj \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_generic_timectrl.obj \
@@ -2504,6 +2506,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_notifmsg.obj \
+	$(OBJS)\monodll_msw_richtooltip.obj \
 	$(OBJS)\monodll_sound.obj \
 	$(OBJS)\monodll_taskbar.obj \
 	$(OBJS)\monodll_joystick.obj \
@@ -2526,6 +2529,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_gridcmn.obj \
 	$(OBJS)\monodll_hyperlnkcmn.obj \
 	$(OBJS)\monodll_odcombocmn.obj \
+	$(OBJS)\monodll_richtooltipcmn.obj \
 	$(OBJS)\monodll_aboutdlgg.obj \
 	$(OBJS)\monodll_bannerwindow.obj \
 	$(OBJS)\monodll_bmpcboxg.obj \
@@ -2544,6 +2548,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_notifmsgg.obj \
 	$(OBJS)\monodll_odcombo.obj \
 	$(OBJS)\monodll_propdlg.obj \
+	$(OBJS)\monodll_generic_richtooltip.obj \
 	$(OBJS)\monodll_sashwin.obj \
 	$(OBJS)\monodll_splash.obj \
 	$(OBJS)\monodll_generic_timectrl.obj \
@@ -2553,6 +2558,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  \
 	$(OBJS)\monodll_taskbarcmn.obj \
 	$(OBJS)\monodll_aboutdlg.obj \
 	$(OBJS)\monodll_notifmsg.obj \
+	$(OBJS)\monodll_msw_richtooltip.obj \
 	$(OBJS)\monodll_sound.obj \
 	$(OBJS)\monodll_taskbar.obj \
 	$(OBJS)\monodll_joystick.obj \
@@ -3260,6 +3266,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.obj \
 	$(OBJS)\monolib_hyperlnkcmn.obj \
 	$(OBJS)\monolib_odcombocmn.obj \
+	$(OBJS)\monolib_richtooltipcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bannerwindow.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -3278,6 +3285,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.obj \
 	$(OBJS)\monolib_odcombo.obj \
 	$(OBJS)\monolib_propdlg.obj \
+	$(OBJS)\monolib_generic_richtooltip.obj \
 	$(OBJS)\monolib_sashwin.obj \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_generic_timectrl.obj \
@@ -3287,6 +3295,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_notifmsg.obj \
+	$(OBJS)\monolib_msw_richtooltip.obj \
 	$(OBJS)\monolib_sound.obj \
 	$(OBJS)\monolib_taskbar.obj \
 	$(OBJS)\monolib_joystick.obj \
@@ -3309,6 +3318,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_gridcmn.obj \
 	$(OBJS)\monolib_hyperlnkcmn.obj \
 	$(OBJS)\monolib_odcombocmn.obj \
+	$(OBJS)\monolib_richtooltipcmn.obj \
 	$(OBJS)\monolib_aboutdlgg.obj \
 	$(OBJS)\monolib_bannerwindow.obj \
 	$(OBJS)\monolib_bmpcboxg.obj \
@@ -3327,6 +3337,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_notifmsgg.obj \
 	$(OBJS)\monolib_odcombo.obj \
 	$(OBJS)\monolib_propdlg.obj \
+	$(OBJS)\monolib_generic_richtooltip.obj \
 	$(OBJS)\monolib_sashwin.obj \
 	$(OBJS)\monolib_splash.obj \
 	$(OBJS)\monolib_generic_timectrl.obj \
@@ -3336,6 +3347,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  \
 	$(OBJS)\monolib_taskbarcmn.obj \
 	$(OBJS)\monolib_aboutdlg.obj \
 	$(OBJS)\monolib_notifmsg.obj \
+	$(OBJS)\monolib_msw_richtooltip.obj \
 	$(OBJS)\monolib_sound.obj \
 	$(OBJS)\monolib_taskbar.obj \
 	$(OBJS)\monolib_joystick.obj \
@@ -4562,6 +4574,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.obj \
 	$(OBJS)\advdll_hyperlnkcmn.obj \
 	$(OBJS)\advdll_odcombocmn.obj \
+	$(OBJS)\advdll_richtooltipcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bannerwindow.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -4580,6 +4593,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.obj \
 	$(OBJS)\advdll_odcombo.obj \
 	$(OBJS)\advdll_propdlg.obj \
+	$(OBJS)\advdll_generic_richtooltip.obj \
 	$(OBJS)\advdll_sashwin.obj \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_generic_timectrl.obj \
@@ -4589,6 +4603,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_notifmsg.obj \
+	$(OBJS)\advdll_msw_richtooltip.obj \
 	$(OBJS)\advdll_sound.obj \
 	$(OBJS)\advdll_taskbar.obj \
 	$(OBJS)\advdll_joystick.obj \
@@ -4611,6 +4626,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_gridcmn.obj \
 	$(OBJS)\advdll_hyperlnkcmn.obj \
 	$(OBJS)\advdll_odcombocmn.obj \
+	$(OBJS)\advdll_richtooltipcmn.obj \
 	$(OBJS)\advdll_aboutdlgg.obj \
 	$(OBJS)\advdll_bannerwindow.obj \
 	$(OBJS)\advdll_bmpcboxg.obj \
@@ -4629,6 +4645,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_notifmsgg.obj \
 	$(OBJS)\advdll_odcombo.obj \
 	$(OBJS)\advdll_propdlg.obj \
+	$(OBJS)\advdll_generic_richtooltip.obj \
 	$(OBJS)\advdll_sashwin.obj \
 	$(OBJS)\advdll_splash.obj \
 	$(OBJS)\advdll_generic_timectrl.obj \
@@ -4638,6 +4655,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  \
 	$(OBJS)\advdll_taskbarcmn.obj \
 	$(OBJS)\advdll_aboutdlg.obj \
 	$(OBJS)\advdll_notifmsg.obj \
+	$(OBJS)\advdll_msw_richtooltip.obj \
 	$(OBJS)\advdll_sound.obj \
 	$(OBJS)\advdll_taskbar.obj \
 	$(OBJS)\advdll_joystick.obj \
@@ -4662,6 +4680,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.obj \
 	$(OBJS)\advlib_hyperlnkcmn.obj \
 	$(OBJS)\advlib_odcombocmn.obj \
+	$(OBJS)\advlib_richtooltipcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bannerwindow.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -4680,6 +4699,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.obj \
 	$(OBJS)\advlib_odcombo.obj \
 	$(OBJS)\advlib_propdlg.obj \
+	$(OBJS)\advlib_generic_richtooltip.obj \
 	$(OBJS)\advlib_sashwin.obj \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_generic_timectrl.obj \
@@ -4689,6 +4709,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_notifmsg.obj \
+	$(OBJS)\advlib_msw_richtooltip.obj \
 	$(OBJS)\advlib_sound.obj \
 	$(OBJS)\advlib_taskbar.obj \
 	$(OBJS)\advlib_joystick.obj \
@@ -4711,6 +4732,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_gridcmn.obj \
 	$(OBJS)\advlib_hyperlnkcmn.obj \
 	$(OBJS)\advlib_odcombocmn.obj \
+	$(OBJS)\advlib_richtooltipcmn.obj \
 	$(OBJS)\advlib_aboutdlgg.obj \
 	$(OBJS)\advlib_bannerwindow.obj \
 	$(OBJS)\advlib_bmpcboxg.obj \
@@ -4729,6 +4751,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_notifmsgg.obj \
 	$(OBJS)\advlib_odcombo.obj \
 	$(OBJS)\advlib_propdlg.obj \
+	$(OBJS)\advlib_generic_richtooltip.obj \
 	$(OBJS)\advlib_sashwin.obj \
 	$(OBJS)\advlib_splash.obj \
 	$(OBJS)\advlib_generic_timectrl.obj \
@@ -4738,6 +4761,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  \
 	$(OBJS)\advlib_taskbarcmn.obj \
 	$(OBJS)\advlib_aboutdlg.obj \
 	$(OBJS)\advlib_notifmsg.obj \
+	$(OBJS)\advlib_msw_richtooltip.obj \
 	$(OBJS)\advlib_sound.obj \
 	$(OBJS)\advlib_taskbar.obj \
 	$(OBJS)\advlib_joystick.obj \
@@ -8857,6 +8881,11 @@ $(OBJS)\monodll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 !endif
@@ -8947,6 +8976,11 @@ $(OBJS)\monodll_propdlg.obj: ..\..\src\generic\propdlg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 !endif
@@ -8992,6 +9026,11 @@ $(OBJS)\monodll_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monodll_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\sound.cpp
 !endif
@@ -11244,6 +11283,11 @@ $(OBJS)\monolib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 !endif
@@ -11334,6 +11378,11 @@ $(OBJS)\monolib_propdlg.obj: ..\..\src\generic\propdlg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 !endif
@@ -11379,6 +11428,11 @@ $(OBJS)\monolib_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 !endif
 
 !if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+!endif
+
+!if "$(USE_GUI)" == "1"
 $(OBJS)\monolib_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\sound.cpp
 !endif
@@ -15024,6 +15078,9 @@ $(OBJS)\advdll_hyperlnkcmn.obj: ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advdll_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\odcombocmn.cpp
 
+$(OBJS)\advdll_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+
 $(OBJS)\advdll_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 
@@ -15078,6 +15135,9 @@ $(OBJS)\advdll_odcombo.obj: ..\..\src\generic\odcombo.cpp
 $(OBJS)\advdll_propdlg.obj: ..\..\src\generic\propdlg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\propdlg.cpp
 
+$(OBJS)\advdll_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+
 $(OBJS)\advdll_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 
@@ -15105,6 +15165,9 @@ $(OBJS)\advdll_aboutdlg.obj: ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advdll_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\notifmsg.cpp
 
+$(OBJS)\advdll_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+
 $(OBJS)\advdll_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\sound.cpp
 
@@ -15165,6 +15228,9 @@ $(OBJS)\advlib_hyperlnkcmn.obj: ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advlib_odcombocmn.obj: ..\..\src\common\odcombocmn.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\odcombocmn.cpp
 
+$(OBJS)\advlib_richtooltipcmn.obj: ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\richtooltipcmn.cpp
+
 $(OBJS)\advlib_aboutdlgg.obj: ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\aboutdlgg.cpp
 
@@ -15219,6 +15285,9 @@ $(OBJS)\advlib_odcombo.obj: ..\..\src\generic\odcombo.cpp
 $(OBJS)\advlib_propdlg.obj: ..\..\src\generic\propdlg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\propdlg.cpp
 
+$(OBJS)\advlib_generic_richtooltip.obj: ..\..\src\generic\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\richtooltip.cpp
+
 $(OBJS)\advlib_sashwin.obj: ..\..\src\generic\sashwin.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\generic\sashwin.cpp
 
@@ -15246,6 +15315,9 @@ $(OBJS)\advlib_aboutdlg.obj: ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advlib_notifmsg.obj: ..\..\src\msw\notifmsg.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\notifmsg.cpp
 
+$(OBJS)\advlib_msw_richtooltip.obj: ..\..\src\msw\richtooltip.cpp
+	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\richtooltip.cpp
+
 $(OBJS)\advlib_sound.obj: ..\..\src\msw\sound.cpp
 	$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\sound.cpp
 
diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat
index f85b42f068..60ca3f5095 100644
--- a/build/msw/makefile.wat
+++ b/build/msw/makefile.wat
@@ -796,6 +796,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_gridcmn.obj &
 	$(OBJS)\monodll_hyperlnkcmn.obj &
 	$(OBJS)\monodll_odcombocmn.obj &
+	$(OBJS)\monodll_richtooltipcmn.obj &
 	$(OBJS)\monodll_aboutdlgg.obj &
 	$(OBJS)\monodll_bannerwindow.obj &
 	$(OBJS)\monodll_bmpcboxg.obj &
@@ -814,6 +815,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_notifmsgg.obj &
 	$(OBJS)\monodll_odcombo.obj &
 	$(OBJS)\monodll_propdlg.obj &
+	$(OBJS)\monodll_generic_richtooltip.obj &
 	$(OBJS)\monodll_sashwin.obj &
 	$(OBJS)\monodll_splash.obj &
 	$(OBJS)\monodll_generic_timectrl.obj &
@@ -823,6 +825,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_taskbarcmn.obj &
 	$(OBJS)\monodll_aboutdlg.obj &
 	$(OBJS)\monodll_notifmsg.obj &
+	$(OBJS)\monodll_msw_richtooltip.obj &
 	$(OBJS)\monodll_sound.obj &
 	$(OBJS)\monodll_taskbar.obj &
 	$(OBJS)\monodll_joystick.obj &
@@ -845,6 +848,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_gridcmn.obj &
 	$(OBJS)\monodll_hyperlnkcmn.obj &
 	$(OBJS)\monodll_odcombocmn.obj &
+	$(OBJS)\monodll_richtooltipcmn.obj &
 	$(OBJS)\monodll_aboutdlgg.obj &
 	$(OBJS)\monodll_bannerwindow.obj &
 	$(OBJS)\monodll_bmpcboxg.obj &
@@ -863,6 +867,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_notifmsgg.obj &
 	$(OBJS)\monodll_odcombo.obj &
 	$(OBJS)\monodll_propdlg.obj &
+	$(OBJS)\monodll_generic_richtooltip.obj &
 	$(OBJS)\monodll_sashwin.obj &
 	$(OBJS)\monodll_splash.obj &
 	$(OBJS)\monodll_generic_timectrl.obj &
@@ -872,6 +877,7 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS =  &
 	$(OBJS)\monodll_taskbarcmn.obj &
 	$(OBJS)\monodll_aboutdlg.obj &
 	$(OBJS)\monodll_notifmsg.obj &
+	$(OBJS)\monodll_msw_richtooltip.obj &
 	$(OBJS)\monodll_sound.obj &
 	$(OBJS)\monodll_taskbar.obj &
 	$(OBJS)\monodll_joystick.obj &
@@ -1584,6 +1590,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_gridcmn.obj &
 	$(OBJS)\monolib_hyperlnkcmn.obj &
 	$(OBJS)\monolib_odcombocmn.obj &
+	$(OBJS)\monolib_richtooltipcmn.obj &
 	$(OBJS)\monolib_aboutdlgg.obj &
 	$(OBJS)\monolib_bannerwindow.obj &
 	$(OBJS)\monolib_bmpcboxg.obj &
@@ -1602,6 +1609,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_notifmsgg.obj &
 	$(OBJS)\monolib_odcombo.obj &
 	$(OBJS)\monolib_propdlg.obj &
+	$(OBJS)\monolib_generic_richtooltip.obj &
 	$(OBJS)\monolib_sashwin.obj &
 	$(OBJS)\monolib_splash.obj &
 	$(OBJS)\monolib_generic_timectrl.obj &
@@ -1611,6 +1619,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_taskbarcmn.obj &
 	$(OBJS)\monolib_aboutdlg.obj &
 	$(OBJS)\monolib_notifmsg.obj &
+	$(OBJS)\monolib_msw_richtooltip.obj &
 	$(OBJS)\monolib_sound.obj &
 	$(OBJS)\monolib_taskbar.obj &
 	$(OBJS)\monolib_joystick.obj &
@@ -1633,6 +1642,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_gridcmn.obj &
 	$(OBJS)\monolib_hyperlnkcmn.obj &
 	$(OBJS)\monolib_odcombocmn.obj &
+	$(OBJS)\monolib_richtooltipcmn.obj &
 	$(OBJS)\monolib_aboutdlgg.obj &
 	$(OBJS)\monolib_bannerwindow.obj &
 	$(OBJS)\monolib_bmpcboxg.obj &
@@ -1651,6 +1661,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_notifmsgg.obj &
 	$(OBJS)\monolib_odcombo.obj &
 	$(OBJS)\monolib_propdlg.obj &
+	$(OBJS)\monolib_generic_richtooltip.obj &
 	$(OBJS)\monolib_sashwin.obj &
 	$(OBJS)\monolib_splash.obj &
 	$(OBJS)\monolib_generic_timectrl.obj &
@@ -1660,6 +1671,7 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS =  &
 	$(OBJS)\monolib_taskbarcmn.obj &
 	$(OBJS)\monolib_aboutdlg.obj &
 	$(OBJS)\monolib_notifmsg.obj &
+	$(OBJS)\monolib_msw_richtooltip.obj &
 	$(OBJS)\monolib_sound.obj &
 	$(OBJS)\monolib_taskbar.obj &
 	$(OBJS)\monolib_joystick.obj &
@@ -2840,6 +2852,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_gridcmn.obj &
 	$(OBJS)\advdll_hyperlnkcmn.obj &
 	$(OBJS)\advdll_odcombocmn.obj &
+	$(OBJS)\advdll_richtooltipcmn.obj &
 	$(OBJS)\advdll_aboutdlgg.obj &
 	$(OBJS)\advdll_bannerwindow.obj &
 	$(OBJS)\advdll_bmpcboxg.obj &
@@ -2858,6 +2871,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_notifmsgg.obj &
 	$(OBJS)\advdll_odcombo.obj &
 	$(OBJS)\advdll_propdlg.obj &
+	$(OBJS)\advdll_generic_richtooltip.obj &
 	$(OBJS)\advdll_sashwin.obj &
 	$(OBJS)\advdll_splash.obj &
 	$(OBJS)\advdll_generic_timectrl.obj &
@@ -2867,6 +2881,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_taskbarcmn.obj &
 	$(OBJS)\advdll_aboutdlg.obj &
 	$(OBJS)\advdll_notifmsg.obj &
+	$(OBJS)\advdll_msw_richtooltip.obj &
 	$(OBJS)\advdll_sound.obj &
 	$(OBJS)\advdll_taskbar.obj &
 	$(OBJS)\advdll_joystick.obj &
@@ -2889,6 +2904,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_gridcmn.obj &
 	$(OBJS)\advdll_hyperlnkcmn.obj &
 	$(OBJS)\advdll_odcombocmn.obj &
+	$(OBJS)\advdll_richtooltipcmn.obj &
 	$(OBJS)\advdll_aboutdlgg.obj &
 	$(OBJS)\advdll_bannerwindow.obj &
 	$(OBJS)\advdll_bmpcboxg.obj &
@@ -2907,6 +2923,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_notifmsgg.obj &
 	$(OBJS)\advdll_odcombo.obj &
 	$(OBJS)\advdll_propdlg.obj &
+	$(OBJS)\advdll_generic_richtooltip.obj &
 	$(OBJS)\advdll_sashwin.obj &
 	$(OBJS)\advdll_splash.obj &
 	$(OBJS)\advdll_generic_timectrl.obj &
@@ -2916,6 +2933,7 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS =  &
 	$(OBJS)\advdll_taskbarcmn.obj &
 	$(OBJS)\advdll_aboutdlg.obj &
 	$(OBJS)\advdll_notifmsg.obj &
+	$(OBJS)\advdll_msw_richtooltip.obj &
 	$(OBJS)\advdll_sound.obj &
 	$(OBJS)\advdll_taskbar.obj &
 	$(OBJS)\advdll_joystick.obj &
@@ -2940,6 +2958,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_gridcmn.obj &
 	$(OBJS)\advlib_hyperlnkcmn.obj &
 	$(OBJS)\advlib_odcombocmn.obj &
+	$(OBJS)\advlib_richtooltipcmn.obj &
 	$(OBJS)\advlib_aboutdlgg.obj &
 	$(OBJS)\advlib_bannerwindow.obj &
 	$(OBJS)\advlib_bmpcboxg.obj &
@@ -2958,6 +2977,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_notifmsgg.obj &
 	$(OBJS)\advlib_odcombo.obj &
 	$(OBJS)\advlib_propdlg.obj &
+	$(OBJS)\advlib_generic_richtooltip.obj &
 	$(OBJS)\advlib_sashwin.obj &
 	$(OBJS)\advlib_splash.obj &
 	$(OBJS)\advlib_generic_timectrl.obj &
@@ -2967,6 +2987,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_taskbarcmn.obj &
 	$(OBJS)\advlib_aboutdlg.obj &
 	$(OBJS)\advlib_notifmsg.obj &
+	$(OBJS)\advlib_msw_richtooltip.obj &
 	$(OBJS)\advlib_sound.obj &
 	$(OBJS)\advlib_taskbar.obj &
 	$(OBJS)\advlib_joystick.obj &
@@ -2989,6 +3010,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_gridcmn.obj &
 	$(OBJS)\advlib_hyperlnkcmn.obj &
 	$(OBJS)\advlib_odcombocmn.obj &
+	$(OBJS)\advlib_richtooltipcmn.obj &
 	$(OBJS)\advlib_aboutdlgg.obj &
 	$(OBJS)\advlib_bannerwindow.obj &
 	$(OBJS)\advlib_bmpcboxg.obj &
@@ -3007,6 +3029,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_notifmsgg.obj &
 	$(OBJS)\advlib_odcombo.obj &
 	$(OBJS)\advlib_propdlg.obj &
+	$(OBJS)\advlib_generic_richtooltip.obj &
 	$(OBJS)\advlib_sashwin.obj &
 	$(OBJS)\advlib_splash.obj &
 	$(OBJS)\advlib_generic_timectrl.obj &
@@ -3016,6 +3039,7 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS =  &
 	$(OBJS)\advlib_taskbarcmn.obj &
 	$(OBJS)\advlib_aboutdlg.obj &
 	$(OBJS)\advlib_notifmsg.obj &
+	$(OBJS)\advlib_msw_richtooltip.obj &
 	$(OBJS)\advlib_sound.obj &
 	$(OBJS)\advlib_taskbar.obj &
 	$(OBJS)\advlib_joystick.obj &
@@ -8690,6 +8714,11 @@ $(OBJS)\monodll_odcombocmn.obj :  .AUTODEPEND ..\..\src\common\odcombocmn.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monodll_richtooltipcmn.obj :  .AUTODEPEND ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monodll_aboutdlgg.obj :  .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
@@ -8780,6 +8809,11 @@ $(OBJS)\monodll_propdlg.obj :  .AUTODEPEND ..\..\src\generic\propdlg.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monodll_generic_richtooltip.obj :  .AUTODEPEND ..\..\src\generic\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monodll_sashwin.obj :  .AUTODEPEND ..\..\src\generic\sashwin.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
@@ -8825,6 +8859,11 @@ $(OBJS)\monodll_notifmsg.obj :  .AUTODEPEND ..\..\src\msw\notifmsg.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monodll_msw_richtooltip.obj :  .AUTODEPEND ..\..\src\msw\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monodll_sound.obj :  .AUTODEPEND ..\..\src\msw\sound.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
 !endif
@@ -11077,6 +11116,11 @@ $(OBJS)\monolib_odcombocmn.obj :  .AUTODEPEND ..\..\src\common\odcombocmn.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monolib_richtooltipcmn.obj :  .AUTODEPEND ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monolib_aboutdlgg.obj :  .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
@@ -11167,6 +11211,11 @@ $(OBJS)\monolib_propdlg.obj :  .AUTODEPEND ..\..\src\generic\propdlg.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monolib_generic_richtooltip.obj :  .AUTODEPEND ..\..\src\generic\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monolib_sashwin.obj :  .AUTODEPEND ..\..\src\generic\sashwin.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
@@ -11212,6 +11261,11 @@ $(OBJS)\monolib_notifmsg.obj :  .AUTODEPEND ..\..\src\msw\notifmsg.cpp
 !endif
 
 !ifeq USE_GUI 1
+$(OBJS)\monolib_msw_richtooltip.obj :  .AUTODEPEND ..\..\src\msw\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+!endif
+
+!ifeq USE_GUI 1
 $(OBJS)\monolib_sound.obj :  .AUTODEPEND ..\..\src\msw\sound.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
 !endif
@@ -14857,6 +14911,9 @@ $(OBJS)\advdll_hyperlnkcmn.obj :  .AUTODEPEND ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advdll_odcombocmn.obj :  .AUTODEPEND ..\..\src\common\odcombocmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
+$(OBJS)\advdll_richtooltipcmn.obj :  .AUTODEPEND ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
+
 $(OBJS)\advdll_aboutdlgg.obj :  .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
@@ -14911,6 +14968,9 @@ $(OBJS)\advdll_odcombo.obj :  .AUTODEPEND ..\..\src\generic\odcombo.cpp
 $(OBJS)\advdll_propdlg.obj :  .AUTODEPEND ..\..\src\generic\propdlg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
+$(OBJS)\advdll_generic_richtooltip.obj :  .AUTODEPEND ..\..\src\generic\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
+
 $(OBJS)\advdll_sashwin.obj :  .AUTODEPEND ..\..\src\generic\sashwin.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
@@ -14938,6 +14998,9 @@ $(OBJS)\advdll_aboutdlg.obj :  .AUTODEPEND ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advdll_notifmsg.obj :  .AUTODEPEND ..\..\src\msw\notifmsg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
+$(OBJS)\advdll_msw_richtooltip.obj :  .AUTODEPEND ..\..\src\msw\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
+
 $(OBJS)\advdll_sound.obj :  .AUTODEPEND ..\..\src\msw\sound.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVDLL_CXXFLAGS) $<
 
@@ -14998,6 +15061,9 @@ $(OBJS)\advlib_hyperlnkcmn.obj :  .AUTODEPEND ..\..\src\common\hyperlnkcmn.cpp
 $(OBJS)\advlib_odcombocmn.obj :  .AUTODEPEND ..\..\src\common\odcombocmn.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
+$(OBJS)\advlib_richtooltipcmn.obj :  .AUTODEPEND ..\..\src\common\richtooltipcmn.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
+
 $(OBJS)\advlib_aboutdlgg.obj :  .AUTODEPEND ..\..\src\generic\aboutdlgg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
@@ -15052,6 +15118,9 @@ $(OBJS)\advlib_odcombo.obj :  .AUTODEPEND ..\..\src\generic\odcombo.cpp
 $(OBJS)\advlib_propdlg.obj :  .AUTODEPEND ..\..\src\generic\propdlg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
+$(OBJS)\advlib_generic_richtooltip.obj :  .AUTODEPEND ..\..\src\generic\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
+
 $(OBJS)\advlib_sashwin.obj :  .AUTODEPEND ..\..\src\generic\sashwin.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
@@ -15079,6 +15148,9 @@ $(OBJS)\advlib_aboutdlg.obj :  .AUTODEPEND ..\..\src\msw\aboutdlg.cpp
 $(OBJS)\advlib_notifmsg.obj :  .AUTODEPEND ..\..\src\msw\notifmsg.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
+$(OBJS)\advlib_msw_richtooltip.obj :  .AUTODEPEND ..\..\src\msw\richtooltip.cpp
+	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
+
 $(OBJS)\advlib_sound.obj :  .AUTODEPEND ..\..\src\msw\sound.cpp
 	$(CXX) -bt=nt -zq -fo=$^@ $(ADVLIB_CXXFLAGS) $<
 
diff --git a/build/msw/wx_adv.dsp b/build/msw/wx_adv.dsp
index c207230558..b3827a86e0 100644
--- a/build/msw/wx_adv.dsp
+++ b/build/msw/wx_adv.dsp
@@ -278,6 +278,10 @@ SOURCE=..\..\src\common\odcombocmn.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\src\common\richtooltipcmn.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\common\taskbarcmn.cpp
 # End Source File
 # End Group
@@ -543,6 +547,10 @@ SOURCE=..\..\src\msw\notifmsg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\src\msw\richtooltip.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\msw\sound.cpp
 # End Source File
 # Begin Source File
@@ -701,6 +709,10 @@ SOURCE=..\..\src\generic\propdlg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\src\generic\richtooltip.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\src\generic\sashwin.cpp
 # End Source File
 # Begin Source File
@@ -1174,6 +1186,10 @@ SOURCE=..\..\include\wx\propdlg.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\richtooltip.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\sashwin.h
 # End Source File
 # Begin Source File
diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp
index e9ee7ffc94..2ef75436e3 100644
--- a/build/msw/wx_core.dsp
+++ b/build/msw/wx_core.dsp
@@ -6792,6 +6792,10 @@ SOURCE=..\..\include\wx\richtext\richtextxml.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\wx\richtooltip.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\wx\sashwin.h
 # End Source File
 # Begin Source File
diff --git a/build/msw/wx_vc7_adv.vcproj b/build/msw/wx_vc7_adv.vcproj
index 73f27ad070..ecfa5714ff 100644
--- a/build/msw/wx_vc7_adv.vcproj
+++ b/build/msw/wx_vc7_adv.vcproj
@@ -601,6 +601,9 @@
 				RelativePath="..\..\src\common\odcombocmn.cpp">
 			</File>
 			<File
+				RelativePath="..\..\src\common\richtooltipcmn.cpp">
+			</File>
+			<File
 				RelativePath="..\..\src\common\taskbarcmn.cpp">
 			</File>
 		</Filter>
@@ -722,6 +725,57 @@
 				RelativePath="..\..\src\msw\notifmsg.cpp">
 			</File>
 			<File
+				RelativePath="..\..\src\msw\richtooltip.cpp">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\msw_richtooltip.obj"/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\msw\sound.cpp">
 			</File>
 			<File
@@ -843,6 +897,57 @@
 				RelativePath="..\..\src\generic\propdlg.cpp">
 			</File>
 			<File
+				RelativePath="..\..\src\generic\richtooltip.cpp">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\generic_richtooltip.obj"/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\generic\sashwin.cpp">
 			</File>
 			<File
@@ -1239,6 +1344,9 @@
 				RelativePath="..\..\include\wx\propdlg.h">
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h">
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h">
 			</File>
 			<File
diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj
index 1f08edf19c..c3d6cb292d 100644
--- a/build/msw/wx_vc7_core.vcproj
+++ b/build/msw/wx_vc7_core.vcproj
@@ -5670,6 +5670,9 @@
 				RelativePath="..\..\include\wx\richtext\richtextxml.h">
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h">
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h">
 			</File>
 			<File
diff --git a/build/msw/wx_vc8_adv.vcproj b/build/msw/wx_vc8_adv.vcproj
index 894041284b..7b32f8870d 100644
--- a/build/msw/wx_vc8_adv.vcproj
+++ b/build/msw/wx_vc8_adv.vcproj
@@ -835,6 +835,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\common\richtooltipcmn.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\src\common\taskbarcmn.cpp"
 				>
 			</File>
@@ -996,6 +1000,74 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\msw\richtooltip.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\msw\sound.cpp"
 				>
 			</File>
@@ -1157,6 +1229,74 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\generic\richtooltip.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\generic\sashwin.cpp"
 				>
 			</File>
@@ -1673,6 +1813,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h"
 				>
 			</File>
diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj
index 8dd8c705af..b62f508d59 100644
--- a/build/msw/wx_vc8_core.vcproj
+++ b/build/msw/wx_vc8_core.vcproj
@@ -7580,6 +7580,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h"
 				>
 			</File>
diff --git a/build/msw/wx_vc9_adv.vcproj b/build/msw/wx_vc9_adv.vcproj
index 9d0358931d..c9b2307b77 100644
--- a/build/msw/wx_vc9_adv.vcproj
+++ b/build/msw/wx_vc9_adv.vcproj
@@ -831,6 +831,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\common\richtooltipcmn.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\src\common\taskbarcmn.cpp"
 				>
 			</File>
@@ -992,6 +996,74 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\msw\richtooltip.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\msw_richtooltip.obj"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\msw\sound.cpp"
 				>
 			</File>
@@ -1153,6 +1225,74 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\src\generic\richtooltip.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswud\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswu\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivud\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivu\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswuddll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswudll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivuddll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="DLL Universal Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						ObjectFile="vc_mswunivudll\adv\generic_richtooltip.obj"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\..\src\generic\sashwin.cpp"
 				>
 			</File>
@@ -1669,6 +1809,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h"
 				>
 			</File>
diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj
index 4a088b8b7b..3b8f55ca53 100644
--- a/build/msw/wx_vc9_core.vcproj
+++ b/build/msw/wx_vc9_core.vcproj
@@ -7576,6 +7576,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\include\wx\richtooltip.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\include\wx\sashwin.h"
 				>
 			</File>
diff --git a/configure b/configure
index 4a875dff04..46e9ce3397 100755
--- a/configure
+++ b/configure
@@ -1854,6 +1854,7 @@ Optional Features:
   --enable-radiobox       use wxRadioBox class
   --enable-radiobtn       use wxRadioButton class
   --enable-richmsgdlg     use wxRichMessageDialog class
+  --enable-richtooltip    use wxRichToolTip class
   --enable-rearrangectrl  use wxRearrangeList/Ctrl/Dialog
   --enable-sash           use wxSashWindow class
   --enable-scrollbar      use wxScrollBar class and scrollable windows
@@ -9900,6 +9901,7 @@ if test "$wxUSE_CONTROLS" = "no"; then
     DEFAULT_wxUSE_RADIOBOX=no
     DEFAULT_wxUSE_RADIOBTN=no
     DEFAULT_wxUSE_RICHMSGDLG=no
+    DEFAULT_wxUSE_RICHTOOLTIP=no
     DEFAULT_wxUSE_REARRANGECTRL=no
     DEFAULT_wxUSE_SASH=no
     DEFAULT_wxUSE_SCROLLBAR=no
@@ -11906,6 +11908,50 @@ fi
 echo "${ECHO_T}$result" >&6; }
 
 
+          enablestring=
+          defaultval=$wxUSE_ALL_FEATURES
+          if test -z "$defaultval"; then
+              if test x"$enablestring" = xdisable; then
+                  defaultval=yes
+              else
+                  defaultval=no
+              fi
+          fi
+
+          { echo "$as_me:$LINENO: checking for --${enablestring:-enable}-richtooltip" >&5
+echo $ECHO_N "checking for --${enablestring:-enable}-richtooltip... $ECHO_C" >&6; }
+          # Check whether --enable-richtooltip was given.
+if test "${enable_richtooltip+set}" = set; then
+  enableval=$enable_richtooltip;
+                          if test "$enableval" = yes; then
+                            wx_cv_use_richtooltip='wxUSE_RICHTOOLTIP=yes'
+                          else
+                            wx_cv_use_richtooltip='wxUSE_RICHTOOLTIP=no'
+                          fi
+
+else
+
+                          wx_cv_use_richtooltip='wxUSE_RICHTOOLTIP=${'DEFAULT_wxUSE_RICHTOOLTIP":-$defaultval}"
+
+fi
+
+
+          eval "$wx_cv_use_richtooltip"
+
+          if test x"$enablestring" = xdisable; then
+            if test $wxUSE_RICHTOOLTIP = no; then
+              result=yes
+            else
+              result=no
+            fi
+          else
+            result=$wxUSE_RICHTOOLTIP
+          fi
+
+          { echo "$as_me:$LINENO: result: $result" >&5
+echo "${ECHO_T}$result" >&6; }
+
+
           enablestring=
           defaultval=$wxUSE_ALL_FEATURES
           if test -z "$defaultval"; then
@@ -47880,6 +47926,13 @@ _ACEOF
 
 fi
 
+if test "$wxUSE_RICHTOOLTIP" = "yes"; then
+    cat >>confdefs.h <<\_ACEOF
+#define wxUSE_RICHTOOLTIP 1
+_ACEOF
+
+fi
+
 if test "$wxUSE_SASH" = "yes"; then
     cat >>confdefs.h <<\_ACEOF
 #define wxUSE_SASH 1
@@ -50447,7 +50500,7 @@ else
 fi
 
 
-    INSTALL_DIR="mkdir -p"
+        INSTALL_DIR="mkdir -p"
 
 
     LDFLAGS_GUI=
diff --git a/configure.in b/configure.in
index 06768cdcf4..df84bd2feb 100644
--- a/configure.in
+++ b/configure.in
@@ -915,6 +915,7 @@ if test "$wxUSE_CONTROLS" = "no"; then
     DEFAULT_wxUSE_RADIOBOX=no
     DEFAULT_wxUSE_RADIOBTN=no
     DEFAULT_wxUSE_RICHMSGDLG=no
+    DEFAULT_wxUSE_RICHTOOLTIP=no
     DEFAULT_wxUSE_REARRANGECTRL=no
     DEFAULT_wxUSE_SASH=no
     DEFAULT_wxUSE_SCROLLBAR=no
@@ -987,6 +988,7 @@ WX_ARG_FEATURE(popupwin,    [  --enable-popupwin       use wxPopUpWindow class],
 WX_ARG_FEATURE(radiobox,    [  --enable-radiobox       use wxRadioBox class], wxUSE_RADIOBOX)
 WX_ARG_FEATURE(radiobtn,    [  --enable-radiobtn       use wxRadioButton class], wxUSE_RADIOBTN)
 WX_ARG_FEATURE(richmsgdlg,  [  --enable-richmsgdlg     use wxRichMessageDialog class], wxUSE_RICHMSGDLG)
+WX_ARG_FEATURE(richtooltip, [  --enable-richtooltip    use wxRichToolTip class], wxUSE_RICHTOOLTIP)
 WX_ARG_FEATURE(rearrangectrl,[  --enable-rearrangectrl  use wxRearrangeList/Ctrl/Dialog], wxUSE_REARRANGECTRL)
 WX_ARG_FEATURE(sash,        [  --enable-sash           use wxSashWindow class], wxUSE_SASH)
 WX_ARG_FEATURE(scrollbar,   [  --enable-scrollbar      use wxScrollBar class and scrollable windows], wxUSE_SCROLLBAR)
@@ -7036,6 +7038,10 @@ if test "$wxUSE_RICHMSGDLG" = "yes"; then
     AC_DEFINE(wxUSE_RICHMSGDLG)
 fi
 
+if test "$wxUSE_RICHTOOLTIP" = "yes"; then
+    AC_DEFINE(wxUSE_RICHTOOLTIP)
+fi
+
 if test "$wxUSE_SASH" = "yes"; then
     AC_DEFINE(wxUSE_SASH)
     SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS sashtest"
diff --git a/docs/changes.txt b/docs/changes.txt
index 070a777433..45548d7650 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -459,10 +459,12 @@ All (GUI):
 - Added wxWebView library (Steven Lamerton & Auria, GSoC 2011 project).
 - Added wxTreeListCtrl class.
 - Added wxTimePickerCtrl class.
+- Added wxRichToolTip class.
 - Added documented, public wxNavigationEnabled<> class.
 - Added wxTextCtrl::PositionToCoords() (Navaneeth).
 - Added support for wxHELP button to wxMessageDialog.
 - Added wxBannerWindow class.
+- Allow setting window shape to arbitrary wxGraphicsPath.
 - Added wxTextEntry::AutoCompleteDirectories().
 - Support float, double and file name values in wxGenericValidator (troelsk).
 - Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32).
diff --git a/docs/doxygen/images/wxgtk/richtooltip.png b/docs/doxygen/images/wxgtk/richtooltip.png
new file mode 100644
index 0000000000..ded9c1d079
Binary files /dev/null and b/docs/doxygen/images/wxgtk/richtooltip.png differ
diff --git a/docs/doxygen/images/wxmac/richtooltip.png b/docs/doxygen/images/wxmac/richtooltip.png
new file mode 100644
index 0000000000..4d91849d62
Binary files /dev/null and b/docs/doxygen/images/wxmac/richtooltip.png differ
diff --git a/docs/doxygen/images/wxmsw/richtooltip.png b/docs/doxygen/images/wxmsw/richtooltip.png
new file mode 100644
index 0000000000..2521720b8e
Binary files /dev/null and b/docs/doxygen/images/wxmsw/richtooltip.png differ
diff --git a/docs/doxygen/mainpages/cat_classes.h b/docs/doxygen/mainpages/cat_classes.h
index ad5b0dedf4..fd4c127f37 100644
--- a/docs/doxygen/mainpages/cat_classes.h
+++ b/docs/doxygen/mainpages/cat_classes.h
@@ -243,6 +243,7 @@ The following are a variety of classes that are derived from wxWindow.
     variable sizes.
 @li wxGrid: A grid (table) window
 @li wxInfoBar: An information bar usually shown on top of the main window.
+@li wxRichToolTip: A customizable tooltip.
 @li wxSplitterWindow: Window which can be split vertically or horizontally
 @li wxStatusBar: Implements the status bar on a frame
 @li wxToolBar: Toolbar class
diff --git a/include/wx/chkconf.h b/include/wx/chkconf.h
index 8b9ff36c1f..5278a6490b 100644
--- a/include/wx/chkconf.h
+++ b/include/wx/chkconf.h
@@ -976,6 +976,14 @@
 #   endif
 #endif /* !defined(wxUSE_RICHMSGDLG) */
 
+#ifndef wxUSE_RICHTOOLTIP
+#   ifdef wxABORT_ON_CONFIG_ERROR
+#       error "wxUSE_RICHTOOLTIP must be defined, please read comment near the top of this file."
+#   else
+#       define wxUSE_RICHTOOLTIP 0
+#   endif
+#endif /* !defined(wxUSE_RICHTOOLTIP) */
+
 #ifndef wxUSE_SASH
 #   ifdef wxABORT_ON_CONFIG_ERROR
 #       error "wxUSE_SASH must be defined, please read comment near the top of this file."
diff --git a/include/wx/generic/private/richtooltip.h b/include/wx/generic/private/richtooltip.h
new file mode 100644
index 0000000000..baaf273011
--- /dev/null
+++ b/include/wx/generic/private/richtooltip.h
@@ -0,0 +1,59 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/generic/private/richtooltip.h
+// Purpose:     wxRichToolTipGenericImpl declaration.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-18
+// RCS-ID:      $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_GENERIC_PRIVATE_RICHTOOLTIP_H_
+#define _GENERIC_PRIVATE_RICHTOOLTIP_H_
+
+// ----------------------------------------------------------------------------
+// wxRichToolTipGenericImpl: defines generic wxRichToolTip implementation.
+// ----------------------------------------------------------------------------
+
+class wxRichToolTipGenericImpl : public wxRichToolTipImpl
+{
+public:
+    wxRichToolTipGenericImpl(const wxString& title, const wxString& message) :
+        m_title(title),
+        m_message(message)
+    {
+        m_tipKind = wxTipKind_Auto;
+
+        // This is pretty arbitrary, we could follow MSW and use some multiple
+        // of double-click time here.
+        m_timeout = 5000;
+    }
+
+    virtual void SetBackgroundColour(const wxColour& col,
+                                     const wxColour& colEnd);
+    virtual void SetCustomIcon(const wxIcon& icon);
+    virtual void SetStandardIcon(int icon);
+    virtual void SetTimeout(unsigned milliseconds);
+    virtual void SetTipKind(wxTipKind tipKind);
+    virtual void SetTitleFont(const wxFont& font);
+
+    virtual void ShowFor(wxWindow* win);
+
+protected:
+    wxString m_title,
+             m_message;
+
+private:
+    wxIcon m_icon;
+
+    wxColour m_colStart,
+             m_colEnd;
+
+    unsigned m_timeout;
+
+    wxTipKind m_tipKind;
+
+    wxFont m_titleFont;
+};
+
+#endif // _WX_GENERIC_PRIVATE_RICHTOOLTIP_H_
diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h
index 72c3721f07..3f87e116be 100644
--- a/include/wx/motif/setup0.h
+++ b/include/wx/motif/setup0.h
@@ -1087,6 +1087,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h
index a8f62e2241..02dbb9aa03 100644
--- a/include/wx/msw/setup0.h
+++ b/include/wx/msw/setup0.h
@@ -1087,6 +1087,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h
index a1a8bb702a..bc48373e26 100644
--- a/include/wx/msw/wince/setup.h
+++ b/include/wx/msw/wince/setup.h
@@ -1087,6 +1087,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/os2/setup0.h b/include/wx/os2/setup0.h
index 3f7ba32ff7..e5dfea236d 100644
--- a/include/wx/os2/setup0.h
+++ b/include/wx/os2/setup0.h
@@ -1087,6 +1087,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/osx/nonownedwnd.h b/include/wx/osx/nonownedwnd.h
index 4ae95d3099..85c0eb1cd1 100644
--- a/include/wx/osx/nonownedwnd.h
+++ b/include/wx/osx/nonownedwnd.h
@@ -81,9 +81,8 @@ public:
     // implementation from now on
     // --------------------------
 
-    virtual bool SetShape(const wxRegion& region);
+    // These accessors are Mac-specific and don't exist in other ports.
     const wxRegion& GetShape() const { return m_shape; }
-
 #if wxUSE_GRAPHICS_CONTEXT
     const wxGraphicsPath& GetShapePath() { return m_shapePath; }
 #endif // wxUSE_GRAPHICS_CONTEXT
diff --git a/include/wx/osx/setup0.h b/include/wx/osx/setup0.h
index db61cb128f..bd1bc24491 100644
--- a/include/wx/osx/setup0.h
+++ b/include/wx/osx/setup0.h
@@ -1088,6 +1088,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/palmos/setup0.h b/include/wx/palmos/setup0.h
index d2384305df..0db190529a 100644
--- a/include/wx/palmos/setup0.h
+++ b/include/wx/palmos/setup0.h
@@ -1087,6 +1087,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/private/richtooltip.h b/include/wx/private/richtooltip.h
new file mode 100644
index 0000000000..75d30a9d1f
--- /dev/null
+++ b/include/wx/private/richtooltip.h
@@ -0,0 +1,44 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/private/richtooltip.h
+// Purpose:     wxRichToolTipImpl declaration.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-18
+// RCS-ID:      $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PRIVATE_RICHTOOLTIP_H_
+#define _WX_PRIVATE_RICHTOOLTIP_H_
+
+#include "wx/richtooltip.h"
+
+// ----------------------------------------------------------------------------
+// wxRichToolTipImpl: defines wxRichToolTip implementation.
+// ----------------------------------------------------------------------------
+
+class wxRichToolTipImpl
+{
+public:
+    // This is implemented in a platform-specific way.
+    static wxRichToolTipImpl* Create(const wxString& title,
+                                     const wxString& message);
+
+    // These methods simply mirror the public wxRichToolTip ones.
+    virtual void SetBackgroundColour(const wxColour& col,
+                                     const wxColour& colEnd) = 0;
+    virtual void SetCustomIcon(const wxIcon& icon) = 0;
+    virtual void SetStandardIcon(int icon) = 0;
+    virtual void SetTimeout(unsigned milliseconds) = 0;
+    virtual void SetTipKind(wxTipKind tipKind) = 0;
+    virtual void SetTitleFont(const wxFont& font) = 0;
+
+    virtual void ShowFor(wxWindow* win) = 0;
+
+    virtual ~wxRichToolTipImpl() { }
+
+protected:
+    wxRichToolTipImpl() { }
+};
+
+#endif // _WX_PRIVATE_RICHTOOLTIP_H_
diff --git a/include/wx/richtooltip.h b/include/wx/richtooltip.h
new file mode 100644
index 0000000000..83ea72dee2
--- /dev/null
+++ b/include/wx/richtooltip.h
@@ -0,0 +1,99 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/richtooltip.h
+// Purpose:     Declaration of wxRichToolTip class.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-07
+// RCS-ID:      $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_RICHTOOLTIP_H_
+#define _WX_RICHTOOLTIP_H_
+
+#if wxUSE_RICHTOOLTIP
+
+class WXDLLIMPEXP_FWD_CORE wxColour;
+class WXDLLIMPEXP_FWD_CORE wxFont;
+class WXDLLIMPEXP_FWD_CORE wxIcon;
+
+class wxRichToolTipImpl;
+
+// This enum describes the kind of the tip shown which combines both the tip
+// position and appearance because the two are related (when the tip is
+// positioned asymmetrically, a right handed triangle is used but an
+// equilateral one when it's in the middle of a side).
+//
+// Automatic selects the tip appearance best suited for the current platform
+// and the position best suited for the window the tooltip is shown for, i.e.
+// chosen in such a way that the tooltip is always fully on screen.
+//
+// Other values describe the position of the tooltip itself, not the window it
+// relates to. E.g. wxTipKind_Top places the tip on the top of the tooltip and
+// so the tooltip itself is located beneath its associated window.
+enum wxTipKind
+{
+    wxTipKind_None,
+    wxTipKind_TopLeft,
+    wxTipKind_Top,
+    wxTipKind_TopRight,
+    wxTipKind_BottomLeft,
+    wxTipKind_Bottom,
+    wxTipKind_BottomRight,
+    wxTipKind_Auto
+};
+
+// ----------------------------------------------------------------------------
+// wxRichToolTip: a customizable but not necessarily native tooltip.
+// ----------------------------------------------------------------------------
+
+// Notice that this class does not inherit from wxWindow.
+class WXDLLIMPEXP_ADV wxRichToolTip
+{
+public:
+    // Ctor must specify the tooltip title and main message, additional
+    // attributes can be set later.
+    wxRichToolTip(const wxString& title, const wxString& message);
+
+    // Set the background colour: if two colours are specified, the background
+    // is drawn using a gradient from top to bottom, otherwise a single solid
+    // colour is used.
+    void SetBackgroundColour(const wxColour& col,
+                             const wxColour& colEnd = wxColour());
+
+    // Set the small icon to show: either one of the standard information/
+    // warning/error ones (the question icon doesn't make sense for a tooltip)
+    // or a custom icon.
+    void SetIcon(int icon = wxICON_INFORMATION);
+    void SetIcon(const wxIcon& icon);
+
+    // Set timeout after which the tooltip should disappear, in milliseconds.
+    // By default the tooltip is hidden after system-dependent interval of time
+    // elapses but this method can be used to change this or also disable
+    // hiding the tooltip automatically entirely by passing 0 in this parameter
+    // (but doing this can result in native version not being used).
+    void SetTimeout(unsigned milliseconds);
+
+    // Choose the tip kind, possibly none. By default the tip is positioned
+    // automatically, as if wxTipKind_Auto was used.
+    void SetTipKind(wxTipKind tipKind);
+
+    // Set the title text font. By default it's emphasized using the font style
+    // or colour appropriate for the current platform.
+    void SetTitleFont(const wxFont& font);
+
+    // Show the tooltip for the given window.
+    void ShowFor(wxWindow* win);
+
+    // Non-virtual dtor as this class is not supposed to be derived from.
+    ~wxRichToolTip();
+
+private:
+    wxRichToolTipImpl* const m_impl;
+
+    wxDECLARE_NO_COPY_CLASS(wxRichToolTip);
+};
+
+#endif // wxUSE_RICHTOOLTIP
+
+#endif // _WX_RICHTOOLTIP_H_
diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h
index 4168e64d59..f7d6ce80b4 100644
--- a/include/wx/setup_inc.h
+++ b/include/wx/setup_inc.h
@@ -1083,6 +1083,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/include/wx/univ/setup0.h b/include/wx/univ/setup0.h
index 632c93a5b0..f59ae50558 100644
--- a/include/wx/univ/setup0.h
+++ b/include/wx/univ/setup0.h
@@ -1086,6 +1086,14 @@
 // Recommended setting: 1
 #define wxUSE_NOTIFICATION_MESSAGE 1
 
+// wxRichToolTip is a customizable tooltip class which has more functionality
+// than the stock (but native, unlike this class) wxToolTip.
+//
+// Default is 1.
+//
+// Recommended setting: 1 (but can be safely set to 0 if you don't need it)
+#define wxUSE_RICHTOOLTIP 1
+
 // Use wxSashWindow class.
 //
 // Default is 1.
diff --git a/interface/wx/nonownedwnd.h b/interface/wx/nonownedwnd.h
index 7db6d66037..4e1a6a7381 100644
--- a/interface/wx/nonownedwnd.h
+++ b/interface/wx/nonownedwnd.h
@@ -32,5 +32,28 @@ public:
         This method is available in this class only since wxWidgets 2.9.3,
         previous versions only provided it in wxTopLevelWindow.
     */
-    virtual bool SetShape(const wxRegion& region);
+    bool SetShape(const wxRegion& region);
+
+    /**
+        Set the window shape to the given path.
+
+        Set the window shape to the interior of the given path and also draw
+        the window border along the specified path.
+
+        For example, to make a clock-like circular window you could use
+        @code
+            wxSize size = GetSize();
+            wxGraphicsPath
+                path = wxGraphicsRenderer::GetDefaultRenderer()->CreatePath();
+            path.AddCircle(size.x/2, size.y/2, 30);
+            SetShape(path);
+        @endcode
+
+        As the overload above, this method is not guaranteed to work on all
+        platforms but currently does work in wxMSW, wxOSX/Cocoa and wxGTK (with
+        the appropriate but almost always present X11 extensions) ports.
+
+        @since 2.9.3
+     */
+    bool SetShape(const wxGraphicsPath& path);
 };
diff --git a/interface/wx/richtooltip.h b/interface/wx/richtooltip.h
new file mode 100644
index 0000000000..3a3dbbf5e5
--- /dev/null
+++ b/interface/wx/richtooltip.h
@@ -0,0 +1,195 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        interface/wx/richtooltip.h
+// Purpose:     wxRichToolTip class documentation
+// Author:      Vadim Zeitlin
+// Created:     2011-10-18
+// RCS-ID:      $Id$
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+    Support tip kinds for wxRichToolTip.
+
+    This enum describes the kind of the tip shown which combines both the tip
+    position and appearance because the two are related (when the tip is
+    positioned asymmetrically, a right handed triangle is used but an
+    equilateral one when it's in the middle of a side).
+
+    Automatic selects the tip appearance best suited for the current platform
+    and the position best suited for the window the tooltip is shown for, i.e.
+    chosen in such a way that the tooltip is always fully on screen.
+
+    Other values describe the position of the tooltip itself, not the window it
+    relates to. E.g. wxTipKind_Top places the tip on the top of the tooltip and
+    so the tooltip itself is located beneath its associated window.
+ */
+enum wxTipKind
+{
+    /// Don't show any tip, the tooltip will be (roughly) rectangular.
+    wxTipKind_None,
+    /// Show a right triangle tip in the top left corner of the tooltip.
+    wxTipKind_TopLeft,
+    /// Show an equilateral triangle tip in the middle of the tooltip top side.
+    wxTipKind_Top,
+    /// Show a right triangle tip in the top right corner of the tooltip.
+    wxTipKind_TopRight,
+    /// Show a right triangle tip in the bottom left corner of the tooltip.
+    wxTipKind_BottomLeft,
+    /// Show an equilateral triangle tip in the middle of the tooltip bottom side.
+    wxTipKind_Bottom,
+    /// Show a right triangle tip in the bottom right corner of the tooltip.
+    wxTipKind_BottomRight,
+    /**
+        Choose the appropriate tip shape and position automatically.
+
+        This is the default and shouldn't normally need to be changed.
+
+        Notice that currently wxTipKind_Top or wxTipKind_Bottom are used under
+        Mac while one of the other four values is selected for the other
+        platforms.
+     */
+    wxTipKind_Auto
+};
+/**
+    Allows to show a tool tip with more customizations than wxToolTip.
+
+    Using this class is very simple, to give a standard warning for a password
+    text control if the password was entered correctly you could simply do:
+    @code
+    wxTextCtrl* password = new wxTextCtrl(..., wxTE_PASSWORD);
+    ...
+    wxRichToolTip tip("Caps Lock is on",
+                      "You might have made an error in your password\n"
+                      "entry because Caps Lock is turned on.\n"
+                      "\n"
+                      "Press Caps Lock key to turn it off.");
+    tip.SetIcon(wxICON_WARNING);
+    tip.ShowFor(password);
+    @endcode
+
+    Currently this class has generic implementation that can be used with any
+    window and implements all the functionality but doesn't exactly match the
+    appearance of the native tooltips (even though it makes some efforts to
+    use the style most appropriate for the current platform) and a native MSW
+    version which can be only used with text controls and doesn't provide as
+    much in the way of customization. Because of this, it's inadvisable to
+    customize the tooltips unnecessarily as doing this turns off auto-detection
+    of the native style in the generic version and may prevent the native MSW
+    version from being used at all.
+
+    Notice that this class is not derived from wxWindow and hence doesn't
+    represent a window, even if its ShowFor() method does create one internally
+    to show the tooltip.
+
+    The images below show some examples of rich tooltips on different
+    platforms, with various customizations applied.
+
+    @library{wxadv}
+    @category{miscwnd}
+    @appearance{richtooltip.png}
+
+    @since 2.9.3
+ */
+class wxRichToolTip
+{
+public:
+    /**
+        Constructor must specify the tooltip title and main message.
+
+        The main message can contain embedded new lines. Both the title and
+        message must be non-empty.
+
+        Additional attributes can be set later.
+     */
+    wxRichToolTip(const wxString& title, const wxString& message);
+
+    /**
+        Set the background colour.
+
+        If two colours are specified, the background is drawn using a gradient
+        from top to bottom, otherwise a single solid colour is used.
+
+        By default the colour or colours most appropriate for the current
+        platform are used. If a colour is explicitly set, native MSW version
+        won't be used as it doesn't support setting the colour.
+     */
+    void SetBackgroundColour(const wxColour& col,
+                             const wxColour& colEnd = wxColour());
+
+    /**
+        Set the small icon to show.
+
+        The icon can be either one of the standard information/warning/error
+        ones, i.e. wxICON_INFORMATION, wxICON_WARNING or wxICON_ERROR
+        respectively (the question icon doesn't make sense for a tooltip so
+        wxICON_QUESTION can't be used here) or a custom icon. The latter is
+        unsupported by the native MSW implementation of this class so the use
+        of a standard icon is preferred.
+     */
+    //@{
+    void SetIcon(int icon = wxICON_INFORMATION);
+    void SetIcon(const wxIcon& icon);
+    //@}
+
+    /**
+        Set timeout after which the tooltip should disappear, in milliseconds.
+
+        By default the tooltip is hidden after system-dependent interval of
+        time elapses but this method can be used to change this or also disable
+        hiding the tooltip automatically entirely by passing 0 in this parameter
+        (but doing this will prevent the native MSW version from being used).
+
+        Notice that the tooltip will always be hidden if the user presses a key
+        or clicks a mouse button.
+     */
+    void SetTimeout(unsigned milliseconds);
+
+    /**
+        Choose the tip kind, possibly none.
+
+        See wxTipKind documentation for the possible choices here.
+
+        By default the tip is positioned automatically, as if wxTipKind_Auto
+        was used. Native MSW implementation doesn't support setting the tip
+        kind explicitly and won't be used if this method is called with any
+        value other than wxTipKind_Auto.
+
+        Notice that using non automatic tooltip kind may result in the tooltip
+        being positioned partially off screen and it's the callers
+        responsibility to ensure that this doesn't happen in this case.
+     */
+    void SetTipKind(wxTipKind tipKind);
+
+    /**
+        Set the title text font.
+
+        By default it's emphasized using the font style or colour appropriate
+        for the current platform. Calling this method prevents the native MSW
+        implementation from being used as it doesn't support changing the font.
+     */
+    void SetTitleFont(const wxFont& font);
+
+    /**
+        Show the tooltip for the given window.
+
+        The tooltip tip points to the (middle of the) specified window which
+        must be non-@NULL.
+
+        Currently the native MSW implementation is used only if @a win is a
+        wxTextCtrl. This limitation may be removed in the future.
+     */
+    void ShowFor(wxWindow* win);
+
+    /**
+        Destructor.
+
+        Notice that destroying this object does not hide the tooltip if it's
+        currently shown, it will be hidden and destroyed when the user
+        dismisses it or the timeout expires.
+
+        The destructor is non-virtual as this class is not supposed to be
+        derived from.
+     */
+    ~wxRichToolTip();
+};
diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp
index eeeecdac1f..ce73b79e39 100644
--- a/samples/dialogs/dialogs.cpp
+++ b/samples/dialogs/dialogs.cpp
@@ -257,6 +257,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(DIALOGS_NOTIFY_HIDE,                   MyFrame::OnNotifMsgHide)
 #endif // wxUSE_NOTIFICATION_MESSAGE
 
+#if wxUSE_RICHTOOLTIP
+    EVT_MENU(DIALOGS_RICHTIP_DIALOG,                MyFrame::OnRichTipDialog)
+#endif // wxUSE_RICHTOOLTIP
+
     EVT_MENU(wxID_EXIT,                             MyFrame::OnExit)
 END_EVENT_TABLE()
 
@@ -527,6 +531,11 @@ bool MyApp::OnInit()
 #endif // wxUSE_NOTIFICATION_MESSAGE
     menuDlg->AppendSubMenu(menuNotif, "&User notifications");
 
+#if wxUSE_RICHTOOLTIP
+    menuDlg->Append(DIALOGS_RICHTIP_DIALOG, "Rich &tooltip dialog...\tCtrl-H");
+    menuDlg->AppendSeparator();
+#endif // wxUSE_RICHTOOLTIP
+
     menuDlg->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, wxT("&Standard Buttons Sizer Dialog"));
     menuDlg->Append(DIALOGS_TEST_DEFAULT_ACTION, wxT("&Test dialog default action"));
 
@@ -1777,6 +1786,219 @@ void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
 
 #endif // wxUSE_NOTIFICATION_MESSAGE
 
+#if wxUSE_RICHTOOLTIP
+
+#include "wx/richtooltip.h"
+
+#include "tip.xpm"
+
+class RichTipDialog : public wxDialog
+{
+public:
+    RichTipDialog(wxWindow* parent)
+        : wxDialog(parent, wxID_ANY, "wxRichToolTip Test",
+                   wxDefaultPosition, wxDefaultSize,
+                   wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+    {
+        // Create the controls.
+        m_textTitle = new wxTextCtrl(this, wxID_ANY, "Tooltip title");
+        m_textBody = new wxTextCtrl(this, wxID_ANY, "Main tooltip text\n"
+                                                    "possibly on several\n"
+                                                    "lines.",
+                                    wxDefaultPosition, wxDefaultSize,
+                                    wxTE_MULTILINE);
+        wxButton* btnShowText = new wxButton(this, wxID_ANY, "Show for &text");
+        wxButton* btnShowBtn = new wxButton(this, wxID_ANY, "Show for &button");
+
+        const wxString icons[] =
+        {
+            "&None",
+            "&Information",
+            "&Warning",
+            "&Error",
+            "&Custom"
+        };
+        wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == Icon_Max, IconMismatch );
+        m_icons = new wxRadioBox(this, wxID_ANY, "&Icon choice:",
+                                 wxDefaultPosition, wxDefaultSize,
+                                 WXSIZEOF(icons), icons,
+                                 1, wxRA_SPECIFY_ROWS);
+        m_icons->SetSelection(Icon_Info);
+
+        const wxString tipKinds[] =
+        {
+            "&None", "Top left", "Top", "Top right",
+            "Bottom left", "Bottom", "Bottom right", "&Auto"
+        };
+        m_tipKinds = new wxRadioBox(this, wxID_ANY, "Tip &kind:",
+                                    wxDefaultPosition, wxDefaultSize,
+                                    WXSIZEOF(tipKinds), tipKinds,
+                                    4, wxRA_SPECIFY_COLS);
+        m_tipKinds->SetSelection(wxTipKind_Auto);
+
+        const wxString bgStyles[] =
+        {
+            "&Default", "&Solid", "&Gradient",
+        };
+        wxCOMPILE_TIME_ASSERT( WXSIZEOF(bgStyles) == Bg_Max, BgMismatch );
+        m_bgStyles = new wxRadioBox(this, wxID_ANY, "Background style:",
+                                    wxDefaultPosition, wxDefaultSize,
+                                    WXSIZEOF(bgStyles), bgStyles,
+                                    1, wxRA_SPECIFY_ROWS);
+
+        const wxString timeouts[] = { "&None", "&Default", "&3 seconds" };
+        wxCOMPILE_TIME_ASSERT( WXSIZEOF(timeouts) == Timeout_Max, TmMismatch );
+        m_timeouts = new wxRadioBox(this, wxID_ANY, "Timeout:",
+                                    wxDefaultPosition, wxDefaultSize,
+                                    WXSIZEOF(timeouts), timeouts,
+                                    1, wxRA_SPECIFY_ROWS);
+        m_timeouts->SetSelection(Timeout_Default);
+
+        // Lay them out.
+        m_textBody->SetMinSize(wxSize(300, 200));
+
+        wxBoxSizer* const sizer = new wxBoxSizer(wxVERTICAL);
+        sizer->Add(m_textTitle, wxSizerFlags().Expand().Border());
+        sizer->Add(m_textBody, wxSizerFlags(1).Expand().Border());
+        sizer->Add(m_icons, wxSizerFlags().Expand().Border());
+        sizer->Add(m_tipKinds, wxSizerFlags().Centre().Border());
+        sizer->Add(m_bgStyles, wxSizerFlags().Centre().Border());
+        sizer->Add(m_timeouts, wxSizerFlags().Centre().Border());
+        wxBoxSizer* const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
+        sizerBtns->Add(btnShowText, wxSizerFlags().Border(wxRIGHT));
+        sizerBtns->Add(btnShowBtn, wxSizerFlags().Border(wxLEFT));
+        sizer->Add(sizerBtns, wxSizerFlags().Centre().Border());
+        sizer->Add(CreateStdDialogButtonSizer(wxOK),
+                   wxSizerFlags().Expand().Border());
+        SetSizerAndFit(sizer);
+
+
+        // And connect the event handlers.
+        btnShowText->Connect
+                     (
+                        wxEVT_COMMAND_BUTTON_CLICKED,
+                        wxCommandEventHandler(RichTipDialog::OnShowTipForText),
+                        NULL,
+                        this
+                     );
+
+        btnShowBtn->Connect
+                    (
+                        wxEVT_COMMAND_BUTTON_CLICKED,
+                        wxCommandEventHandler(RichTipDialog::OnShowTipForBtn),
+                        NULL,
+                        this
+                    );
+    }
+
+private:
+    enum
+    {
+        Icon_None,
+        Icon_Info,
+        Icon_Warning,
+        Icon_Error,
+        Icon_Custom,
+        Icon_Max
+    };
+
+    enum
+    {
+        Bg_Default,
+        Bg_Solid,
+        Bg_Gradient,
+        Bg_Max
+    };
+
+    enum
+    {
+        Timeout_None,
+        Timeout_Default,
+        Timeout_3sec,
+        Timeout_Max
+    };
+
+
+    void OnShowTipForText(wxCommandEvent& WXUNUSED(event))
+    {
+        DoShowTip(m_textTitle);
+    }
+
+    void OnShowTipForBtn(wxCommandEvent& WXUNUSED(event))
+    {
+        DoShowTip(FindWindow(wxID_OK));
+    }
+
+    void DoShowTip(wxWindow* win)
+    {
+        wxRichToolTip tip(m_textTitle->GetValue(), m_textBody->GetValue());
+        const int iconSel = m_icons->GetSelection();
+        if ( iconSel == Icon_Custom )
+        {
+            tip.SetIcon(tip_xpm);
+        }
+        else // Use a standard icon.
+        {
+            static const int stdIcons[] =
+            {
+                wxICON_NONE,
+                wxICON_INFORMATION,
+                wxICON_WARNING,
+                wxICON_ERROR,
+            };
+
+            tip.SetIcon(stdIcons[iconSel]);
+        }
+
+        switch ( m_bgStyles->GetSelection() )
+        {
+            case Bg_Default:
+                break;
+
+            case Bg_Solid:
+                tip.SetBackgroundColour(*wxLIGHT_GREY);
+                break;
+
+            case Bg_Gradient:
+                tip.SetBackgroundColour(*wxWHITE, wxColour(0xe4, 0xe5, 0xf0));
+                break;
+        }
+
+        switch ( m_timeouts->GetSelection() )
+        {
+            case Timeout_None:
+                tip.SetTimeout(0);
+                break;
+
+            case Timeout_Default:
+                break;
+
+            case Timeout_3sec:
+                tip.SetTimeout(3000);
+                break;
+        }
+
+        tip.SetTipKind(static_cast<wxTipKind>(m_tipKinds->GetSelection()));
+
+        tip.ShowFor(win);
+    }
+
+    wxTextCtrl* m_textTitle;
+    wxTextCtrl* m_textBody;
+    wxRadioBox* m_icons;
+    wxRadioBox* m_tipKinds;
+    wxRadioBox* m_bgStyles;
+    wxRadioBox* m_timeouts;
+};
+
+void MyFrame::OnRichTipDialog(wxCommandEvent& WXUNUSED(event))
+{
+    RichTipDialog dialog(this);
+    dialog.ShowModal();
+}
+
+#endif // wxUSE_RICHTOOLTIP
+
 void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
 {
     StdButtonSizerDialog  dialog(this);
diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h
index 61dd0f85aa..bfc8fa086f 100644
--- a/samples/dialogs/dialogs.h
+++ b/samples/dialogs/dialogs.h
@@ -465,6 +465,10 @@ public:
     void OnNotifMsgHide(wxCommandEvent& event);
 #endif // wxUSE_NOTIFICATION_MESSAGE
 
+#if wxUSE_RICHTOOLTIP
+    void OnRichTipDialog(wxCommandEvent& event);
+#endif // wxUSE_RICHTOOLTIP
+
     void OnStandardButtonsSizerDialog(wxCommandEvent& event);
 
     void OnTestDefaultActionDialog(wxCommandEvent& event);
@@ -576,6 +580,7 @@ enum
     DIALOGS_NOTIFY_AUTO,
     DIALOGS_NOTIFY_SHOW,
     DIALOGS_NOTIFY_HIDE,
+    DIALOGS_RICHTIP_DIALOG,
     DIALOGS_PROPERTY_SHEET,
     DIALOGS_PROPERTY_SHEET_TOOLBOOK,
     DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK,
diff --git a/samples/dialogs/tip.xpm b/samples/dialogs/tip.xpm
new file mode 100644
index 0000000000..28ea7559a1
--- /dev/null
+++ b/samples/dialogs/tip.xpm
@@ -0,0 +1,157 @@
+/* XPM */
+static const char *const tip_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 119 2",
+"   c #141414",
+".  c #1B1B1B",
+"X  c #1F2527",
+"o  c #242525",
+"O  c #242728",
+"+  c #262A2B",
+"@  c #2B2B2B",
+"#  c #2A2E30",
+"$  c #2C3233",
+"%  c #2C3639",
+"&  c #2F3A3D",
+"*  c #313131",
+"=  c #303C3F",
+"-  c #2D3E42",
+";  c #323F42",
+":  c #33454A",
+">  c #34494F",
+",  c #324A50",
+"<  c #3B4E52",
+"1  c #2F5058",
+"2  c #325157",
+"3  c #3D545A",
+"4  c #3A5A62",
+"5  c #34606A",
+"6  c #3F616A",
+"7  c #464646",
+"8  c #4B4B4B",
+"9  c #41585E",
+"0  c gray33",
+"q  c #5D5D5D",
+"w  c #425B62",
+"e  c #456067",
+"r  c #46646B",
+"t  c #456972",
+"y  c #4B6972",
+"u  c #416F7A",
+"i  c #646464",
+"p  c gray42",
+"a  c #696F71",
+"s  c #767676",
+"d  c #787777",
+"f  c gray49",
+"g  c #3E7582",
+"h  c #3E7D8A",
+"j  c #417A86",
+"k  c #417F8E",
+"l  c #3E8494",
+"z  c #418595",
+"x  c #4D8995",
+"c  c #468D9E",
+"v  c #6B848A",
+"b  c #4795A7",
+"n  c #4F92A1",
+"m  c #4D9AAA",
+"M  c #5695A4",
+"N  c #55A2B3",
+"B  c #5FAABA",
+"V  c #7BA6AF",
+"C  c #4FAFC5",
+"Z  c #5DB7CA",
+"A  c #52BAD1",
+"S  c #58BDD4",
+"D  c #62C2D5",
+"F  c #64C3DA",
+"G  c #73C8DA",
+"H  c #7ECBDD",
+"J  c #868686",
+"K  c gray55",
+"L  c #9FA0A0",
+"P  c #98A8AB",
+"I  c #ADADAC",
+"U  c #AAB1B2",
+"Y  c #A8B9BD",
+"T  c gray70",
+"R  c #90C3CF",
+"E  c #87C8D7",
+"W  c #82CADA",
+"Q  c #91C8D4",
+"!  c #93CFDC",
+"~  c #98CEDB",
+"^  c #93D1DF",
+"/  c #9AD1DC",
+"(  c #A4CCD7",
+")  c #A3CFDA",
+"_  c #A1D0DB",
+"`  c #ACD1DA",
+"'  c #B2D6DE",
+"]  c #BCD7DD",
+"[  c #89D2E2",
+"{  c #9BD5E1",
+"}  c #A9DEE9",
+"|  c #BFE1E7",
+" . c #BDE3EB",
+".. c #C5C5C5",
+"X. c #CACACA",
+"o. c #C2D5D9",
+"O. c #C2D8DD",
+"+. c #CCD9DD",
+"@. c #D4DBDD",
+"#. c #DBDDDE",
+"$. c #E0DFDF",
+"%. c #CCDDE1",
+"&. c #D2DFE1",
+"*. c #CCE5EB",
+"=. c #D6E2E4",
+"-. c #DCE3E5",
+";. c #D4E6E9",
+":. c #DBE6E8",
+">. c #E2E4E4",
+",. c #E6E9E9",
+"<. c #ECECEC",
+"1. c #F1EFEF",
+"2. c #E1EDF0",
+"3. c #E9EFF0",
+"4. c #EEF3F3",
+"5. c #F5F5F4",
+"6. c #F8F7F7",
+"7. c #FBFBFA",
+"8. c None",
+/* pixels */
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.o o o o @ @ o o o o 8.8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.o o @ * * q q f J i q 7 * @ o o 8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.o O @ 7 K X.7.7.7.7.7.7.7.7.>.I i * @ o 8.8.8.8.8.8.",
+"8.8.8.8.8.o @ 8 T 6.7.7.7.7.7.7.7.7.7.7.7.7.7.#.s @ o o 8.8.8.8.",
+"8.8.8.o O * K 5.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7...8 O o 8.8.8.",
+"8.8.o O * I 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.>.0 O o 8.8.",
+"8.8.o @ I 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.<.7 O 8.8.",
+"8.o @ d 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.X.@ o 8.",
+"8.O @ $.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.a O 8.",
+"o @ p 6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.Y @ o ",
+"o @ L 6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.*.$ o ",
+"o O U 6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5. .; o ",
+"O $ P 5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.4.} % o ",
+"o < v 3.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.2.W O o ",
+"o w < *.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.| x # o ",
+"8.$ < V :.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.;.[ , ;   ",
+"8.o y : ( -.<.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.<.=.{ j 3 o 8.",
+"8.8.+ w 4 ` =.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.%.^ m > % . 8.",
+"8.8.o & 3 2 Q O.-.<.<.<.<.<.<.<.<.<.<.<.<.<.,.=.' H z : : . 8.8.",
+"8.8.8.o % w - M / ] &.-.,.,.<.<.<.<.<.<.<.>.O.! Z 5 < ; . 8.8.8.",
+"8.8.8.8.o O e : 1 n W ~ ` ] O.%.%.+.@.>.,.+.! z : w @ . 8.8.8.8.",
+"8.8.8.8.8.8.o % r 3 > 5 h N B G G R o.#.>.` D : ; .   8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.o + : w y w 3 3 - X ` @.%.W l w . 8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.. o o o o O + - ( +._ S 6 O   8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.o 4 ( ) F g = . 8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.O u E F z < . 8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.o 3 C A k > . 8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.9 c b t + . 8.8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.: % o .   8.8.8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.. 8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.",
+"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8."
+};
diff --git a/samples/shaped/shaped.cpp b/samples/shaped/shaped.cpp
index 6f7ea9fb76..9b05903463 100644
--- a/samples/shaped/shaped.cpp
+++ b/samples/shaped/shaped.cpp
@@ -38,6 +38,7 @@
 #endif
 
 #include "wx/dcclient.h"
+#include "wx/graphics.h"
 #include "wx/image.h"
 
 #ifndef __WXMSW__
@@ -114,7 +115,16 @@ public:
     void OnPaint(wxPaintEvent& evt);
 
 private:
-    bool     m_hasShape;
+    enum ShapeKind
+    {
+        Shape_None,
+        Shape_Star,
+#if wxUSE_GRAPHICS_CONTEXT
+        Shape_Circle,
+#endif // wxUSE_GRAPHICS_CONTEXT
+        Shape_Max
+    } m_shapeKind;
+
     wxBitmap m_bmp;
     wxPoint  m_delta;
 
@@ -382,29 +392,46 @@ ShapedFrame::ShapedFrame(wxFrame *parent)
                   | wxSTAY_ON_TOP
             )
 {
-    m_hasShape = false;
+    m_shapeKind = Shape_None;
     m_bmp = wxBitmap(wxT("star.png"), wxBITMAP_TYPE_PNG);
     SetSize(wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()));
-    SetToolTip(wxT("Right-click to close"));
+    SetToolTip(wxT("Right-click to close, double click to cycle shape"));
     SetWindowShape();
 }
 
 void ShapedFrame::SetWindowShape()
 {
-    wxRegion region(m_bmp, *wxWHITE);
-    m_hasShape = SetShape(region);
+    switch ( m_shapeKind )
+    {
+        case Shape_None:
+            SetShape(wxRegion());
+            break;
+
+        case Shape_Star:
+            SetShape(wxRegion(m_bmp, *wxWHITE));
+            break;
+
+#if wxUSE_GRAPHICS_CONTEXT
+        case Shape_Circle:
+            {
+                wxGraphicsPath
+                    path = wxGraphicsRenderer::GetDefaultRenderer()->CreatePath();
+                path.AddCircle(m_bmp.GetWidth()/2, m_bmp.GetHeight()/2, 30);
+                SetShape(path);
+            }
+            break;
+#endif // wxUSE_GRAPHICS_CONTEXT
+
+        case Shape_Max:
+            wxFAIL_MSG( "invalid shape kind" );
+            break;
+    }
 }
 
 void ShapedFrame::OnDoubleClick(wxMouseEvent& WXUNUSED(evt))
 {
-    if (m_hasShape)
-    {
-        wxRegion region;
-        SetShape(region);
-        m_hasShape = false;
-    }
-    else
-        SetWindowShape();
+    m_shapeKind = static_cast<ShapeKind>((m_shapeKind + 1) % Shape_Max);
+    SetWindowShape();
 }
 
 void ShapedFrame::OnLeftDown(wxMouseEvent& evt)
diff --git a/setup.h.in b/setup.h.in
index 26ae556bdb..0147d6d774 100644
--- a/setup.h.in
+++ b/setup.h.in
@@ -470,6 +470,8 @@
 
 #define wxUSE_NOTIFICATION_MESSAGE 0
 
+#define wxUSE_RICHTOOLTIP 0
+
 #define wxUSE_SASH          0
 
 #define wxUSE_SPLITTER      0
diff --git a/src/common/richtooltipcmn.cpp b/src/common/richtooltipcmn.cpp
new file mode 100644
index 0000000000..d2c829ba82
--- /dev/null
+++ b/src/common/richtooltipcmn.cpp
@@ -0,0 +1,82 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/richtooltipcmn.cpp
+// Purpose:     wxRichToolTip implementation common to all platforms.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-18
+// RCS-ID:      $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_RICHTOOLTIP
+
+#ifndef WX_PRECOMP
+    #include "wx/icon.h"
+#endif // WX_PRECOMP
+
+#include "wx/private/richtooltip.h"
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+wxRichToolTip::wxRichToolTip(const wxString& title,
+                             const wxString& message) :
+    m_impl(wxRichToolTipImpl::Create(title, message))
+{
+}
+
+void
+wxRichToolTip::SetBackgroundColour(const wxColour& col, const wxColour& colEnd)
+{
+    m_impl->SetBackgroundColour(col, colEnd);
+}
+
+void wxRichToolTip::SetIcon(int icon)
+{
+    m_impl->SetStandardIcon(icon);
+}
+
+void wxRichToolTip::SetIcon(const wxIcon& icon)
+{
+    m_impl->SetCustomIcon(icon);
+}
+
+void wxRichToolTip::SetTimeout(unsigned milliseconds)
+{
+    m_impl->SetTimeout(milliseconds);
+}
+
+void wxRichToolTip::SetTipKind(wxTipKind tipKind)
+{
+    m_impl->SetTipKind(tipKind);
+}
+
+void wxRichToolTip::ShowFor(wxWindow* win)
+{
+    wxCHECK_RET( win, wxS("Must have a valid window") );
+
+    m_impl->ShowFor(win);
+}
+
+wxRichToolTip::~wxRichToolTip()
+{
+    delete m_impl;
+}
+
+#endif // wxUSE_RICHTOOLTIP
diff --git a/src/generic/richtooltip.cpp b/src/generic/richtooltip.cpp
new file mode 100644
index 0000000000..7cb677aad7
--- /dev/null
+++ b/src/generic/richtooltip.cpp
@@ -0,0 +1,673 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/generic/richtooltip.cpp
+// Purpose:     Implementation of wxRichToolTip.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-07
+// RCS-ID:      $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_RICHTOOLTIP
+
+#ifndef WX_PRECOMP
+    #include "wx/dcmemory.h"
+    #include "wx/icon.h"
+    #include "wx/region.h"
+    #include "wx/settings.h"
+    #include "wx/sizer.h"
+    #include "wx/statbmp.h"
+    #include "wx/stattext.h"
+    #include "wx/timer.h"
+    #include "wx/utils.h"
+#endif // WX_PRECOMP
+
+#include "wx/private/richtooltip.h"
+#include "wx/generic/private/richtooltip.h"
+
+#include "wx/artprov.h"
+#include "wx/custombgwin.h"
+#include "wx/display.h"
+#include "wx/graphics.h"
+#include "wx/popupwin.h"
+#include "wx/textwrapper.h"
+
+#ifdef __WXMSW__
+    #include "wx/msw/uxtheme.h"
+
+    static const int TTP_BALLOONTITLE = 4;
+
+    static const int TMT_TEXTCOLOR = 3803;
+    static const int TMT_GRADIENTCOLOR1 = 3810;
+    static const int TMT_GRADIENTCOLOR2 = 3811;
+#endif
+
+// ----------------------------------------------------------------------------
+// wxRichToolTipPopup: the popup window used by wxRichToolTip.
+// ----------------------------------------------------------------------------
+
+class wxRichToolTipPopup :
+    public wxCustomBackgroundWindow<wxPopupTransientWindow>
+{
+public:
+    wxRichToolTipPopup(wxWindow* parent,
+                       const wxString& title,
+                       const wxString& message,
+                       const wxIcon& icon,
+                       wxTipKind tipKind,
+                       const wxFont& titleFont_) :
+        m_timer(this)
+    {
+        Create(parent, wxFRAME_SHAPED);
+
+
+        wxBoxSizer* const sizerTitle = new wxBoxSizer(wxHORIZONTAL);
+        if ( icon.IsOk() )
+        {
+            sizerTitle->Add(new wxStaticBitmap(this, wxID_ANY, icon),
+                            wxSizerFlags().Centre().Border(wxRIGHT));
+        }
+        //else: Simply don't show any icon.
+
+        wxStaticText* const labelTitle = new wxStaticText(this, wxID_ANY, "");
+        labelTitle->SetLabelText(title);
+
+        wxFont titleFont(titleFont_);
+        if ( !titleFont.IsOk() )
+        {
+            // Determine the appropriate title font for the current platform.
+            titleFont = labelTitle->GetFont();
+
+#ifdef __WXMSW__
+            // When using themes MSW tooltips use larger bluish version of the
+            // normal font.
+            wxUxThemeEngine* const theme = GetTooltipTheme();
+            if ( theme )
+            {
+                titleFont.MakeLarger();
+
+                COLORREF c;
+                if ( FAILED(theme->GetThemeColor
+                                   (
+                                        wxUxThemeHandle(parent, L"TOOLTIP"),
+                                        TTP_BALLOONTITLE,
+                                        0,
+                                        TMT_TEXTCOLOR,
+                                        &c
+                                    )) )
+                {
+                    // Use the standard value of this colour as fallback.
+                    c = 0x993300;
+                }
+
+                labelTitle->SetForegroundColour(wxRGBToColour(c));
+            }
+            else
+#endif // __WXMSW__
+            {
+                // Everything else, including "classic" MSW look uses just the
+                // bold version of the base font.
+                titleFont.MakeBold();
+            }
+        }
+
+        labelTitle->SetFont(titleFont);
+        sizerTitle->Add(labelTitle, wxSizerFlags().Centre());
+
+        wxBoxSizer* const sizerTop = new wxBoxSizer(wxVERTICAL);
+        sizerTop->Add(sizerTitle,
+                        wxSizerFlags().DoubleBorder(wxLEFT|wxRIGHT|wxTOP));
+
+        // Use a spacer as we don't want to have a double border between the
+        // elements, just a simple one will do.
+        sizerTop->AddSpacer(wxSizerFlags::GetDefaultBorder());
+
+        wxTextSizerWrapper wrapper(this);
+        wxSizer* sizerText = wrapper.CreateSizer(message, -1 /* No wrapping */);
+
+#ifdef __WXMSW__
+        if ( icon.IsOk() && GetTooltipTheme() )
+        {
+            // Themed tooltips under MSW align the text with the title, not
+            // with the icon, so use a helper horizontal sizer in this case.
+            wxBoxSizer* const sizerTextIndent = new wxBoxSizer(wxHORIZONTAL);
+            sizerTextIndent->AddSpacer(icon.GetWidth());
+            sizerTextIndent->Add(sizerText,
+                                    wxSizerFlags().Border(wxLEFT).Centre());
+
+            sizerText = sizerTextIndent;
+        }
+#endif // !__WXMSW__
+        sizerTop->Add(sizerText,
+                        wxSizerFlags().DoubleBorder(wxLEFT|wxRIGHT|wxBOTTOM)
+                                      .Centre());
+
+        SetSizer(sizerTop);
+
+        const int offsetY = SetTipShapeAndSize(tipKind, GetBestSize());
+        if ( offsetY > 0 )
+        {
+            // Offset our contents by the tip height to make it appear in the
+            // main rectangle.
+            sizerTop->PrependSpacer(offsetY);
+        }
+
+        Layout();
+    }
+
+    void SetBackground(wxColour colStart, wxColour colEnd)
+    {
+        if ( !colStart.IsOk() )
+        {
+            // Determine the best colour(s) to use on our own.
+#ifdef __WXMSW__
+            wxUxThemeEngine* const theme = GetTooltipTheme();
+            if ( theme )
+            {
+                wxUxThemeHandle hTheme(GetParent(), L"TOOLTIP");
+
+                COLORREF c1, c2;
+                if ( FAILED(theme->GetThemeColor
+                                   (
+                                        hTheme,
+                                        TTP_BALLOONTITLE,
+                                        0,
+                                        TMT_GRADIENTCOLOR1,
+                                        &c1
+                                    )) ||
+                    FAILED(theme->GetThemeColor
+                                  (
+                                        hTheme,
+                                        TTP_BALLOONTITLE,
+                                        0,
+                                        TMT_GRADIENTCOLOR2,
+                                        &c2
+                                  )) )
+                {
+                    c1 = 0xffffff;
+                    c2 = 0xf0e5e4;
+                }
+
+                colStart = wxRGBToColour(c1);
+                colEnd = wxRGBToColour(c2);
+            }
+            else
+#endif // __WXMSW__
+            {
+                colStart = wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK);
+            }
+        }
+
+        if ( colEnd.IsOk() )
+        {
+            // Use gradient-filled background bitmap.
+            const wxSize size = GetClientSize();
+            wxBitmap bmp(size);
+            {
+                wxMemoryDC dc(bmp);
+                dc.Clear();
+                dc.GradientFillLinear(size, colStart, colEnd, wxDOWN);
+            }
+
+            SetBackgroundBitmap(bmp);
+        }
+        else // Use solid colour.
+        {
+            SetBackgroundColour(colStart);
+        }
+    }
+
+    void DoShow()
+    {
+        wxPoint pos = GetTipPoint();
+
+        // We want our anchor point to coincide with this position so offset
+        // the position of the top left corner passed to Move() accordingly.
+        pos -= m_anchorPos;
+
+        Move(pos, wxSIZE_NO_ADJUSTMENTS);
+
+        Popup();
+    }
+
+    void SetTimeout(unsigned timeout)
+    {
+        if ( !timeout )
+            return;
+
+        Connect(wxEVT_TIMER, wxTimerEventHandler(wxRichToolTipPopup::OnTimer));
+
+        m_timer.Start(timeout, true /* one shot */);
+    }
+
+protected:
+    virtual void OnDismiss()
+    {
+        Destroy();
+    }
+
+private:
+#ifdef __WXMSW__
+    // Returns non-NULL theme only if we're using Win7-style tooltips.
+    static wxUxThemeEngine* GetTooltipTheme()
+    {
+        // Even themed applications under XP still use "classic" tooltips.
+        if ( wxGetWinVersion() <= wxWinVersion_XP )
+            return NULL;
+
+        return wxUxThemeEngine::GetIfActive();
+    }
+#endif // __WXMSW__
+
+    // For now we just hard code the tip height, would be nice to do something
+    // smarter in the future.
+    static int GetTipHeight()
+    {
+#ifdef __WXMSW__
+        if ( GetTooltipTheme() )
+            return 20;
+#endif // __WXMSW__
+
+        return 15;
+    }
+
+    // Get the point to which our tip should point.
+    wxPoint GetTipPoint() const
+    {
+        // Currently we always use the middle of the window. It seems that MSW
+        // native tooltips use a different point but it's not really clear how
+        // do they determine it nor whether it's worth the trouble to emulate
+        // their behaviour.
+        const wxRect r = GetParent()->GetScreenRect();
+        return wxPoint(r.x + r.width/2, r.y + r.height/2);
+    }
+
+    // Choose the correct orientation depending on the window position.
+    //
+    // Also use the tip kind appropriate for the current environment. For MSW
+    // the right triangles are used and for Mac the equilateral ones as this is
+    // the prevailing kind under these systems. For everything else we go with
+    // right triangles as well but without any real rationale so this could be
+    // tweaked in the future.
+    wxTipKind GetBestTipKind() const
+    {
+        const wxPoint pos = GetTipPoint();
+
+        // Use GetFromWindow() and not GetFromPoint() here to try to get the
+        // correct display even if the tip point itself is not visible.
+        int dpy = wxDisplay::GetFromWindow(GetParent());
+        if ( dpy == wxNOT_FOUND )
+            dpy = 0; // What else can we do?
+
+        const wxRect rectDpy = wxDisplay(dpy).GetClientArea();
+
+#ifdef __WXMAC__
+        return pos.y > rectDpy.height/2 ? wxTipKind_Bottom : wxTipKind_Top;
+#else // !__WXMAC__
+        return pos.y > rectDpy.height/2
+                    ? pos.x > rectDpy.width/2
+                        ? wxTipKind_BottomRight
+                        : wxTipKind_BottomLeft
+                    : pos.x > rectDpy.width/2
+                        ? wxTipKind_TopRight
+                        : wxTipKind_TopLeft;
+#endif // __WXMAC__/!__WXMAC__
+    }
+
+    // Set the size and shape of the tip window and returns the offset of its
+    // content area from the top (horizontal offset is always 0 currently).
+    int SetTipShapeAndSize(wxTipKind tipKind, const wxSize& contentSize)
+    {
+#if wxUSE_GRAPHICS_CONTEXT
+        wxSize size = contentSize;
+
+        // The size is the vertical size and the offset is the distance from
+        // edge for asymmetric tips, currently hard-coded to be the same as the
+        // size.
+        const int tipSize = GetTipHeight();
+        const int tipOffset = tipSize;
+
+        // The horizontal position of the tip.
+        int x = -1;
+
+        // The vertical coordinates of the tip base and apex.
+        int yBase = -1,
+            yApex = -1;
+
+        // The offset of the content part of the window.
+        int dy = -1;
+
+        // Define symbolic names for the rectangle corners and mid-way points
+        // that we use below in an attempt to make the code more clear. Notice
+        // that these values must be consecutive as we iterate over them.
+        enum RectPoint
+        {
+            RectPoint_TopLeft,
+            RectPoint_Top,
+            RectPoint_TopRight,
+            RectPoint_Right,
+            RectPoint_BotRight,
+            RectPoint_Bot,
+            RectPoint_BotLeft,
+            RectPoint_Left,
+            RectPoint_Max
+        };
+
+        // The starting point for AddArcToPoint() calls below, we iterate over
+        // all RectPoints from it.
+        RectPoint pointStart = RectPoint_Max;
+
+
+        // Hard-coded radius of the round main rectangle corners.
+        const double RADIUS = 5;
+
+        // Create a path defining the shape of the tooltip window.
+        wxGraphicsPath
+            path = wxGraphicsRenderer::GetDefaultRenderer()->CreatePath();
+
+        if ( tipKind == wxTipKind_Auto )
+            tipKind = GetBestTipKind();
+
+        // Points defining the tip shape (in clockwise order as we must end at
+        // tipPoints[0] after drawing the rectangle outline in this order).
+        wxPoint2DDouble tipPoints[3];
+
+        switch ( tipKind )
+        {
+            case wxTipKind_Auto:
+                wxFAIL_MSG( "Impossible kind value" );
+                break;
+
+            case wxTipKind_TopLeft:
+                x = tipOffset;
+                yApex = 0;
+                yBase = tipSize;
+                dy = tipSize;
+
+                tipPoints[0] = wxPoint2DDouble(x, yBase);
+                tipPoints[1] = wxPoint2DDouble(x, yApex);
+                tipPoints[2] = wxPoint2DDouble(x + tipSize, yBase);
+
+                pointStart = RectPoint_TopRight;
+                break;
+
+            case wxTipKind_TopRight:
+                x = size.x - tipOffset;
+                yApex = 0;
+                yBase = tipSize;
+                dy = tipSize;
+
+                tipPoints[0] = wxPoint2DDouble(x - tipSize, yBase);
+                tipPoints[1] = wxPoint2DDouble(x, yApex);
+                tipPoints[2] = wxPoint2DDouble(x, yBase);
+
+                pointStart = RectPoint_TopRight;
+                break;
+
+            case wxTipKind_BottomLeft:
+                x = tipOffset;
+                yApex = size.y + tipSize;
+                yBase = size.y;
+                dy = 0;
+
+                tipPoints[0] = wxPoint2DDouble(x + tipSize, yBase);
+                tipPoints[1] = wxPoint2DDouble(x, yApex);
+                tipPoints[2] = wxPoint2DDouble(x, yBase);
+
+                pointStart = RectPoint_BotLeft;
+                break;
+
+            case wxTipKind_BottomRight:
+                x = size.x - tipOffset;
+                yApex = size.y + tipSize;
+                yBase = size.y;
+                dy = 0;
+
+                tipPoints[0] = wxPoint2DDouble(x, yBase);
+                tipPoints[1] = wxPoint2DDouble(x, yApex);
+                tipPoints[2] = wxPoint2DDouble(x - tipSize, yBase);
+
+                pointStart = RectPoint_BotLeft;
+                break;
+
+            case wxTipKind_Top:
+                x = size.x/2;
+                yApex = 0;
+                yBase = tipSize;
+                dy = tipSize;
+
+                {
+                    // A half-side of an equilateral triangle is its altitude
+                    // divided by sqrt(3) ~= 1.73.
+                    const double halfside = tipSize/1.73;
+
+                    tipPoints[0] = wxPoint2DDouble(x - halfside, yBase);
+                    tipPoints[1] = wxPoint2DDouble(x, yApex);
+                    tipPoints[2] = wxPoint2DDouble(x + halfside, yBase);
+                }
+
+                pointStart = RectPoint_TopRight;
+                break;
+
+            case wxTipKind_Bottom:
+                x = size.x/2;
+                yApex = size.y + tipSize;
+                yBase = size.y;
+                dy = 0;
+
+                {
+                    const double halfside = tipSize/1.73;
+
+                    tipPoints[0] = wxPoint2DDouble(x + halfside, yBase);
+                    tipPoints[1] = wxPoint2DDouble(x, yApex);
+                    tipPoints[2] = wxPoint2DDouble(x - halfside, yBase);
+                }
+
+                pointStart = RectPoint_BotLeft;
+                break;
+
+            case wxTipKind_None:
+                x = size.x/2;
+                dy = 0;
+
+                path.AddRoundedRectangle(0, 0, size.x, size.y, RADIUS);
+                break;
+        }
+
+        wxASSERT_MSG( dy != -1, wxS("Unknown tip kind?") );
+
+        size.y += tipSize;
+        SetSize(size);
+
+        if ( tipKind != wxTipKind_None )
+        {
+            path.MoveToPoint(tipPoints[0]);
+            path.AddLineToPoint(tipPoints[1]);
+            path.AddLineToPoint(tipPoints[2]);
+
+            const double xLeft = 0.;
+            const double xMid = size.x/2.;
+            const double xRight = size.x;
+
+            const double yTop = dy;
+            const double yMid = (dy + size.y)/2.;
+            const double yBot = dy + contentSize.y;
+
+            wxPoint2DDouble rectPoints[RectPoint_Max];
+            rectPoints[RectPoint_TopLeft]  = wxPoint2DDouble(xLeft,  yTop);
+            rectPoints[RectPoint_Top]      = wxPoint2DDouble(xMid,   yTop);
+            rectPoints[RectPoint_TopRight] = wxPoint2DDouble(xRight, yTop);
+            rectPoints[RectPoint_Right]    = wxPoint2DDouble(xRight, yMid);
+            rectPoints[RectPoint_BotRight] = wxPoint2DDouble(xRight, yBot);
+            rectPoints[RectPoint_Bot]      = wxPoint2DDouble(xMid,   yBot);
+            rectPoints[RectPoint_BotLeft]  = wxPoint2DDouble(xLeft,  yBot);
+            rectPoints[RectPoint_Left]     = wxPoint2DDouble(xLeft,  yMid);
+
+            // Iterate over all rectangle rectPoints for the first 3 corners.
+            unsigned n = pointStart;
+            for ( unsigned corner = 0; corner < 3; corner++ )
+            {
+                const wxPoint2DDouble& pt1 = rectPoints[n];
+
+                n = (n + 1) % RectPoint_Max;
+
+                const wxPoint2DDouble& pt2 = rectPoints[n];
+
+                path.AddArcToPoint(pt1.m_x, pt1.m_y, pt2.m_x, pt2.m_y, RADIUS);
+
+                n = (n + 1) % RectPoint_Max;
+            }
+
+            // Last one wraps to the first point of the tip.
+            const wxPoint2DDouble& pt1 = rectPoints[n];
+            const wxPoint2DDouble& pt2 = tipPoints[0];
+
+            path.AddArcToPoint(pt1.m_x, pt1.m_y, pt2.m_x, pt2.m_y, RADIUS);
+
+            path.CloseSubpath();
+        }
+
+        SetShape(path);
+#else // !wxUSE_GRAPHICS_CONTEXT
+        int x = contentSize.x/2,
+            yApex = 0,
+            dy = 0;
+
+        SetSize(contentSize);
+#endif // wxUSE_GRAPHICS_CONTEXT/!wxUSE_GRAPHICS_CONTEXT
+
+        m_anchorPos.x = x;
+        m_anchorPos.y = yApex;
+
+        return dy;
+    }
+
+    // Timer event handler hides the tooltip when the timeout expires.
+    void OnTimer(wxTimerEvent& WXUNUSED(event))
+    {
+        // Doing "Notify" here ensures that our OnDismiss() is called and so we
+        // also Destroy() ourselves. We could use Dismiss() and call Destroy()
+        // explicitly from here as well.
+        DismissAndNotify();
+    }
+
+
+    // The anchor point offset if we show a tip or the middle of the top side
+    // otherwise.
+    wxPoint m_anchorPos;
+
+    // The timer counting down the time until we're hidden.
+    wxTimer m_timer;
+
+    wxDECLARE_NO_COPY_CLASS(wxRichToolTipPopup);
+};
+
+// ----------------------------------------------------------------------------
+// wxRichToolTipGenericImpl: generic implementation of wxRichToolTip.
+// ----------------------------------------------------------------------------
+
+void
+wxRichToolTipGenericImpl::SetBackgroundColour(const wxColour& col,
+                                              const wxColour& colEnd)
+{
+    m_colStart = col;
+    m_colEnd = colEnd;
+}
+
+void wxRichToolTipGenericImpl::SetCustomIcon(const wxIcon& icon)
+{
+    m_icon = icon;
+}
+
+void wxRichToolTipGenericImpl::SetStandardIcon(int icon)
+{
+    switch ( icon & wxICON_MASK )
+    {
+        case wxICON_WARNING:
+        case wxICON_ERROR:
+        case wxICON_INFORMATION:
+            // Although we don't use this icon in a list, we need a smallish
+            // icon here and not an icon of a typical message box size so use
+            // wxART_LIST to get it.
+            m_icon = wxArtProvider::GetIcon
+                     (
+                        wxArtProvider::GetMessageBoxIconId(icon),
+                        wxART_LIST
+                     );
+            break;
+
+        case wxICON_QUESTION:
+            wxFAIL_MSG("Question icon doesn't make sense for a tooltip");
+            break;
+
+        case wxICON_NONE:
+            m_icon = wxNullIcon;
+            break;
+    }
+}
+
+void wxRichToolTipGenericImpl::SetTimeout(unsigned milliseconds)
+{
+    m_timeout = milliseconds;
+}
+
+void wxRichToolTipGenericImpl::SetTipKind(wxTipKind tipKind)
+{
+    m_tipKind = tipKind;
+}
+
+void wxRichToolTipGenericImpl::SetTitleFont(const wxFont& font)
+{
+    m_titleFont = font;
+}
+
+void wxRichToolTipGenericImpl::ShowFor(wxWindow* win)
+{
+    // Set the focus to the window the tooltip refers to to make it look active.
+    win->SetFocus();
+
+    wxRichToolTipPopup* const popup = new wxRichToolTipPopup
+                                          (
+                                            win,
+                                            m_title,
+                                            m_message,
+                                            m_icon,
+                                            m_tipKind,
+                                            m_titleFont
+                                          );
+
+    popup->SetBackground(m_colStart, m_colEnd);
+
+    popup->DoShow();
+
+    popup->SetTimeout(m_timeout);
+}
+
+// Currently only wxMSW provides a native implementation.
+#ifndef __WXMSW__
+
+/* static */
+wxRichToolTipImpl*
+wxRichToolTipImpl::Create(const wxString& title, const wxString& message)
+{
+    return new wxRichToolTipGenericImpl(title, message);
+}
+
+#endif // !__WXMSW__
+
+#endif // wxUSE_RICHTOOLTIP
diff --git a/src/msw/richtooltip.cpp b/src/msw/richtooltip.cpp
new file mode 100644
index 0000000000..1736eb0324
--- /dev/null
+++ b/src/msw/richtooltip.cpp
@@ -0,0 +1,173 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/msw/richtooltip.cpp
+// Purpose:     Native MSW implementation of wxRichToolTip.
+// Author:      Vadim Zeitlin
+// Created:     2011-10-18
+// RCS-ID:      $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_RICHTOOLTIP
+
+#ifndef WX_PRECOMP
+#endif // WX_PRECOMP
+
+#include "wx/private/richtooltip.h"
+#include "wx/generic/private/richtooltip.h"
+#include "wx/msw/private.h"
+#include "wx/msw/uxtheme.h"
+
+// ============================================================================
+// wxRichToolTipMSWImpl: the real implementation.
+// ============================================================================
+
+class wxRichToolTipMSWImpl : public wxRichToolTipGenericImpl
+{
+public:
+    wxRichToolTipMSWImpl(const wxString& title, const wxString& message) :
+        wxRichToolTipGenericImpl(title, message)
+    {
+        // So far so good...
+        m_canUseNative = true;
+
+        m_ttiIcon = TTI_NONE;
+    }
+
+    virtual void SetBackgroundColour(const wxColour& col,
+                                     const wxColour& colEnd)
+    {
+        // Setting background colour is not supported neither.
+        m_canUseNative = false;
+
+        wxRichToolTipGenericImpl::SetBackgroundColour(col, colEnd);
+    }
+
+    virtual void SetCustomIcon(const wxIcon& icon)
+    {
+        // Custom icons are not supported by EM_SHOWBALLOONTIP.
+        m_canUseNative = false;
+
+        wxRichToolTipGenericImpl::SetCustomIcon(icon);
+    }
+
+    virtual void SetStandardIcon(int icon)
+    {
+        wxRichToolTipGenericImpl::SetStandardIcon(icon);
+        if ( !m_canUseNative )
+            return;
+
+        switch ( icon & wxICON_MASK )
+        {
+            case wxICON_WARNING:
+                m_ttiIcon = TTI_WARNING;
+                break;
+
+            case wxICON_ERROR:
+                m_ttiIcon = TTI_ERROR;
+                break;
+
+            case wxICON_INFORMATION:
+                m_ttiIcon = TTI_INFO;
+                break;
+
+            case wxICON_QUESTION:
+                wxFAIL_MSG("Question icon doesn't make sense for a tooltip");
+                break;
+
+            case wxICON_NONE:
+                m_ttiIcon = TTI_NONE;
+                break;
+        }
+    }
+
+    virtual void SetTimeout(unsigned milliseconds)
+    {
+        // We don't support changing the timeout (maybe TTM_SETDELAYTIME could
+        // be used for this?).
+        m_canUseNative = false;
+
+        wxRichToolTipGenericImpl::SetTimeout(milliseconds);
+    }
+
+    virtual void SetTipKind(wxTipKind tipKind)
+    {
+        // Setting non-default tip is not supported.
+        if ( tipKind != wxTipKind_Auto )
+            m_canUseNative = false;
+
+        wxRichToolTipGenericImpl::SetTipKind(tipKind);
+    }
+
+    virtual void SetTitleFont(const wxFont& font)
+    {
+        // Setting non-default font is not supported.
+        m_canUseNative = false;
+
+        wxRichToolTipGenericImpl::SetTitleFont(font);
+    }
+
+    virtual void ShowFor(wxWindow* win)
+    {
+        // TODO: We could use native tooltip control to show native balloon
+        //       tooltips for any window but right now we use the simple
+        //       EM_SHOWBALLOONTIP API which can only be used with text
+        //       controls.
+        if ( m_canUseNative )
+        {
+            wxTextCtrl* const text = wxDynamicCast(win, wxTextCtrl);
+            if ( text )
+            {
+                EDITBALLOONTIP ebt;
+                ebt.cbStruct = sizeof(EDITBALLOONTIP);
+                ebt.pszTitle = m_title.wc_str();
+                ebt.pszText = m_message.wc_str();
+                ebt.ttiIcon = m_ttiIcon;
+                if ( Edit_ShowBalloonTip(GetHwndOf(text), &ebt) )
+                    return;
+            }
+        }
+
+        // Don't set m_canUseNative to false here, we could be able to use the
+        // native tooltips if we're called for a different window the next
+        // time.
+        wxRichToolTipGenericImpl::ShowFor(win);
+    }
+
+private:
+    // If this is false, we've been requested to do something that the native
+    // version doesn't support and so need to fall back to the generic one.
+    bool m_canUseNative;
+
+    // One of TTI_NONE, TTI_INFO, TTI_WARNING or TTI_ERROR.
+    int m_ttiIcon;
+};
+
+/* static */
+wxRichToolTipImpl*
+wxRichToolTipImpl::Create(const wxString& title, const wxString& message)
+{
+    // EM_SHOWBALLOONTIP is only implemented by comctl32.dll v6 so don't even
+    // bother using the native implementation if we're not using themes.
+    if ( wxUxThemeEngine::GetIfActive() )
+        return new wxRichToolTipMSWImpl(title, message);
+
+    return new wxRichToolTipGenericImpl(title, message);
+}
+
+#endif // wxUSE_RICHTOOLTIP