win32 only hack - custom window message handler

This commit is contained in:
Vadim Lopatin 2016-09-26 17:24:17 +03:00
parent 821b9afc85
commit 6328b11286
1 changed files with 26 additions and 1 deletions

View File

@ -229,6 +229,10 @@ static if (ENABLE_OPENGL) {
__gshared SharedGLContext sharedGLContext; __gshared SharedGLContext sharedGLContext;
} }
interface UnknownWindowMessageHandler {
/// return true if message is handled, put return value into result
bool onUnknownWindowMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, ref LRESULT result);
}
class Win32Window : Window { class Win32Window : Window {
Win32Platform _platform; Win32Platform _platform;
@ -237,6 +241,12 @@ class Win32Window : Window {
dstring _caption; dstring _caption;
Win32ColorDrawBuf _drawbuf; Win32ColorDrawBuf _drawbuf;
bool useOpengl; bool useOpengl;
/// win32 only - return window handle
@property HWND windowHandle() {
return _hwnd;
}
this(Win32Platform platform, dstring windowCaption, Window parent, uint flags, uint width = 0, uint height = 0) { this(Win32Platform platform, dstring windowCaption, Window parent, uint flags, uint width = 0, uint height = 0) {
Win32Window w32parent = cast(Win32Window)parent; Win32Window w32parent = cast(Win32Window)parent;
HWND parenthwnd = w32parent ? w32parent._hwnd : null; HWND parenthwnd = w32parent ? w32parent._hwnd : null;
@ -388,6 +398,16 @@ class Win32Window : Window {
} }
} }
/// custom window message handler
Signal!UnknownWindowMessageHandler onUnknownWindowMessage;
private uint handleUnknownWindowMessage(UINT message, WPARAM wParam, LPARAM lParam) {
if (onUnknownWindowMessage.assigned) {
LRESULT res;
if (onUnknownWindowMessage(_hwnd, message, wParam, lParam, res))
return res;
}
return DefWindowProc(_hwnd, message, wParam, lParam);
}
Win32ColorDrawBuf getDrawBuf() { Win32ColorDrawBuf getDrawBuf() {
//RECT rect; //RECT rect;
@ -1272,11 +1292,14 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SetWindowLongPtr(hwnd, GWLP_USERDATA, cast(LONG_PTR)ptr); SetWindowLongPtr(hwnd, GWLP_USERDATA, cast(LONG_PTR)ptr);
window._hwnd = hwnd; window._hwnd = hwnd;
window.onCreate(); window.onCreate();
//window.handleUnknownWindowMessage(message, wParam, lParam);
} }
return 0; return 0;
case WM_DESTROY: case WM_DESTROY:
if (window !is null) if (window !is null) {
//window.handleUnknownWindowMessage(message, wParam, lParam);
window.onDestroy(); window.onDestroy();
}
if (w32platform.windowCount == 0) if (w32platform.windowCount == 0)
PostQuitMessage(0); PostQuitMessage(0);
return 0; return 0;
@ -1426,6 +1449,8 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
//Log.d("Unhandled message ", message); //Log.d("Unhandled message ", message);
break; break;
} }
if (window)
return window.handleUnknownWindowMessage(message, wParam, lParam);
return DefWindowProc(hwnd, message, wParam, lParam); return DefWindowProc(hwnd, message, wParam, lParam);
} }