+// This function registers the given class name and stores a pointer to a
+// heap-allocated copy of it at the specified location, it must be deleted
+// later.
+static void RegisterAndStoreClassName(const wxString& uniqueClassName,
+ const wxChar **className,
+ WNDCLASS *lpWndClass)
+{
+ const size_t length = uniqueClassName.length() + 1; // for trailing NUL
+ wxChar *newChars = new wxChar[length];
+ wxStrncpy(newChars, uniqueClassName, length);
+ *className = newChars;
+ lpWndClass->lpszClassName = *className;
+
+ if ( !::RegisterClass(lpWndClass) )
+ {
+ wxLogLastError(wxString::Format(wxT("RegisterClass(%s)"), newChars));
+ }
+}
+
+// This function registers the class defined by the provided WNDCLASS struct
+// contents using a unique name constructed from the specified base name and
+// and a suffix unique to this library instance. It also stores the generated
+// unique names for normal and "no redraw" versions of the class in the
+// provided variables, caller must delete their contents later.
+static void RegisterClassWithUniqueNames(const wxString& baseName,
+ const wxChar **className,
+ const wxChar **classNameNR,
+ WNDCLASS *lpWndClass)
+{
+ // for each class we register one with CS_(V|H)REDRAW style and one
+ // without for windows created with wxNO_FULL_REDRAW_ON_REPAINT flag
+ static const long styleNormal = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
+ static const long styleNoRedraw = CS_DBLCLKS;
+
+ const wxString uniqueSuffix(wxString::Format(wxT("@%p"), className));
+
+ wxString uniqueClassName(baseName + uniqueSuffix);
+ lpWndClass->style = styleNormal;
+ RegisterAndStoreClassName(uniqueClassName, className, lpWndClass);
+
+ // NB: remember that code elsewhere supposes that no redraw class names
+ // use the same names as normal classes with "NR" suffix so we must put
+ // "NR" at the end instead of using more natural baseName+"NR"+suffix
+ wxString uniqueClassNameNR(uniqueClassName + wxT("NR"));
+ lpWndClass->style = styleNoRedraw;
+ RegisterAndStoreClassName(uniqueClassNameNR, classNameNR, lpWndClass);
+}
+