#include "wx/msw/private.h"
+#include "wx/textctrl.h"
+
#include <string.h>
#ifndef __GNUWIN32__
m_isWindow = TRUE;
// Generic
+// m_windowCursor = * wxSTANDARD_CURSOR;
m_windowId = 0;
m_isShown = TRUE;
m_windowStyle = 0;
#define DIMENSION_TYPE int
#endif
-// Main Windows 3 window proc
+// Main Windows window proc
long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
wxASSERT( m_lastMsg == message &&
return MSWOnSysCommand(wParam, lParam);
break;
}
+
case WM_COMMAND:
{
#ifdef __WIN32__
return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam);
break;
}
-
case WM_KEYDOWN:
- {
// If this has been processed by an event handler,
// return 0 now (we've handled it).
if (MSWOnKeyDown((WORD) wParam, lParam))
case VK_RIGHT:
case VK_DOWN:
case VK_UP:
- {
return Default();
+
+#ifdef VK_APPS
+ // special case of VK_APPS: treat it the same as right mouse click
+ // because both usually pop up a context menu
+ case VK_APPS:
+ {
+
+#ifndef GET_X_LPARAM
+#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
+#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
+#endif
+
+ // construct the key mask
+ WPARAM fwKeys = MK_RBUTTON;
+ if ( (::GetKeyState(VK_CONTROL) & 0x100) != 0 )
+ fwKeys |= MK_CONTROL;
+ if ( (::GetKeyState(VK_SHIFT) & 0x100) != 0 )
+ fwKeys |= MK_SHIFT;
+
+ // simulate right mouse button click
+ DWORD dwPos = ::GetMessagePos();
+ int x = GET_X_LPARAM(dwPos),
+ y = GET_Y_LPARAM(dwPos);
+
+ ScreenToClient(&x, &y);
+ MSWOnRButtonDown(x, y, fwKeys);
+ }
break;
- }
+#endif // VK_APPS
+
default:
if (!MSWOnChar((WORD)wParam, lParam))
{
return Default();
}
-/*
- if ( ::GetKeyState(VK_CONTROL) & 0x100 )
- return Default();
-*/
break;
}
break;
- }
case WM_KEYUP:
{
if (!MSWOnKeyUp((WORD) wParam, lParam))
return Default();
break;
}
-
case WM_HSCROLL:
{
#ifdef __WIN32__
return 1L;
break;
}
-
case WM_GETMINMAXINFO:
{
MINMAXINFO *info = (MINMAXINFO *)lParam;
return MSWDefWindowProc(message, wParam, lParam );
break;
}
-
case WM_GETDLGCODE:
- return MSWGetDlgCode();
-
+ {
+ return MSWGetDlgCode();
+ }
case WM_SETCURSOR:
{
- // don't set cursor when the mouse is not in the client part
- short nHitTest = LOWORD(lParam);
- if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+ // don't set cursor for other windows, only for this one: this
+ // prevents children of this window from gettign the same cursor
+ // as the parent has (don't forget that this message is propagated
+ // by default up the window parent-child hierarchy)
+ if ( (HWND)wParam == hWnd )
{
- HCURSOR hcursor = 0;
- if ( wxIsBusy() )
+ // don't set cursor when the mouse is not in the client part
+ short nHitTest = LOWORD(lParam);
+ if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
{
- extern HCURSOR gs_wxBusyCursor; // from msw\utils.cpp
+ HCURSOR hcursor = 0;
+ if ( wxIsBusy() )
+ {
+ // from msw\utils.cpp
+ extern HCURSOR gs_wxBusyCursor;
- hcursor = gs_wxBusyCursor;
- }
- else if ( m_windowCursor.Ok() )
- {
- hcursor = (HCURSOR)m_windowCursor.GetHCURSOR();
- }
- else
- {
- extern wxCursor *g_globalCursor; // from msw\data.cpp
+ hcursor = gs_wxBusyCursor;
+ }
+ else
+ {
+ wxCursor *cursor = NULL;
- if ( g_globalCursor && g_globalCursor->Ok() )
- hcursor = (HCURSOR)g_globalCursor->GetHCURSOR();
- }
+ if ( m_windowCursor.Ok() )
+ {
+ cursor = &m_windowCursor;
+ }
+ else
+ {
+ // from msw\data.cpp
+ extern wxCursor *g_globalCursor;
- if ( hcursor )
- {
- ::SetCursor(hcursor);
+ if ( g_globalCursor && g_globalCursor->Ok() )
+ cursor = g_globalCursor;
+ }
- // returning TRUE stops the DefWindowProc() from further
- // processing this message - exactly what we need because
- // we've just set the cursor
- return TRUE;
+ if ( cursor )
+ hcursor = (HCURSOR)cursor->GetHCURSOR();
+ }
+
+ if ( hcursor )
+ {
+ ::SetCursor(hcursor);
+
+ // returning TRUE stops the DefWindowProc() from
+ // further processing this message - exactly what we
+ // need because we've just set the cursor.
+ return TRUE;
+ }
}
}
}
-
return MSWDefWindowProc(message, wParam, lParam );
default:
if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
return TRUE;
}
+
#if wxUSE_TOOLTIPS
if ( m_tooltip )
{
}
#endif // wxUSE_TOOLTIPS
+ // In case we don't have wxTAB_TRAVERSAL style on.
+ // If we don't call this, we may never process Enter correctly.
+ if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) == 0 )
+ {
+ MSG *msg = (MSG *)pMsg;
+ if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
+ return TRUE;
+ }
+
return FALSE;
}