[vlc-devel] [PATCH 02/13] win32: added helper window base class (common/win32_vlcwnd).
Sergey Radionov
rsatom at gmail.com
Fri Jan 13 04:54:26 CET 2012
---
activex/Makefile.am | 2 +
common/win32_vlcwnd.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++
common/win32_vlcwnd.h | 61 ++++++++++++++++++++++++++
npapi/Makefile.am | 4 +-
4 files changed, 177 insertions(+), 1 deletions(-)
create mode 100644 common/win32_vlcwnd.cpp
create mode 100644 common/win32_vlcwnd.h
diff --git a/activex/Makefile.am b/activex/Makefile.am
index e0a7cb9..99fab41 100644
--- a/activex/Makefile.am
+++ b/activex/Makefile.am
@@ -73,6 +73,8 @@ axvlc_la_SOURCES = \
axvlc_idl.h \
../common/win32_fullscreen.cpp \
../common/win32_fullscreen.h \
+ ../common/win32_vlcwnd.cpp \
+ ../common/win32_vlcwnd.h \
$(NULL)
axvlc_la_DEPENDENCIES = $(srcdir)/axvlc.def $(DATA_axvlc_rc)
diff --git a/common/win32_vlcwnd.cpp b/common/win32_vlcwnd.cpp
new file mode 100644
index 0000000..ec004dd
--- /dev/null
+++ b/common/win32_vlcwnd.cpp
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ * Copyright © 2002-2011 VideoLAN and VLC authors
+ * $Id$
+ *
+ * Authors: Sergey Radionov <rsatom at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "win32_vlcwnd.h"
+
+LRESULT CALLBACK VLCWnd::_WindowProc(HWND hWnd, UINT uMsg,
+ WPARAM wParam, LPARAM lParam)
+{
+ LONG_PTR ud = GetWindowLongPtr(hWnd, GWLP_USERDATA);
+ VLCWnd* wnd = reinterpret_cast<VLCWnd*>(ud);
+
+ if( !wnd && WM_CREATE != uMsg )
+ return DefWindowProc(hWnd, uMsg, wParam, lParam);
+
+ switch( uMsg )
+ {
+ case WM_CREATE:{
+ CREATESTRUCT* cs = (CREATESTRUCT*)(lParam);
+ wnd = reinterpret_cast<VLCWnd*>(cs->lpCreateParams);
+ wnd->_hWnd = hWnd;
+ SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)wnd);
+ return wnd->WindowProc(uMsg, wParam, lParam);
+ }
+ case WM_NCDESTROY:{
+ LRESULT r = wnd->WindowProc(uMsg, wParam, lParam);
+ wnd->_hWnd = 0;
+ return r;
+ }
+ default:{
+ return wnd->WindowProc(uMsg, wParam, lParam);
+ }
+ }
+}
+
+bool VLCWnd::RegisterClass(WNDCLASS* wc)
+{
+ memset(wc, 0, sizeof(WNDCLASS));
+
+ wc->style = CS_DBLCLKS;
+ wc->hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc->lpfnWndProc = _WindowProc;
+ wc->hInstance = _hInstance;
+
+ PreRegisterWindowClass(wc);
+
+ if( !wc->lpszClassName )
+ return false;
+
+ if( GetClassInfo(_hInstance, wc->lpszClassName, wc) ) {
+ return true;
+ } else {
+ _wndclass_atom = ::RegisterClass(wc);
+ return _wndclass_atom != 0;
+ }
+}
+
+bool VLCWnd::Create(LPCTSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight,
+ HWND hWndParent, HMENU hMenu)
+{
+ return CreateEx(0, lpWindowName, dwStyle,
+ x, y, nWidth, nHeight,
+ hWndParent, hMenu);
+}
+
+bool VLCWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight,
+ HWND hWndParent, HMENU hMenu)
+{
+ if(_hWnd)
+ return false;
+
+ WNDCLASS wc;
+ if( !RegisterClass(&wc) )
+ return false;
+
+ ::CreateWindowEx(dwExStyle, wc.lpszClassName, lpWindowName, dwStyle,
+ x, y, nWidth, nHeight,
+ hWndParent, hMenu, _hInstance, (LPVOID)this);
+
+ return _hWnd != 0;
+}
+
+VLCWnd::~VLCWnd()
+{
+ if( _hWnd )
+ DestroyWindow( _hWnd );
+
+ if( 0 != _wndclass_atom ) {
+ if( UnregisterClass(MAKEINTATOM(_wndclass_atom), _hInstance) )
+ _wndclass_atom = 0;
+ }
+}
diff --git a/common/win32_vlcwnd.h b/common/win32_vlcwnd.h
new file mode 100644
index 0000000..247abe1
--- /dev/null
+++ b/common/win32_vlcwnd.h
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ * Copyright © 2002-2011 VideoLAN and VLC authors
+ * $Id$
+ *
+ * Authors: Sergey Radionov <rsatom at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef _WIN32_VLCWND_H_
+#define _WIN32_VLCWND_H_
+
+#include <windows.h>
+
+class VLCWnd
+{
+protected:
+ VLCWnd(HINSTANCE hInstance)
+ : _hInstance(hInstance), _wndclass_atom(0), _hWnd(0){};
+ virtual ~VLCWnd();
+
+ bool Create(LPCTSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight,
+ HWND hWndParent, HMENU hMenu);
+ bool CreateEx(DWORD dwExStyle, LPCTSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight,
+ HWND hWndParent, HMENU hMenu);
+
+ virtual void PreRegisterWindowClass(WNDCLASS* wc) {};
+ virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
+ { return DefWindowProc(_hWnd, uMsg, wParam, lParam); };
+
+ HINSTANCE hInstance() const
+ { return _hInstance;}
+
+public:
+ HWND hWnd() const {return _hWnd;}
+
+private:
+ bool RegisterClass(WNDCLASS* wc);
+
+private:
+ static LRESULT CALLBACK _WindowProc(HWND hWnd, UINT uMsg, WPARAM, LPARAM);
+ HINSTANCE _hInstance;
+ ATOM _wndclass_atom;
+ HWND _hWnd;
+};
+
+#endif //_WIN32_VLCWND_H_
diff --git a/npapi/Makefile.am b/npapi/Makefile.am
index b78d674..03ae2d1 100644
--- a/npapi/Makefile.am
+++ b/npapi/Makefile.am
@@ -77,7 +77,9 @@ SOURCES_support = \
vlcplugin_win.cpp \
vlcplugin_win.h \
../common/win32_fullscreen.cpp \
- ../common/win32_fullscreen.h
+ ../common/win32_fullscreen.h \
+ ../common/win32_vlcwnd.cpp \
+ ../common/win32_vlcwnd.h
npvlc_la_DEPENDENCIES += $(DATA_npvlc_rc)
npvlc_la_LDFLAGS += -Wl,--kill-at -Wl,$(DATA_npvlc_rc)
--
1.7.7.1.msysgit.0
More information about the vlc-devel
mailing list