From f60d0f944a6ce86bce59901e7ea3811f0992bce7 Mon Sep 17 00:00:00 2001
From: Julian Smart <julian@anthemion.co.uk>
Date: Wed, 23 Dec 1998 09:58:02 +0000
Subject: [PATCH] Got generic wxListCtrl, wxTreeCtrl working under Windows,
 wxNotebook almost; some doc corrections; Win16 dialog crash cured

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1255 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/evthand.tex            |  33 ++++++++++++++++++++++++
 docs/latex/wx/icon.tex               |  11 +++++++-
 docs/latex/wx/paintdc.tex            |   3 ++-
 docs/latex/wx/tdnd.tex               |  36 ++++++++++++---------------
 docs/msw/changes.txt                 |  10 ++++++++
 docs/msw/install.txt                 |   7 ++----
 docs/msw/issues.txt                  |   4 ---
 include/wx/generic/listctrl.h        |   2 +-
 samples/notebook/test.cpp            |   8 +++---
 samples/treectrl/bitmaps/file1.bmp   | Bin 0 -> 246 bytes
 samples/treectrl/bitmaps/folder1.bmp | Bin 0 -> 246 bytes
 samples/treectrl/treetest.cpp        |   8 +++++-
 samples/treectrl/treetest.rc         |   3 +++
 src/common/utilscmn.cpp              |   2 +-
 src/generic/imaglist.cpp             |  26 +++++++++++++------
 src/generic/listctrl.cpp             |  13 +++++++---
 src/generic/notebook.cpp             |   6 +++--
 src/generic/treectrl.cpp             |   9 ++++---
 src/motif/metafile.cpp               |   2 +-
 src/motif/utilsexc.cpp               |   2 +-
 src/msw/dc.cpp                       |   6 +++++
 src/msw/icon.cpp                     |   7 ++++++
 src/msw/makefile.nt                  |  33 +++++++++++++++++++++---
 src/msw/window.cpp                   |   8 ++++++
 24 files changed, 178 insertions(+), 61 deletions(-)
 create mode 100644 samples/treectrl/bitmaps/file1.bmp
 create mode 100644 samples/treectrl/bitmaps/folder1.bmp

diff --git a/docs/latex/wx/evthand.tex b/docs/latex/wx/evthand.tex
index 16e10a1bcb..eff1e2aeeb 100644
--- a/docs/latex/wx/evthand.tex
+++ b/docs/latex/wx/evthand.tex
@@ -28,6 +28,39 @@ Destructor. If the handler is part of a chain, the destructor will
 unlink itself and restore the previous and next handlers so that they point to
 each other.
 
+\membersection{wxEvtHandler::Connect}\label{wxevthandlerconnect}
+
+\func{void}{Connect}{\param{int}{ id},
+ \param{wxEventType }{eventType}, \param{wxObjectEventFunction}{ function},
+ \param{wxObject*}{ userData = NULL}}
+
+\func{void}{Connect}{\param{int}{ id}, \param{int}{ lastId},
+ \param{wxEventType }{eventType}, \param{wxObjectEventFunction}{ function},
+ \param{wxObject*}{ userData = NULL}}
+
+Connects the given function dynamically with the event handler, id and event type. This
+is an alternative to the use of static event tables. See the 'dynamic' sample for usage.
+
+\wxheading{Parameters}
+
+\docparam{id}{The identifier (or first of the identifier range) to be associated with the event handler function.}
+
+\docparam{lastId}{The second part of the identifier range to be associated with the event handler function.}
+
+\docparam{eventType}{The event type to be associated with this event handler.}
+
+\docparam{function}{The event handler function.}
+
+\docparam{userData}{Data to be associated with the event table entry.}
+
+\wxheading{Example}
+
+\begin{verbatim}
+  frame->Connect( wxID_EXIT,
+    wxEVT_COMMAND_MENU_SELECTED,
+    (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) MyFrame::OnQuit );
+\end{verbatim}
+
 \membersection{wxEvtHandler::Default}\label{wxevthandlerdefault}
 
 \func{virtual long}{Default}{\void}
diff --git a/docs/latex/wx/icon.tex b/docs/latex/wx/icon.tex
index 87193b04c6..fdc9efd9af 100644
--- a/docs/latex/wx/icon.tex
+++ b/docs/latex/wx/icon.tex
@@ -76,7 +76,8 @@ Creates a new icon.
 
 Creates an icon from XPM data.
 
-\func{}{wxIcon}{\param{const wxString\& }{name}, \param{long}{ type}}
+\func{}{wxIcon}{\param{const wxString\& }{name}, \param{long}{ type},
+  \param{int}{ desiredWidth = -1}, \param{int}{ desiredHeight = -1}}
 
 Loads an icon from a file or resource.
 
@@ -88,6 +89,14 @@ Loads an icon from a file or resource.
 
 \docparam{height}{Specifies the height of the icon.}
 
+\docparam{desiredWidth}{Specifies the desired width of the icon. This
+parameter only has an effect in Windows (32-bit) where icon resources can contain
+several icons of different sizes.}
+
+\docparam{desiredWidth}{Specifies the desired height of the icon. This
+parameter only has an effect in Windows (32-bit) where icon resources can contain
+several icons of different sizes.}
+
 \docparam{depth}{Specifies the depth of the icon. If this is omitted, the display depth of the
 screen is used.}
 
diff --git a/docs/latex/wx/paintdc.tex b/docs/latex/wx/paintdc.tex
index 5589b42648..05842fb646 100644
--- a/docs/latex/wx/paintdc.tex
+++ b/docs/latex/wx/paintdc.tex
@@ -3,7 +3,8 @@
 A wxPaintDC must be constructed if an application wishes to paint on the
 client area of a window from within an {\bf OnPaint} event.
 This should normally be constructed as a temporary stack object; don't store
-a wxPaintDC object.
+a wxPaintDC object. If you have an OnPaint handler, you {\it must} create a wxPaintDC
+object within it even if you don't actually use it.
 
 Using wxPaintDC within OnPaint is important because it automatically
 sets the clipping area to the damaged area of the window. Attempts to draw
diff --git a/docs/latex/wx/tdnd.tex b/docs/latex/wx/tdnd.tex
index 3955a86538..cbd0d8ea5a 100644
--- a/docs/latex/wx/tdnd.tex
+++ b/docs/latex/wx/tdnd.tex
@@ -15,37 +15,36 @@ Headers: <wx/dataobj.h>, <wx/dropsrc.h and <wx/droptgt.h>>
 
 This overview describes wxWindows support for drag and drop and clipboard
 operations. Both of these topics are discussed here because, in fact, they're
-quite related. Drag and drop and clipboard are just too ways of passing the
+quite related. Drag and drop and clipboard are just two ways of passing the
 data around and so the code required to implement both types of the operations
 is almost the same.
 
-Both operations involve passing some data from one program to another
-(although the data may be received in the same program as well). In the case
-of clipboard transfer, the data is first places on the clipboard and then
-pasted into the destination program while for a drag-and-drop operation the
+Both operations involve passing some data from one program to another,
+although the data can be received in the same program as the source. In the case
+of clipboard transfer, the data is first placed on the clipboard and then
+pasted into the destination program, while for a drag-and-drop operation the
 data object is not stored anywhere but is created when the user starts
-dragging and is destroyed as soon as he ends it (whether the operation was
-ended successfully or cancelled).
+dragging and is destroyed as soon as he ends it, whether the operation was
+ended successfully or cancelled.
 
 To be a {\it drag source}, i.e. to provide the data which may be dragged by
-user elsewhere you should implement the following steps:
+user elsewhere, you should implement the following steps:
 
 \begin{itemize}\itemsep=0pt
 \item {\bf Preparation:} First of all, the data object must be created and
-initilized with the data you wish to drag. For example:
+initialized with the data you wish to drag. For example:
 
 \begin{verbatim}
 	wxTextDataObject data("This string will be dragged.");
 \end{verbatim}
 
 Of course, the data object may contain arbitrary data of any type, but for
-this you should derive your own class from 
-\helpref{wxDataObject}{wxdataobject} overriding all of its pure virtual
+this you should derive your own class from \helpref{wxDataObject}{wxdataobject} overriding all of its pure virtual
 functions.
 
 \item{\bf Drag start:} To start dragging process (typically in response to a
-mouse click) you must call \helpref{DoDragDrop}{wxdropsourcedodragdrop}
-function of wxDropSource object which should be constructed like this:
+mouse click) you must call \helpref{DoDragDrop}{wxdropsourcedodragdrop} function
+of wxDropSource object which should be constructed like this:
 
 \begin{verbatim}
 	wxDropSource dragSource(data, this);
@@ -63,8 +62,8 @@ same drag-and-drop protocol (any program under Windows or any program supporting
 under X Windows), the corresponding \helpref{wxDropTarget}{wxdroptarget} methods
 are called - see below.
 
-\item {\bf Processing the result:} DoDragDrop() returns an {\it effect code}
-which is one of the values of \helpref{wxDragResult}{wxdragresult} enum. Codes
+\item {\bf Processing the result:} DoDragDrop() returns an {\it effect code} which
+is one of the values of \helpref{wxDragResult}{wxdragresult} enum. Codes
 of wxDragError, wxDragNone and wxDragCancel have the obvious meaning and mean
 that there is nothing to do on the sending end (except of possibly logging the
 error in the first case). wxDragCopy means that the data has been successfully
@@ -72,10 +71,8 @@ copied and doesn't require any specific actions neither. But wxDragMove is
 special because it means that the data must be deleted from where it was
 copied. If it doesn't make sense (dragging selected text from a read-only
 file) you should pass FALSE as parameter to DoDragDrop() in the previous step.
-
 \end{itemize}
 
-
 To be a {\it drop target}, i.e. to receive the data dropped by user you should
 follow the instructions below:
 
@@ -91,8 +88,8 @@ or OnDropFiles() method.
 
 \item {\bf Drop:} When the user releases the mouse over a window, wxWindows
 queries the associated wxDropTarget object if it accepts the data. For
-this, \helpref{GetFormatCount}{wxdroptargetgetformatcount} and
-\helpref{GetFormat}{wxdroptargetgetformat} are used and if the format is
+this, \helpref{GetFormatCount}{wxdroptargetgetformatcount} and \helpref{GetFormat}{wxdroptargetgetformat} are
+used and if the format is
 supported (i.e. is one of returned by GetFormat()), 
 then \helpref{OnDrop}{wxdroptargetondrop} is called. 
 Otherwise, \helpref{wxDragNone}{stdformat} is returned by DoDragDrop() and
@@ -102,6 +99,5 @@ nothing happens.
 wxDragCopy or wxDragMove depending on the state of the keys (<Ctrl>, <Shift>
 and <Alt>) at the moment of drop. There is currently no way for the drop
 target to change this return code.
-
 \end{itemize}
 
diff --git a/docs/msw/changes.txt b/docs/msw/changes.txt
index f2ad9cdb14..25d5b38935 100644
--- a/docs/msw/changes.txt
+++ b/docs/msw/changes.txt
@@ -2,6 +2,16 @@
 wxWindows 2.0 for Windows Change Log
 ------------------------------------
 
+Alpha 18, December 23nd 1998
+----------------------------
+
+- Win16 support working again (VC++ 1.5)
+- Win16 now uses generic wxNotebook, wxListCtrl,
+  wxTreeCtrl -- more or less working now, although
+  a little work on wxNotebook is still needed.
+  Under 16-bit Windows, get assertion when you click
+  on a tab.
+
 Alpha 17, November 22nd 1998
 ----------------------------
 
diff --git a/docs/msw/install.txt b/docs/msw/install.txt
index 09562235ec..4a7872625a 100644
--- a/docs/msw/install.txt
+++ b/docs/msw/install.txt
@@ -56,11 +56,8 @@ Visual C++ 1.5 compilation
 
 1. Change directory to wx\src\msw. Type 'nmake -f makefile.dos' to
    make the wxWindows core library.
-2. Change directory to wx\samples and type 'nmake -f makefile.dos'
-   to make all the samples. You can also make them individually.
-
-NOTE: 16-bit compilation is not recommended (see issues.txt):
-many things are broken, including dialog boxes.
+2. Change directory to a sample, such as wx\samples\minimal, and
+   type 'nmake -f makefile.dos'.
 
 Borland C++ 4.5/5.0 compilation
 -------------------------------
diff --git a/docs/msw/issues.txt b/docs/msw/issues.txt
index 900bfa8600..d77a710a94 100644
--- a/docs/msw/issues.txt
+++ b/docs/msw/issues.txt
@@ -8,7 +8,3 @@ This conflicts with wxUSE_IOSTREAMSH = 0 using MS VC++ 5.0
 (crashes the template code). It should be switched off if you
 wish to use wxUSE_IOSTREAMSH = 0.
 
-Many things seem to be broken for 16-bit Windows, including
-dialogs (crash in wxFindWinFromHandle). The generic tree, list
-and notebook controls don't work. The generic wxImageList drawing
-function doesn't work (wxDC::SelectObject problem).
diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h
index ff5bc55e13..810d91f9a6 100644
--- a/include/wx/generic/listctrl.h
+++ b/include/wx/generic/listctrl.h
@@ -17,7 +17,7 @@
 
 #include "wx/defs.h"
 #include "wx/object.h"
-#include "wx/imaglist.h"
+#include "wx/generic/imaglist.h"
 #include "wx/control.h"
 #include "wx/timer.h"
 #include "wx/textctrl.h"
diff --git a/samples/notebook/test.cpp b/samples/notebook/test.cpp
index feffe3ee58..7ee1dfb3e8 100644
--- a/samples/notebook/test.cpp
+++ b/samples/notebook/test.cpp
@@ -20,7 +20,6 @@
 #include "wx/wx.h"
 #endif
 
-#include "wx/tab.h"
 #include "test.h"
 
 // If 1, use a dialog. Otherwise use a frame.
@@ -44,10 +43,9 @@ bool MyApp::OnInit(void)
 #else
   frame = new MyFrame((wxFrame*) NULL, -1, (char *) "Notebook", wxPoint(-1, -1), wxSize(365, 390), wxDEFAULT_FRAME_STYLE);
 
-  // Problem with Motif whereby it doesn't size properly unless
-  // you set the size again (to a different size than before,
-  // since SetSize is optimized)
-#ifdef __WXMOTIF__
+  // Problem with generic wxNotebook implementation whereby it doesn't size properly unless
+  // you set the size again (to a different size than before, since SetSize is optimized)
+#if defined(__WXMOTIF__) || defined(__WIN16__)
   frame->SetSize(-1, -1, 370, 390);
 #endif
 
diff --git a/samples/treectrl/bitmaps/file1.bmp b/samples/treectrl/bitmaps/file1.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..9a0544b232721e18b22e955fb09d0aecf303084e
GIT binary patch
literal 246
zcmb76u@Qhk2#a_2IEHiByN)%Z{YX@{F~Hl{nTJ5geU9@+<I>pG+w28v8D8A<dadNB
t;NC;56=Mv|G*|^PH?>}#Qhy;IFj7@yg<rb=kx@Bj5giqoneiDt@c=i;Xv+Wq

literal 0
HcmV?d00001

diff --git a/samples/treectrl/bitmaps/folder1.bmp b/samples/treectrl/bitmaps/folder1.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..dada286b64daeafc29cbe1abb95401624b3db837
GIT binary patch
literal 246
zcmZ?r{l)+RWk5;;hy|dSk%0v)(EuhP1WXRX1IhpqLqh|E0+K)`!+`?_fHX+rKNvCm
z{|{mTF%W`;Kzwunlm~$y9bnM#<99U(H2nC!9R!HyL(FaX0o1gkqoe<ScXf3?NDOE&
GvXuZTnRE{T

literal 0
HcmV?d00001

diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp
index 8ae99c17cc..59bfba85ac 100644
--- a/samples/treectrl/treetest.cpp
+++ b/samples/treectrl/treetest.cpp
@@ -83,7 +83,6 @@ END_EVENT_TABLE()
 
 IMPLEMENT_APP(MyApp)
 
-// `Main program' equivalent, creating windows and returning main app frame
 bool MyApp::OnInit()
 {
   // Create the main frame window
@@ -278,8 +277,15 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
   m_imageListNormal = new wxImageList(16, 16, TRUE);
 
   // should correspond to TreeCtrlIcon_xxx enum
+#if defined(__WXMSW__) && defined(__WIN16__)
+  // This is required in 16-bit Windows mode only because we can't load a specific (16x16)
+  // icon image, so it comes out blank (using the empty 32x32 icon).
+  m_imageListNormal->Add(wxBitmap("bitmap1", wxBITMAP_TYPE_BMP_RESOURCE));
+  m_imageListNormal->Add(wxBitmap("bitmap2", wxBITMAP_TYPE_BMP_RESOURCE));
+#else
   m_imageListNormal->Add(wxICON(icon1));
   m_imageListNormal->Add(wxICON(icon2));
+#endif
 
   SetImageList(m_imageListNormal);
 
diff --git a/samples/treectrl/treetest.rc b/samples/treectrl/treetest.rc
index c1a90c7724..550dc2f135 100644
--- a/samples/treectrl/treetest.rc
+++ b/samples/treectrl/treetest.rc
@@ -5,3 +5,6 @@ aaaa     ICON "mondrian.ico"
 icon1   ICON "bitmaps\\file1.ico"
 icon2   ICON "bitmaps\\folder1.ico"
 
+bitmap1   BITMAP "bitmaps\\file1.bmp"
+bitmap2   BITMAP "bitmaps\\folder1.bmp"
+
diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp
index a5f03d0543..c5e8204954 100644
--- a/src/common/utilscmn.cpp
+++ b/src/common/utilscmn.cpp
@@ -824,4 +824,4 @@ int	isascii( int c )
 {
 	return ( c >= 0 && c < 128 ) ;
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/src/generic/imaglist.cpp b/src/generic/imaglist.cpp
index 95614a8281..b0dc6594c7 100644
--- a/src/generic/imaglist.cpp
+++ b/src/generic/imaglist.cpp
@@ -18,7 +18,7 @@
 #pragma hdrstop
 #endif
 
-#include "wx/imaglist.h"
+#include "wx/generic/imaglist.h"
 
 //-----------------------------------------------------------------------------
 //  wxImageList
@@ -50,7 +50,10 @@ bool wxImageList::Create()
 
 int wxImageList::Add( const wxBitmap &bitmap )
 {
-    m_images.Append( new wxBitmap(bitmap) );
+    if (bitmap.IsKindOf(CLASSINFO(wxIcon)))
+        m_images.Append( new wxIcon( (const wxIcon&) bitmap ) );
+    else
+        m_images.Append( new wxBitmap(bitmap) );
     return m_images.Number();
 }
 
@@ -68,17 +71,23 @@ bool wxImageList::Replace( int index, const wxBitmap &bitmap )
     wxNode *node = m_images.Nth( index );
     
     wxCHECK_MSG( node, FALSE, "wrong index in image list" );
-  
+
+    wxBitmap* newBitmap = NULL;
+    if (bitmap.IsKindOf(CLASSINFO(wxIcon)))
+        newBitmap = new wxIcon( (const wxIcon&) bitmap );
+    else
+        newBitmap = new wxBitmap(bitmap) ;
+
     if (index == m_images.Number()-1)
     {
         m_images.DeleteNode( node );
-        m_images.Append( new wxBitmap(bitmap) );
+        m_images.Append( newBitmap );
     }
     else
     {
         wxNode *next = node->Next();
         m_images.DeleteNode( node );
-        m_images.Insert( next, new wxBitmap(bitmap) );
+        m_images.Insert( next, newBitmap );
     }
   
     return TRUE;
@@ -126,8 +135,11 @@ bool wxImageList::Draw( int index, wxDC &dc, int x, int y,
     wxCHECK_MSG( node, FALSE, "wrong index in image list" );
     
     wxBitmap *bm = (wxBitmap*)node->Data();
-  
-    dc.DrawBitmap( *bm, x, y, (flags & wxIMAGELIST_DRAW_TRANSPARENT) > 0 );
+
+    if (bm->IsKindOf(CLASSINFO(wxIcon)))
+        dc.DrawIcon( * ((wxIcon*) bm), x, y);
+    else
+        dc.DrawBitmap( *bm, x, y, (flags & wxIMAGELIST_DRAW_TRANSPARENT) > 0 );
 
     return TRUE;
 }
diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp
index 4e5824aabb..8927a2d981 100644
--- a/src/generic/listctrl.cpp
+++ b/src/generic/listctrl.cpp
@@ -20,7 +20,8 @@
 
 #include "wx/dcscreen.h"
 #include "wx/app.h"
-#include "wx/listctrl.h"
+#include "wx/generic/listctrl.h"
+#include "wx/generic/imaglist.h"
 
 //-----------------------------------------------------------------------------
 //  wxListItemData
@@ -551,6 +552,7 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
                            m_bound_hilight.width, m_bound_hilight.height );
     }
     
+    dc->SetBackgroundMode(wxTRANSPARENT);
     if (m_mode == wxLC_REPORT)
     {
         wxString s;
@@ -741,6 +743,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
     int y = 0;
     GetClientSize( &w, &h );
 
+    dc.SetBackgroundMode(wxTRANSPARENT);
     dc.SetTextForeground( *wxBLACK );
     if (m_foregroundColour.Ok()) dc.SetTextForeground( m_foregroundColour );
 
@@ -1037,13 +1040,15 @@ void wxListMainWindow::RefreshLine( wxListLineData *line )
 
 void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
 {
+    // Note: a wxPaintDC must be constructed even if no drawing is
+    // done (a Windows requirement).
+    wxPaintDC dc( this );
+    PrepareDC( dc );
+
     if (m_dirty) return;
     
     if (m_lines.GetCount() == 0) return;
 
-    wxPaintDC dc( this );
-    PrepareDC( dc );
-
     dc.BeginDrawing();
 
     dc.SetFont( GetFont() );
diff --git a/src/generic/notebook.cpp b/src/generic/notebook.cpp
index cced371845..dca6679456 100644
--- a/src/generic/notebook.cpp
+++ b/src/generic/notebook.cpp
@@ -52,7 +52,7 @@ BEGIN_EVENT_TABLE(wxNotebook, wxControl)
     EVT_MOUSE_EVENTS(wxNotebook::OnMouseEvent)
     EVT_SET_FOCUS(wxNotebook::OnSetFocus)
     EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
-    EVT_IDLE(wxNotebook::OnIdle)
+//    EVT_IDLE(wxNotebook::OnIdle)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
@@ -108,9 +108,11 @@ bool wxNotebook::Create(wxWindow *parent,
     m_windowId = id == -1 ? NewControlId() : id;
 
     // It's like a normal window...
-    if (!wxWindow::Create(parent, id, pos, size, style, name))
+    if (!wxWindow::Create(parent, id, pos, size, style|wxNO_BORDER, name))
         return FALSE;
 
+    SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+
     SetTabView(new wxNotebookTabView(this));
 
     return TRUE;
diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp
index 3a2dea9902..a9827f7b60 100644
--- a/src/generic/treectrl.cpp
+++ b/src/generic/treectrl.cpp
@@ -29,12 +29,12 @@
 #endif
 
 #include "wx/generic/treectrl.h"
+#include "wx/generic/imaglist.h"
 #include "wx/settings.h"
 #include "wx/log.h"
 #include "wx/intl.h"
 #include "wx/dynarray.h"
 #include "wx/dcclient.h"
-#include "wx/imaglist.h"
 #include "wx/msgdlg.h"
 
 // -----------------------------------------------------------------------------
@@ -1089,6 +1089,7 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
     dc.DestroyClippingRegion();
   }
 
+  dc.SetBackgroundMode(wxTRANSPARENT);
   dc.DrawText( item->GetText(), image_w + item->GetX(), item->GetY() );
 
   // restore normal font for bold items
@@ -1197,7 +1198,8 @@ void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
     wxPaintDC dc(this);
     PrepareDC( dc );
 
-    dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) );
+//    dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) );
+    dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
     dc.SetPen( m_dottedPen );
     m_lineHeight = (int)(dc.GetCharHeight() + 4);
@@ -1446,7 +1448,8 @@ void wxTreeCtrl::CalculatePositions()
   wxClientDC dc(this);
   PrepareDC( dc );
 
-  dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) );
+//    dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) );
+    dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
   dc.SetPen( m_dottedPen );
   m_lineHeight = (int)(dc.GetCharHeight() + 4);
diff --git a/src/motif/metafile.cpp b/src/motif/metafile.cpp
index 348440fd79..7380a03402 100644
--- a/src/motif/metafile.cpp
+++ b/src/motif/metafile.cpp
@@ -52,7 +52,7 @@ bool wxMetaFile::SetClipboard(int width, int height)
 bool wxMetaFile::Play(wxDC *dc)
 {
     // TODO
-    return false;
+    return FALSE;
 }
 
 /*
diff --git a/src/motif/utilsexc.cpp b/src/motif/utilsexc.cpp
index 05e0fb5ef7..c7c928a2de 100644
--- a/src/motif/utilsexc.cpp
+++ b/src/motif/utilsexc.cpp
@@ -97,7 +97,7 @@ void xt_notify_end_process(XtPointer client, int *fid,
   /* wait4 is not part of any standard, use at own risk
    * not sure what wait4 does, but wait3 seems to be closest, whats a digit ;-)
    * --- offer@sgi.com */
-#if !defined(__sgi) && !defined(__ALPHA__)
+#if !defined(__sgi) && !defined(__SGI__) && !defined(__ALPHA__) && !defined(__SUNCC__)
   wait4(process_data->pid, NULL, 0, NULL);
 #else
   wait3((int *) NULL, 0, (rusage *) NULL);
diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp
index 25997d4c27..d14d10afb1 100644
--- a/src/msw/dc.cpp
+++ b/src/msw/dc.cpp
@@ -603,7 +603,13 @@ void wxDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
 
 void wxDC::DrawIcon(const wxIcon& icon, long x, long y)
 {
+#if defined(__WIN32__)
+  ::DrawIconEx((HDC) m_hDC, XLOG2DEV(x), YLOG2DEV(y), (HICON) icon.GetHICON(),
+      icon.GetWidth(), icon.GetHeight(), 0, 0, DI_NORMAL);
+#else
   ::DrawIcon((HDC) m_hDC, XLOG2DEV(x), YLOG2DEV(y), (HICON) icon.GetHICON());
+#endif
+
   CalcBoundingBox(x, y);
   CalcBoundingBox(x+icon.GetWidth(), y+icon.GetHeight());
 }
diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp
index bd69394f9a..08c91789d0 100644
--- a/src/msw/icon.cpp
+++ b/src/msw/icon.cpp
@@ -178,6 +178,13 @@ bool wxICOResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long
       M_ICONHANDLERDATA->m_width = 32;
       M_ICONHANDLERDATA->m_height = 32;
 #endif
+      // Override the found values with desired values
+      if (desiredWidth > -1 && desiredHeight > -1)
+      {
+          M_ICONHANDLERDATA->m_width = desiredWidth;
+          M_ICONHANDLERDATA->m_height = desiredHeight;
+      }
+
       M_ICONHANDLERDATA->m_ok = (M_ICONHANDLERDATA->m_hIcon != 0);
       return M_ICONHANDLERDATA->m_ok;
   }
diff --git a/src/msw/makefile.nt b/src/msw/makefile.nt
index 76945a8ebe..63acc309b4 100644
--- a/src/msw/makefile.nt
+++ b/src/msw/makefile.nt
@@ -60,6 +60,11 @@ GENERICOBJS= \
   $(GENDIR)\tabg.obj \
   $(GENDIR)\textdlgg.obj
 
+#  $(GENDIR)\imaglist.obj \
+#  $(GENDIR)\treectrl.obj \
+#  $(GENDIR)\listctrl.obj \
+#  $(GENDIR)\notebook.obj \
+
 # These are generic things that don't need to be compiled on MSW,
 # but sometimes it's useful to do so for testing purposes.
 NONESSENTIALOBJS= \
@@ -169,11 +174,9 @@ MSWOBJS = \
   $(MSWDIR)\gdiobj.obj \
   $(MSWDIR)\helpwin.obj \
   $(MSWDIR)\icon.obj \
-  $(MSWDIR)\imaglist.obj \
   $(MSWDIR)\iniconf.obj \
   $(MSWDIR)\joystick.obj \
   $(MSWDIR)\listbox.obj \
-  $(MSWDIR)\listctrl.obj \
   $(MSWDIR)\main.obj \
   $(MSWDIR)\mdi.obj \
   $(MSWDIR)\menu.obj \
@@ -182,7 +185,6 @@ MSWOBJS = \
   $(MSWDIR)\minifram.obj \
   $(MSWDIR)\msgdlg.obj \
   $(MSWDIR)\nativdlg.obj \
-  $(MSWDIR)\notebook.obj \
   $(MSWDIR)\ownerdrw.obj \
   $(MSWDIR)\palette.obj \
   $(MSWDIR)\pen.obj \
@@ -211,11 +213,14 @@ MSWOBJS = \
   $(MSWDIR)\textctrl.obj \
   $(MSWDIR)\thread.obj \
   $(MSWDIR)\timer.obj \
-  $(MSWDIR)\treectrl.obj \
   $(MSWDIR)\utils.obj \
   $(MSWDIR)\utilsexc.obj \
   $(MSWDIR)\wave.obj \
   $(MSWDIR)\window.obj \
+  $(MSWDIR)\notebook.obj \
+  $(MSWDIR)\listctrl.obj \
+  $(MSWDIR)\imaglist.obj \
+  $(MSWDIR)\treectrl.obj \
   $(OLEDIR)\droptgt.obj \
   $(OLEDIR)\dropsrc.obj \
   $(OLEDIR)\dataobj.obj \
@@ -1150,6 +1155,26 @@ $(GENDIR)/textdlgg.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
 <<
 
+$(GENDIR)/treectrl.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/imaglist.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/listctrl.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/notebook.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
 $(OBJECTS):	$(WXDIR)/include/wx/setup.h
 
 $(XPMDIR)\crbuffri.obj: $(XPMDIR)\crbuffri.c
diff --git a/src/msw/window.cpp b/src/msw/window.cpp
index 6a20945ba8..2d1f1ae135 100644
--- a/src/msw/window.cpp
+++ b/src/msw/window.cpp
@@ -1468,10 +1468,18 @@ void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow
         m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
             (DLGPROC)wxDlgProc);
 #else
+        // N.B.: if we _don't_ use this form,
+        // then with VC++ 1.5, it crashes horribly.
+#if 1
+       m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
+                            (DLGPROC)wxDlgProc);
+#else
+        // Crashes when we use this.
         DLGPROC dlgproc = (DLGPROC)MakeProcInstance((DLGPROC)wxWndProc, wxGetInstance());
 
         m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
             (DLGPROC)dlgproc);
+#endif
 #endif
 
         if (m_hWnd == 0)
-- 
2.50.0

