← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2345: plug GDI mem leaks (missing DeleteDC calls)

 

------------------------------------------------------------
revno: 2345
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2010-12-13 00:10:36 +0100
message:
  plug GDI mem leaks (missing DeleteDC calls)
removed:
  dwt/include/dwt.hpp
  dwt/include/dwt/dwt.hpp
renamed:
  dwt/include/dwt/widgets/CoolBar.h => dwt/include/dwt/widgets/Rebar.h
  dwt/src/widgets/CoolBar.cpp => dwt/src/widgets/Rebar.cpp
modified:
  dwt/include/dwt/CanvasClasses.h
  dwt/include/dwt/aspects/AspectEraseBackground.h
  dwt/include/dwt/resources/Bitmap.h
  dwt/src/Bitmap.cpp
  dwt/src/CanvasClasses.cpp
  dwt/src/Taskbar.cpp
  dwt/src/widgets/Menu.cpp
  dwt/src/widgets/Table.cpp
  dwt/include/dwt/widgets/Rebar.h
  dwt/src/widgets/Rebar.cpp


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== removed file 'dwt/include/dwt.hpp'
--- dwt/include/dwt.hpp	2010-02-11 21:44:13 +0000
+++ dwt/include/dwt.hpp	1970-01-01 00:00:00 +0000
@@ -1,36 +0,0 @@
-/*
-  DC++ Widget Toolkit
-
-  Copyright (c) 2007-2010, Jacek Sieka
-
-  SmartWin++
-
-  Copyright (c) 2005 Thomas Hansen
-
-  All rights reserved.
-
-  Redistribution and use in source and binary forms, with or without modification,
-  are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice,
-        this list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation
-        and/or other materials provided with the distribution.
-      * Neither the name of the DWT nor SmartWin++ nor the names of its contributors
-        may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "dwt/dwt.hpp"

=== modified file 'dwt/include/dwt/CanvasClasses.h'
--- dwt/include/dwt/CanvasClasses.h	2010-03-08 18:55:17 +0000
+++ dwt/include/dwt/CanvasClasses.h	2010-12-12 23:10:36 +0000
@@ -549,6 +549,15 @@
 	virtual ~FreeCanvas() { }
 };
 
+/// Calls CreateCompatibleDC and returns a managed canvas.
+class CompatibleCanvas : public FreeCanvas
+{
+public:
+	explicit CompatibleCanvas(HDC hdc);
+
+	virtual ~CompatibleCanvas();
+};
+
 #ifndef WINCE
 // TODO: Create custom enums for typesafety... ?
 /// Helper class for setting and resetting the ROP2 mode

=== modified file 'dwt/include/dwt/aspects/AspectEraseBackground.h'
--- dwt/include/dwt/aspects/AspectEraseBackground.h	2010-07-10 14:36:48 +0000
+++ dwt/include/dwt/aspects/AspectEraseBackground.h	2010-12-12 23:10:36 +0000
@@ -55,22 +55,18 @@
 {
 	WidgetType& W() { return *static_cast<WidgetType*>(this); }
 
-	struct EraseBackgroundDispatcher {
-		typedef std::function<void (Canvas&)> F;
-
-		EraseBackgroundDispatcher(const F& f_, WidgetType* widget_) : f(f_), widget(widget_) { }
+	struct EraseBackgroundDispatcher : Dispatchers::Base<void (Canvas&)> {
+		typedef Dispatchers::Base<void (Canvas&)> BaseType;
+		EraseBackgroundDispatcher(const F& f_) : BaseType(f_) { }
 
 		bool operator()(const MSG& msg, LRESULT& ret) const {
-			FreeCanvas canvas( widget->handle(), reinterpret_cast< HDC >( msg.wParam ) );
-
+			FreeCanvas canvas(reinterpret_cast<HDC>(msg.wParam));
 			f(canvas);
 			ret = 1;
 			return true;
 		}
-
-		F f;
-		WidgetType* widget;
 	};
+
 public:
 	/// \ingroup EventHandlersAspectEraseBackground
 	/// Setting the event handler for the "erase background" event

=== removed file 'dwt/include/dwt/dwt.hpp'
--- dwt/include/dwt/dwt.hpp	2010-11-13 16:49:19 +0000
+++ dwt/include/dwt/dwt.hpp	1970-01-01 00:00:00 +0000
@@ -1,83 +0,0 @@
-/*
-  DC++ Widget Toolkit
-
-  Copyright (c) 2007-2010, Jacek Sieka
-
-  SmartWin++
-
-  Copyright (c) 2005 Thomas Hansen
-
-  All rights reserved.
-
-  Redistribution and use in source and binary forms, with or without modification,
-  are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice,
-        this list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation
-        and/or other materials provided with the distribution.
-      * Neither the name of the DWT nor SmartWin++ nor the names of its contributors
-        may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef DWT_SmartWin_h
-#define DWT_SmartWin_h
-
-#include "WindowsHeaders.h"
-
-#include "Application.h"
-#include "ClipBoard.h"
-#include "Cursor.h"
-#include "LibraryLoader.h"
-#include "Point.h"
-#include "Rectangle.h"
-#include "resources/Accelerator.h"
-#include "resources/Bitmap.h"
-#include "resources/Brush.h"
-#include "resources/Font.h"
-#include "resources/Icon.h"
-#include "resources/ImageList.h"
-#include "resources/Pen.h"
-#include "tstring.h"
-#include "widgets/Button.h"
-#include "widgets/CheckBox.h"
-#include "widgets/ComboBox.h"
-#include "widgets/Container.h"
-#include "widgets/CoolBar.h"
-#include "widgets/DateTime.h"
-#include "widgets/GroupBox.h"
-#include "widgets/Label.h"
-#include "widgets/Menu.h"
-#include "widgets/MDIChild.h"
-#include "widgets/MDIFrame.h"
-#include "widgets/MDIParent.h"
-#include "widgets/ModalDialog.h"
-#include "widgets/ModelessDialog.h"
-#include "widgets/ProgressBar.h"
-#include "widgets/RadioButton.h"
-#include "widgets/RichTextBox.h"
-#include "widgets/Slider.h"
-#include "widgets/Spinner.h"
-#include "widgets/StatusBar.h"
-#include "widgets/Table.h"
-#include "widgets/TabView.h"
-#include "widgets/TextBox.h"
-#include "widgets/Tree.h"
-#include "widgets/ToolBar.h"
-#include "widgets/ToolTip.h"
-#include "widgets/Window.h"
-
-#endif

=== modified file 'dwt/include/dwt/resources/Bitmap.h'
--- dwt/include/dwt/resources/Bitmap.h	2010-02-11 21:44:13 +0000
+++ dwt/include/dwt/resources/Bitmap.h	2010-12-12 23:10:36 +0000
@@ -107,7 +107,7 @@
 	/** This function is IMMUTABLE meaning it will not modify the given bitmap at all
 	  * but rather return a new Bitmap containing the resized Bitmap.
 	  */
-	BitmapPtr resize( const Point & newSize ) const;
+	BitmapPtr resize(const Point& newSize) const;
 
 private:
 	friend class Handle<GdiPolicy<HBITMAP> >;

=== renamed file 'dwt/include/dwt/widgets/CoolBar.h' => 'dwt/include/dwt/widgets/Rebar.h'
--- dwt/include/dwt/widgets/CoolBar.h	2010-02-11 21:44:13 +0000
+++ dwt/include/dwt/widgets/Rebar.h	2010-12-12 23:10:36 +0000
@@ -33,59 +33,34 @@
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-#ifndef DWT_CoolBar_h
-#define DWT_CoolBar_h
-
-#ifndef WINCE // Doesn't exist in Windows CE based systems
-
-#include "../aspects/AspectEnabled.h"
-#include "../aspects/AspectKeyboard.h"
-#include "../aspects/AspectFont.h"
-#include "../aspects/AspectRaw.h"
-#include "../aspects/AspectSizable.h"
-#include "../aspects/AspectVisible.h"
-#include "../util/check.h"
+#ifndef DWT_Rebar_h
+#define DWT_Rebar_h
+
+#include "Control.h"
 
 namespace dwt {
 
-/// Coolbar Control class
+/// Rebar Control class
 /** \ingroup WidgetControls
   * \WidgetUsageInfo
-  * \image html coolbar.PNG
-  * A coolbar is a strip of buttons normally associated with menu commands, like  for
+  * \image html Rebar.PNG
+  * A Rebar is a strip of buttons normally associated with menu commands, like  for
   * instance Internet Explorer has ( unless you have made them invisible ) a toolbar
   * of buttons, one for going "home", one to stop rendering of the  current page, one
   * to view the log of URL's you have been to etc... In addition to serving like a
-  * dockable toolbar ( see ToolBar ) a Coolbar  Widget can also contain more
+  * dockable toolbar ( see ToolBar ) a Rebar  Widget can also contain more
   * complex Widgets lke for instance a ComboBox, a TextBox and so on...
-  *
-  * @todo This class needs some love...
   */
-class CoolBar :
-	public Widget,
-
-	// Aspects
-	public AspectEnabled< CoolBar >,
-	public AspectKeyboard< CoolBar >,
-	public AspectFont< CoolBar >,
-	public AspectRaw< CoolBar >,
-	private AspectSizable< CoolBar >,
-	public AspectVisible< CoolBar >
+class Rebar :
+	public Control
 {
-	typedef Widget BaseType;
-	typedef dwt::AspectSizable< CoolBar > AspectSizable;
-	friend class WidgetCreator< CoolBar >;
+	typedef Control BaseType;
+
+	friend class WidgetCreator<Rebar>;
+
 public:
-	// Including the stuff we need from AspectSizable to make it accessible
-	// Note here that since we DON'T want the setBounds functions we must
-	// inherit privately from AspectSizable and include the stuff we WAN'T to
-	// expose from AspectSizable in a public block of the class.
-	using AspectSizable::bringToFront;
-	using AspectSizable::onSized;
-	using AspectSizable::onMoved;
-
 	/// Class type
-	typedef CoolBar ThisType;
+	typedef Rebar ThisType;
 
 	/// Object type
 	typedef ThisType* ObjectType;
@@ -101,27 +76,25 @@
 		Seed();
 	};
 
-	/// Actually creates the Coolbar
-	/** You should call WidgetFactory::createCoolbar if you instantiate class
+	/// Actually creates the Rebar
+	/** You should call WidgetFactory::createRebar if you instantiate class
 	  * directly. <br>
 	  * Only if you DERIVE from class you should call this function directly.
 	  */
-	void create( const Seed & cs = Seed() );
+	void create(const Seed& cs = Seed());
 
-	/// Refreshes the Coolbar
+#if 0
+	/// Refreshes the Rebar
 	/** Call this one after the container widget has been resized to make sure the
-	  * coolbar is having the right size...
+	  * Rebar is having the right size...
 	  */
 	void refresh();
+#endif
 
 protected:
-	// CTOR
-	explicit CoolBar(Widget *parent );
-
-	// To assure nobody accidentally deletes any heaped object of this type, parent
-	// is supposed to do so when parent is killed...
-	virtual ~CoolBar()
-	{}
+	// Protected to avoid direct instantiation
+	explicit Rebar(Widget* parent);
+	virtual ~Rebar() { }
 
 private:
 	friend class ChainingDispatcher;
@@ -131,29 +104,6 @@
 	void addChild( Widget * child, unsigned width, unsigned height, const tstring & txt );
 };
 
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Implementation of class
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/*
-inline CoolBar::CoolBar( Widget * parent )
-	: BaseType( parent )
-{
-	// Can't have a text box without a parent...
-	dwtassert( parent, _T( "Can't have a Button without a parent..." ) );
-}
-*/
-inline void CoolBar::refresh() {
-	// This might look a bit stupid, but Windows API have some minor flaws. One of
-	// those flaws is that a Coolbar (and a Toolbar) control must be "resized" with
-	// a dummy value to make sure the Coolbar (&& the Toolbar) fills up the
-	// complete area of the container Widget...
-
-	if ( ::MoveWindow( this->handle(), 0, 0, 0, 0, TRUE ) == 0 ) {
-		dwtWin32DebugFail("Couldn't reposition windows");
-	}
-}
-
-}
-
-#endif  //WINCE
-#endif  //CoolBar_h
+}
+
+#endif

=== modified file 'dwt/src/Bitmap.cpp'
--- dwt/src/Bitmap.cpp	2010-02-11 21:44:13 +0000
+++ dwt/src/Bitmap.cpp	2010-12-12 23:10:36 +0000
@@ -34,6 +34,8 @@
 */
 
 #include <dwt/resources/Bitmap.h>
+
+#include <dwt/CanvasClasses.h>
 #include <dwt/Point.h>
 
 namespace dwt {
@@ -75,25 +77,18 @@
 	return Point( bm.bmWidth, bm.bmHeight );
 }
 
-BitmapPtr Bitmap::resize( const Point & newSize ) const
-{
-	HDC hdc1 = ::CreateCompatibleDC( 0 );
-	HBITMAP hBitmapOld1 = ( HBITMAP )::SelectObject( hdc1, handle() );
+BitmapPtr Bitmap::resize(const Point& newSize) const {
+	CompatibleCanvas dc1(0);
+	Canvas::Selector select1(dc1, *this);
 
-	HDC hdc2 = ::CreateCompatibleDC( 0 );
-	HBITMAP hBitmapNew = ::CreateCompatibleBitmap( hdc1, newSize.x, newSize.y );
-	HBITMAP hBitmapOld2 = ( HBITMAP )::SelectObject( hdc2, hBitmapNew );
+	CompatibleCanvas dc2(0);
+	BitmapPtr ret(new Bitmap(::CreateCompatibleBitmap(dc1.handle(), newSize.x, newSize.y)));
+	Canvas::Selector select2(dc2, *ret);
 
 	const Point oldSize = getSize();
-	::StretchBlt( hdc2, 0, 0, newSize.x, newSize.y, hdc1, 0, 0, oldSize.x, oldSize.y, SRCCOPY );
-
-	hBitmapNew = ( HBITMAP )::SelectObject( hdc2, hBitmapOld2 );
-
-	// Clean up
-	::SelectObject( hdc1, hBitmapOld1 );
-	::DeleteDC( hdc2 );
-	::DeleteDC( hdc1 );
-	return BitmapPtr( new Bitmap( hBitmapNew ) );
+	::StretchBlt(dc2.handle(), 0, 0, newSize.x, newSize.y, dc1.handle(), 0, 0, oldSize.x, oldSize.y, SRCCOPY);
+
+	return ret;
 }
 
 }

=== modified file 'dwt/src/CanvasClasses.cpp'
--- dwt/src/CanvasClasses.cpp	2010-03-08 18:55:17 +0000
+++ dwt/src/CanvasClasses.cpp	2010-12-12 23:10:36 +0000
@@ -280,6 +280,15 @@
 	itsHdc = hdc;
 }
 
+CompatibleCanvas::CompatibleCanvas(HDC hdc) :
+FreeCanvas(::CreateCompatibleDC(hdc))
+{
+}
+
+CompatibleCanvas::~CompatibleCanvas() {
+	::DeleteDC(itsHdc);
+}
+
 #ifndef WINCE
 HdcModeSetter::HdcModeSetter( Canvas & canvas, int mode )
 	: itsOldMode( ::GetROP2( canvas.handle() ) ),

=== modified file 'dwt/src/Taskbar.cpp'
--- dwt/src/Taskbar.cpp	2010-11-02 16:09:03 +0000
+++ dwt/src/Taskbar.cpp	2010-12-12 23:10:36 +0000
@@ -220,7 +220,7 @@
 	BITMAPINFO info = { { sizeof(BITMAPINFOHEADER), size_full.x, size_full.y, 1, 32, BI_RGB } };
 	BitmapPtr bitmap_full(new Bitmap(::CreateDIBSection(canvas.handle(), &info, DIB_RGB_COLORS, 0, 0, 0)));
 
-	FreeCanvas canvas_full(::CreateCompatibleDC(canvas.handle()));
+	CompatibleCanvas canvas_full(canvas.handle());
 	Canvas::Selector select_full(canvas_full, *bitmap_full);
 
 	tab->sendMessage(WM_PRINT, reinterpret_cast<WPARAM>(canvas_full.handle()), PRF_CLIENT | PRF_NONCLIENT | PRF_CHILDREN | PRF_ERASEBKGND);
@@ -243,7 +243,7 @@
 	info.bmiHeader.biHeight = size_thumb.y;
 	BitmapPtr bitmap_thumb(new Bitmap(::CreateDIBSection(canvas.handle(), &info, DIB_RGB_COLORS, 0, 0, 0)));
 
-	FreeCanvas canvas_thumb(::CreateCompatibleDC(canvas.handle()));
+	CompatibleCanvas canvas_thumb(canvas.handle());
 	Canvas::Selector select_thumb(canvas_thumb, *bitmap_thumb);
 
 	::SetStretchBltMode(canvas_thumb.handle(), HALFTONE);

=== modified file 'dwt/src/widgets/Menu.cpp'
--- dwt/src/widgets/Menu.cpp	2010-11-30 18:55:29 +0000
+++ dwt/src/widgets/Menu.cpp	2010-12-12 23:10:36 +0000
@@ -662,21 +662,19 @@
 			canvas.fill(iconRectangle, Brush(highlight ? colors.highlightBackground : colors.stripBar));
 
 			// create memory DC and set bitmap on it
-			HDC memoryDC = ::CreateCompatibleDC( canvas.handle() );
-			HGDIOBJ old = ::SelectObject( memoryDC, ::CreateCompatibleBitmap( canvas.handle(), iconSize.x, iconSize.y ) );
+			CompatibleCanvas canvas_compat(canvas.handle());
+			BitmapPtr bitmap_compat(new Bitmap(::CreateCompatibleBitmap(canvas.handle(), iconSize.x, iconSize.y)));
+			Canvas::Selector select_compat(canvas_compat, *bitmap_compat);
 
 			// draw into memory
 			RECT rc( Rectangle( 0, 0, iconSize.x, iconSize.y ) );
-			::DrawFrameControl( memoryDC, & rc, DFC_MENU, ( info.fType & MFT_RADIOCHECK ) == 0 ? DFCS_MENUCHECK : DFCS_MENUBULLET );
+			::DrawFrameControl(canvas_compat.handle(), & rc, DFC_MENU, ( info.fType & MFT_RADIOCHECK ) == 0 ? DFCS_MENUCHECK : DFCS_MENUBULLET );
 
 			const int adjustment = 2; // adjustment for mark to be in the center
 
 			// bit - blast into out canvas
-			::BitBlt( canvas.handle(), iconRectangle.left() + adjustment, iconRectangle.top(), iconSize.x, iconSize.y, memoryDC, 0, 0, SRCAND );
-
-			// delete memory dc
-			::DeleteObject( ::SelectObject( memoryDC, old ) );
-			::DeleteDC( memoryDC );
+			::BitBlt(canvas.handle(), iconRectangle.left() + adjustment, iconRectangle.top(),
+				iconSize.x, iconSize.y, canvas_compat.handle(), 0, 0, SRCAND);
 		}
 
 		if(isChecked && !theme && popup && !wrapper->isTitle) {

=== renamed file 'dwt/src/widgets/CoolBar.cpp' => 'dwt/src/widgets/Rebar.cpp'
--- dwt/src/widgets/CoolBar.cpp	2010-02-11 21:44:13 +0000
+++ dwt/src/widgets/Rebar.cpp	2010-12-12 23:10:36 +0000
@@ -29,21 +29,41 @@
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-#include <dwt/widgets/CoolBar.h>
+#include <dwt/widgets/Rebar.h>
 #include <dwt/DWTException.h>
 
 namespace dwt {
 
-CoolBar::Seed::Seed() :
-	BaseType::Seed(WS_CHILD | WS_VISIBLE | RBS_VARHEIGHT | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER)
-{
-}
-
-void CoolBar::create( const Seed & cs ) {
+const TCHAR Rebar::windowClass[] = REBARCLASSNAME;
+
+Rebar::Seed::Seed() :
+BaseType::Seed(WS_CHILD | RBS_VARHEIGHT | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER)
+{
+}
+
+Rebar::Rebar(Widget* parent) :
+BaseType(parent, ChainingDispatcher::superClass<Rebar>())
+{
+}
+
+void Rebar::create(const Seed& cs) {
 	BaseType::create(cs);
 }
 
-void CoolBar::addChild( Widget * child,
+#if 0
+void Rebar::refresh() {
+	// This might look a bit stupid, but Windows API have some minor flaws. One of
+	// those flaws is that a Rebar (and a Toolbar) control must be "resized" with
+	// a dummy value to make sure the Rebar (&& the Toolbar) fills up the
+	// complete area of the container Widget...
+
+	if ( ::MoveWindow( this->handle(), 0, 0, 0, 0, TRUE ) == 0 ) {
+		dwtWin32DebugFail("Couldn't reposition windows");
+	}
+}
+#endif
+
+void Rebar::addChild( Widget * child,
 	unsigned width, unsigned height, const tstring & txt
 	)
 {
@@ -62,9 +82,8 @@
 	rbBand.fStyle = 0; //RBBS_GRIPPERALWAYS;
 	if ( sendMessage( RB_INSERTBAND, ( WPARAM ) - 1, ( LPARAM ) & rbBand ) == 0 )
 	{
-		throw DWTException( "There was a problem when trying to insert a band into your Coolbar object!");
+		throw DWTException( "There was a problem when trying to insert a band into your Rebar object!");
 	}
 }
 
-
 }

=== modified file 'dwt/src/widgets/Table.cpp'
--- dwt/src/widgets/Table.cpp	2010-12-08 23:15:35 +0000
+++ dwt/src/widgets/Table.cpp	2010-12-12 23:10:36 +0000
@@ -535,7 +535,7 @@
 	triangle.push_back(Point(10, 6));
 
 	UpdateCanvas dc(this);
-	FreeCanvas dc_compat(::CreateCompatibleDC(dc.handle()));
+	CompatibleCanvas dc_compat(dc.handle());
 
 	upArrow = BitmapPtr(new Bitmap(::CreateCompatibleBitmap(dc.handle(), size.x, size.y)));
 	downArrow = BitmapPtr(new Bitmap(::CreateCompatibleBitmap(dc.handle(), size.x, size.y)));