]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
mention which files should be changed when adding a new library in a few places where...
[wxWidgets.git] / include / wx / msw / private.h
index cdb8b5e95384548ff6f8006472dbfbf6ac47bf83..fd292868dd9e7f9347385c86f457ad2017b96621 100644 (file)
@@ -44,16 +44,22 @@ class WXDLLEXPORT wxWindow;
 
 #if wxUSE_GUI
 
-WXDLLEXPORT_DATA(extern HICON) wxSTD_FRAME_ICON;
-WXDLLEXPORT_DATA(extern HICON) wxSTD_MDIPARENTFRAME_ICON;
-WXDLLEXPORT_DATA(extern HICON) wxSTD_MDICHILDFRAME_ICON;
-WXDLLEXPORT_DATA(extern HICON) wxDEFAULT_FRAME_ICON;
-WXDLLEXPORT_DATA(extern HICON) wxDEFAULT_MDIPARENTFRAME_ICON;
-WXDLLEXPORT_DATA(extern HICON) wxDEFAULT_MDICHILDFRAME_ICON;
-WXDLLEXPORT_DATA(extern HFONT) wxSTATUS_LINE_FONT;
+extern WXDLLEXPORT_DATA(HICON) wxSTD_FRAME_ICON;
+extern WXDLLEXPORT_DATA(HICON) wxSTD_MDIPARENTFRAME_ICON;
+extern WXDLLEXPORT_DATA(HICON) wxSTD_MDICHILDFRAME_ICON;
+extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_FRAME_ICON;
+extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDIPARENTFRAME_ICON;
+extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDICHILDFRAME_ICON;
+extern WXDLLEXPORT_DATA(HFONT) wxSTATUS_LINE_FONT;
 
 #endif // wxUSE_GUI
 
+// ---------------------------------------------------------------------------
+// global data
+// ---------------------------------------------------------------------------
+
+extern WXDLLIMPEXP_DATA_BASE(HINSTANCE) wxhInstance;
+
 // ---------------------------------------------------------------------------
 // define things missing from some compilers' headers
 // ---------------------------------------------------------------------------
@@ -117,10 +123,6 @@ WXDLLEXPORT_DATA(extern HFONT) wxSTATUS_LINE_FONT;
     VOID    WINAPI ibAdjustWindowRect( HWND hWnd, LPRECT lprc ) ;
 #endif // wxUSE_ITSY_BITSY
 
-#if wxUSE_CTL3D
-    #include "wx/msw/ctl3d/ctl3d.h"
-#endif // wxUSE_CTL3D
-
 /*
  * Decide what window classes we're going to use
  * for this combination of CTl3D/FAFA settings
@@ -172,6 +174,24 @@ extern LONG APIENTRY _EXPORT
 #define wxZeroMemory(obj)   memset((void*) & obj, 0, sizeof(obj))
 #endif
 
+// This one is a macro so that it can be tested with #ifdef, it will be
+// undefined if it cannot be implemented for a given compiler.
+// Vc++, bcc, dmc, ow, mingw, codewarrior (and rsxnt) have _get_osfhandle.
+// Cygwin has get_osfhandle. Others are currently unknown, e.g. Salford,
+// Intel, Visual Age.
+#if defined(__WXWINCE__)
+    #define wxGetOSFHandle(fd) ((HANDLE)fd)
+#elif defined(__CYGWIN__)
+    #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd))
+#elif defined(__VISUALC__) \
+   || defined(__BORLANDC__) \
+   || defined(__DMC__) \
+   || defined(__WATCOMC__) \
+   || (defined(__GNUWIN32__) || defined(__MINGW32__)) \
+   || (defined(__MWERKS__) && defined(__MSL__))
+    #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
+#endif
+
 #if wxUSE_GUI
 
 #include <wx/gdicmn.h>
@@ -455,6 +475,64 @@ private:
     DECLARE_NO_COPY_CLASS(GlobalPtr)
 };
 
+// register the class when it is first needed and unregister it in dtor
+class ClassRegistrar
+{
+public:
+    // ctor doesn't register the class, call Initialize() for this
+    ClassRegistrar() { m_registered = -1; }
+
+    // return true if the class is already registered
+    bool IsInitialized() const { return m_registered != -1; }
+
+    // return true if the class had been already registered
+    bool IsRegistered() const { return m_registered == 1; }
+
+    // try to register the class if not done yet, return true on success
+    bool Register(const WNDCLASS& wc)
+    {
+        // we should only be called if we hadn't been initialized yet
+        wxASSERT_MSG( m_registered == -1,
+                        _T("calling ClassRegistrar::Register() twice?") );
+
+        m_registered = ::RegisterClass(&wc) ? 1 : 0;
+        if ( !IsRegistered() )
+        {
+            wxLogLastError(_T("RegisterClassEx()"));
+        }
+        else
+        {
+            m_clsname = wc.lpszClassName;
+        }
+
+        return m_registered == 1;
+    }
+
+    // get the name of the registered class (returns empty string if not
+    // registered)
+    const wxString& GetName() const { return m_clsname; }
+
+    // unregister the class if it had been registered
+    ~ClassRegistrar()
+    {
+        if ( IsRegistered() )
+        {
+            if ( !::UnregisterClass(m_clsname, wxhInstance) )
+            {
+                wxLogLastError(_T("UnregisterClass"));
+            }
+        }
+    }
+
+private:
+    // initial value is -1 which means that we hadn't tried registering the
+    // class yet, it becomes true or false (1 or 0) when Initialize() is called
+    int m_registered;
+
+    // the name of the class, only non empty if it had been registered
+    wxString m_clsname;
+};
+
 // ---------------------------------------------------------------------------
 // macros to make casting between WXFOO and FOO a bit easier: the GetFoo()
 // returns Foo cast to the Windows type for oruselves, while GetFooOf() takes
@@ -502,12 +580,6 @@ private:
 
 #endif // wxUSE_GUI
 
-// ---------------------------------------------------------------------------
-// global data
-// ---------------------------------------------------------------------------
-
-WXDLLIMPEXP_DATA_BASE(extern HINSTANCE) wxhInstance;
-
 // ---------------------------------------------------------------------------
 // global functions
 // ---------------------------------------------------------------------------
@@ -557,21 +629,21 @@ WXDLLEXPORT void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos);
 WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos);
 
 // Find maximum size of window/rectangle
-WXDLLEXPORT extern void wxFindMaxSize(WXHWND hwnd, RECT *rect);
+extern WXDLLEXPORT void wxFindMaxSize(WXHWND hwnd, RECT *rect);
 
 // Safely get the window text (i.e. without using fixed size buffer)
-WXDLLEXPORT extern wxString wxGetWindowText(WXHWND hWnd);
+extern WXDLLEXPORT wxString wxGetWindowText(WXHWND hWnd);
 
 // get the window class name
-WXDLLEXPORT extern wxString wxGetWindowClass(WXHWND hWnd);
+extern WXDLLEXPORT wxString wxGetWindowClass(WXHWND hWnd);
 
 // get the window id (should be unsigned, hence this is not wxWindowID which
 // is, for mainly historical reasons, signed)
-WXDLLEXPORT extern WXWORD wxGetWindowId(WXHWND hWnd);
+extern WXDLLEXPORT WXWORD wxGetWindowId(WXHWND hWnd);
 
 // check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are
 // different
-WXDLLEXPORT extern bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc);
+extern WXDLLEXPORT bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc);
 
 // Does this window style specify any border?
 inline bool wxStyleHasBorder(long style)
@@ -586,17 +658,17 @@ inline bool wxStyleHasBorder(long style)
 
 // this function simply checks whether the given hWnd corresponds to a wxWindow
 // and returns either that window if it does or NULL otherwise
-WXDLLEXPORT extern wxWindow* wxFindWinFromHandle(WXHWND hWnd);
+extern WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd);
 
 // find the window for HWND which is part of some wxWindow, i.e. unlike
 // wxFindWinFromHandle() above it will also work for "sub controls" of a
 // wxWindow.
 //
 // returns the wxWindow corresponding to the given HWND or NULL.
-WXDLLEXPORT extern wxWindow *wxGetWindowFromHWND(WXHWND hwnd);
+extern WXDLLEXPORT wxWindow *wxGetWindowFromHWND(WXHWND hwnd);
 
 // Get the size of an icon
-WXDLLEXPORT extern wxSize wxGetHiconSize(HICON hicon);
+extern WXDLLEXPORT wxSize wxGetHiconSize(HICON hicon);
 
 // Lines are drawn differently for WinCE and regular WIN32
 WXDLLEXPORT void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2);