X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1aff8b0241145ab734b1efc880aeff17b5a6e955..50ef256ed3e52defe91655da5e3f6a9e913c9e2a:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index f2e428fccd..a8fd5cc4e3 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -59,6 +59,8 @@ #include "wx/msw/private.h" +#include "wx/textctrl.h" + #include #ifndef __GNUWIN32__ @@ -234,6 +236,7 @@ void wxWindow::Init() m_isWindow = TRUE; // Generic +// m_windowCursor = * wxSTANDARD_CURSOR; m_windowId = 0; m_isShown = TRUE; m_windowStyle = 0; @@ -711,7 +714,9 @@ void wxWindow::DoSetClientSize(int width, int height) { wxWindow *parent = GetParent(); HWND hWnd = (HWND) GetHWND(); - HWND hParentWnd = (HWND) (HWND) parent->GetHWND(); + HWND hParentWnd = (HWND) 0; + if (parent) + hParentWnd = (HWND) parent->GetHWND(); RECT rect; ::GetClientRect(hWnd, &rect); @@ -936,7 +941,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA #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 && @@ -1174,6 +1179,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return MSWOnSysCommand(wParam, lParam); break; } + case WM_COMMAND: { #ifdef __WIN32__ @@ -1225,9 +1231,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) 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)) @@ -1253,28 +1257,46 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) case VK_RIGHT: case VK_DOWN: case VK_UP: - { -/* -// if ( ::GetKeyState(VK_CONTROL) & 0x100 ) // Don't understand purpose of this test - if (!MSWOnChar((WORD)wParam, lParam)) - return Default(); -*/ - break; - } + 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)) @@ -1287,7 +1309,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return Default(); break; } - case WM_HSCROLL: { #ifdef __WIN32__ @@ -1465,7 +1486,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return 1L; break; } - case WM_GETMINMAXINFO: { MINMAXINFO *info = (MINMAXINFO *)lParam; @@ -1480,47 +1500,63 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM 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: @@ -2116,6 +2152,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) if ( ::IsDialogMessage((HWND)GetHWND(), msg) ) return TRUE; } + #if wxUSE_TOOLTIPS if ( m_tooltip ) { @@ -2126,6 +2163,15 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) } #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; }