X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ce81a75efb34de9f01fe3c7b9ffecb03293b1c3..966a3b2cc63ee8ac81fe3095f2e0220504d95f49:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 9d1f5e24e1..7149e45154 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -21,21 +21,22 @@ #endif #ifndef WX_PRECOMP -#include -#include "wx/setup.h" -#include "wx/menu.h" -#include "wx/dc.h" -#include "wx/dcclient.h" -#include "wx/utils.h" -#include "wx/app.h" -#include "wx/panel.h" -#include "wx/layout.h" -#include "wx/dialog.h" -#include "wx/frame.h" -#include "wx/listbox.h" -#include "wx/button.h" -#include "wx/settings.h" -#include "wx/msgdlg.h" + #include "wx/setup.h" + #include "wx/menu.h" + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/panel.h" + #include "wx/layout.h" + #include "wx/dialog.h" + #include "wx/frame.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/settings.h" + #include "wx/msgdlg.h" + + #include #endif #if wxUSE_OWNER_DRAWN @@ -48,23 +49,40 @@ #include "wx/menuitem.h" #include "wx/log.h" + +#if wxUSE_TOOLTIPS +#include "wx/tooltip.h" +#endif + +#include "wx/intl.h" +#include "wx/log.h" + #include "wx/msw/private.h" +#include "wx/textctrl.h" + #include #ifndef __GNUWIN32__ -#include -#include + #include + #include #endif #ifdef __WIN32__ -#include + #include #endif -#ifdef __GNUWIN32__ -#include +#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) +#include #endif +#ifndef __TWIN32__ + #ifdef __GNUWIN32__ + #include + #endif +#endif + +// all these are defined in #ifdef GetCharWidth #undef GetCharWidth #endif @@ -95,13 +113,11 @@ void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win); wxWindow *wxFindWinFromHandle(WXHWND hWnd); #if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler) + IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler) #endif BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) EVT_CHAR(wxWindow::OnChar) - EVT_KEY_DOWN(wxWindow::OnKeyDown) - EVT_KEY_UP(wxWindow::OnKeyUp) EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_INIT_DIALOG(wxWindow::OnInitDialog) @@ -125,7 +141,7 @@ wxWindow *wxWindow::FindItem(int id) const if (childWin->IsKindOf(CLASSINFO(wxControl))) { wxControl *item = (wxControl *)childWin; - if (item->m_windowId == id) + if (item->GetId() == id) return item; else { @@ -177,9 +193,23 @@ bool wxWindow::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) } bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam), - WXLPARAM WXUNUSED(lParam), + WXLPARAM lParam, WXLPARAM* WXUNUSED(result)) { +#ifdef __WIN95__ +#if wxUSE_TOOLTIPS + NMHDR* hdr = (NMHDR *)lParam; + if ( hdr->code == TTN_NEEDTEXT && m_tooltip ) + { + TOOLTIPTEXT *ttt = (TOOLTIPTEXT *)lParam; + ttt->lpszText = (char *)m_tooltip->GetTip().c_str(); + + // processed + return TRUE; + } +#endif +#endif + return FALSE; } @@ -203,13 +233,15 @@ void wxWindow::SetHWND(WXHWND hWnd) void wxWindow::Init() { + m_isWindow = TRUE; + // Generic +// m_windowCursor = * wxSTANDARD_CURSOR; m_windowId = 0; m_isShown = TRUE; m_windowStyle = 0; m_windowParent = NULL; m_windowEventHandler = this; - m_windowCursor = *wxSTANDARD_CURSOR; m_children = new wxList; m_doubleClickAllowed = 0 ; m_winCaptured = FALSE; @@ -266,6 +298,10 @@ void wxWindow::Init() #if wxUSE_DRAG_AND_DROP m_pDropTarget = NULL; #endif + +#if wxUSE_TOOLTIPS + m_tooltip = NULL; +#endif } wxWindow::wxWindow() @@ -278,6 +314,12 @@ wxWindow::~wxWindow() { m_isBeingDeleted = TRUE; + // first of all, delete the things on which nothing else depends + +#if wxUSE_TOOLTIPS + wxDELETE(m_tooltip); +#endif + // JACS - if behaviour is odd, restore this // to the start of ~wxWindow. Vadim has changed // it to nearer the end. Unsure of side-effects @@ -290,6 +332,7 @@ wxWindow::~wxWindow() // delete themselves. #if wxUSE_CONSTRAINTS DeleteRelatedConstraints(); + if (m_constraints) { // This removes any dangling pointers to this window @@ -298,11 +341,9 @@ wxWindow::~wxWindow() delete m_constraints; m_constraints = NULL; } - if (m_windowSizer) - { - delete m_windowSizer; - m_windowSizer = NULL; - } + + wxDELETE(m_windowSizer); + // If this is a child of a sizer, remove self from parent if (m_sizerParent) m_sizerParent->RemoveChild((wxWindow *)this); @@ -499,7 +540,8 @@ void wxWindow::SetDropTarget(wxDropTarget *pDropTarget) m_pDropTarget->Register(m_hWnd); } -#endif +#endif // wxUSE_DRAG_AND_DROP + //old style file-manager drag&drop support // I think we should retain the old-style @@ -512,6 +554,28 @@ void wxWindow::DragAcceptFiles(bool accept) ::DragAcceptFiles(hWnd, (BOOL)accept); } +// ---------------------------------------------------------------------------- +// tooltips +// ---------------------------------------------------------------------------- + +#if wxUSE_TOOLTIPS + +void wxWindow::SetToolTip(const wxString &tip) +{ + SetToolTip(new wxToolTip(tip)); +} + +void wxWindow::SetToolTip(wxToolTip *tooltip) +{ + if ( m_tooltip ) + delete m_tooltip; + + m_tooltip = tooltip; + m_tooltip->SetWindow(this); +} + +#endif // wxUSE_TOOLTIPS + // Get total size void wxWindow::GetSize(int *x, int *y) const { @@ -610,12 +674,12 @@ void wxWindow::GetClientSize(int *x, int *y) const { HWND hWnd = (HWND) GetHWND(); RECT rect; - GetClientRect(hWnd, &rect); + ::GetClientRect(hWnd, &rect); *x = rect.right; *y = rect.bottom; } -void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int currentX, currentY; GetPosition(¤tX, ¤tY); @@ -646,14 +710,16 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags) MoveWindow(hWnd, actualX, actualY, actualWidth, actualHeight, (BOOL)TRUE); } -void wxWindow::SetClientSize(int width, int height) +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); + ::GetClientRect(hWnd, &rect); RECT rect2; GetWindowRect(hWnd, &rect2); @@ -702,13 +768,14 @@ void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) bool wxWindow::Show(bool show) { + m_isShown = show; HWND hWnd = (HWND) GetHWND(); int cshow; if (show) cshow = SW_SHOW; else cshow = SW_HIDE; - ShowWindow(hWnd, (BOOL)cshow); + ShowWindow(hWnd, cshow); if (show) { BringWindowToTop(hWnd); @@ -720,7 +787,11 @@ bool wxWindow::Show(bool show) bool wxWindow::IsShown(void) const { - return (::IsWindowVisible((HWND) GetHWND()) != 0); + // Can't rely on IsWindowVisible, since it will return FALSE + // if the parent is not visible. + return m_isShown; +// int ret = ::IsWindowVisible((HWND) GetHWND()) ; +// return (ret != 0); } int wxWindow::GetCharHeight(void) const @@ -844,10 +915,8 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA wnd->m_hWnd = (WXHWND) hWnd; } - // Stop right here if we don't have a valid handle - // in our wxWnd object. + // Stop right here if we don't have a valid handle in our wxWindow object. if (wnd && !wnd->m_hWnd) { - // wxDebugMsg("Warning: could not find a valid handle, wx_win.cc/wxWndProc.\n"); wnd->m_hWnd = (WXHWND) hWnd; long res = wnd->MSWDefWindowProc(message, wParam, lParam ); wnd->m_hWnd = 0; @@ -872,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 && @@ -880,7 +949,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, "Processing %s(%lx, %lx)", - wxGetMessageName(message), wParam, lParam); + wxGetMessageName(message), wParam, lParam); #endif // __WXDEBUG__ HWND hWnd = (HWND)m_hWnd; @@ -1110,6 +1179,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return MSWOnSysCommand(wParam, lParam); break; } + case WM_COMMAND: { #ifdef __WIN32__ @@ -1161,42 +1231,81 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam); break; } - case WM_KEYDOWN: - { - MSWOnKeyDown((WORD) wParam, lParam); -#if 0 - // we consider these message "not interesting" + // If this has been processed by an event handler, + // return 0 now (we've handled it). + if ( MSWOnKeyDown((WORD) wParam, lParam) ) + break; + + // we consider these message "not interesting" to OnChar if ( wParam == VK_SHIFT || wParam == VK_CONTROL ) + { return Default(); + } - // Avoid duplicate messages to OnChar - if ( (wParam != VK_ESCAPE) && (wParam != VK_SPACE) && - (wParam != VK_RETURN) && (wParam != VK_BACK) && - (wParam != VK_TAB) ) + switch ( wParam ) { - MSWOnChar((WORD)wParam, lParam); - if ( ::GetKeyState(VK_CONTROL) & 0x100 ) + // avoid duplicate messages to OnChar for these ASCII keys: they + // will be translated by TranslateMessage() and received in WM_CHAR + case VK_ESCAPE: + case VK_SPACE: + case VK_RETURN: + case VK_BACK: + case VK_TAB: return Default(); - } - else if ( ::GetKeyState(VK_CONTROL) & 0x100 ) - MSWOnChar((WORD)wParam, lParam); - else - return Default(); + +#ifdef VK_APPS + + // normally these macros would be defined in windows.h +#ifndef GET_X_LPARAM + #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) + #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #endif + + // special case of VK_APPS: treat it the same as right mouse click + // because both usually pop up a context menu + case VK_APPS: + { + // 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 + + case VK_LEFT: + case VK_RIGHT: + case VK_DOWN: + case VK_UP: + default: + if ( !MSWOnChar((WORD)wParam, lParam) ) + { + return Default(); + } + break; + } break; - } case WM_KEYUP: - { - MSWOnKeyUp((WORD) wParam, lParam); + if ( !MSWOnKeyUp((WORD) wParam, lParam) ) + return Default(); break; - } + case WM_CHAR: // Always an ASCII character - { - MSWOnChar((WORD)wParam, lParam, TRUE); - break; - } + if ( !MSWOnChar((WORD)wParam, lParam, TRUE) ) + return Default(); + break; case WM_HSCROLL: { @@ -1375,7 +1484,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return 1L; break; } - case WM_GETMINMAXINFO: { MINMAXINFO *info = (MINMAXINFO *)lParam; @@ -1390,13 +1498,69 @@ 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 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 ) + { + // don't set cursor when the mouse is not in the client part + short nHitTest = LOWORD(lParam); + if ( nHitTest == HTCLIENT || nHitTest == HTERROR ) + { + HCURSOR hcursor = 0; + if ( wxIsBusy() ) + { + // from msw\utils.cpp + extern HCURSOR gs_wxBusyCursor; + + hcursor = gs_wxBusyCursor; + } + else + { + wxCursor *cursor = NULL; + + if ( m_windowCursor.Ok() ) + { + cursor = &m_windowCursor; + } + else + { + // from msw\data.cpp + extern wxCursor *g_globalCursor; + + if ( g_globalCursor && g_globalCursor->Ok() ) + cursor = g_globalCursor; + } + + 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: return MSWDefWindowProc(message, wParam, lParam ); } + return 0; // Success: we processed this command. } @@ -1420,7 +1584,7 @@ void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win) { // adding NULL hWnd is (first) surely a result of an error and // (secondly) breaks menu command processing - wxCHECK_RET( hWnd != NULL, "attempt to add a NULL hWnd to window list" ); + wxCHECK_RET( hWnd != (HWND) NULL, "attempt to add a NULL hWnd to window list" ); if ( !wxWinHandleList->Find((long)hWnd) ) wxWinHandleList->Append((long)hWnd, win); @@ -1633,7 +1797,7 @@ long wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam) #endif // Win95 // not processed - return FALSE; + return Default(); } void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu)) @@ -1663,6 +1827,13 @@ bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd)) ::ShowCaret((HWND) GetHWND()); } + // panel wants to track the window which was the last to have focus in it + wxWindow *parent = GetParent(); + if ( parent && parent->IsKindOf(CLASSINFO(wxPanel)) ) + { + ((wxPanel *)parent)->SetLastFocus(GetId()); + } + wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); event.SetEventObject(this); if (!GetEventHandler()->ProcessEvent(event)) @@ -1867,47 +2038,59 @@ long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) long wxWindow::Default() { - // Ignore 'fake' events (perhaps generated as a result of a separate real event) - if (m_lastMsg == 0) + // Ignore 'fake' events (perhaps generated as a result of a separate real + // event) + if ( m_lastMsg == 0 ) return 0; #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.", - wxGetMessageName(m_lastMsg)); + wxGetMessageName(m_lastMsg)); #endif // __WXDEBUG__ - return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); + return MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); } bool wxWindow::MSWProcessMessage(WXMSG* pMsg) { - if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) { + if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) + { // intercept dialog navigation keys MSG *msg = (MSG *)pMsg; bool bProcess = TRUE; if ( msg->message != WM_KEYDOWN ) bProcess = FALSE; - if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN ) + if ( bProcess && (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN ) bProcess = FALSE; - bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0; + if ( bProcess ) + { + bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0; - // WM_GETDLGCODE: if the control wants it for itself, don't process it - // (except for Ctrl-Tab combination which is always processed) - LONG lDlgCode = 0; - if ( bProcess && !bCtrlDown ) { - lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); - } + // WM_GETDLGCODE: ask the control if it wants the key for itself, + // don't process it if it's the case (except for Ctrl-Tab/Enter + // combinations which are always processed) + LONG lDlgCode = 0; + if ( !bCtrlDown ) + { + lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); + } - bool bForward = TRUE; - if ( bProcess ) { - switch ( msg->wParam ) { + bool bForward = TRUE, + bWindowChange = FALSE; + + switch ( msg->wParam ) + { case VK_TAB: - if ( lDlgCode & DLGC_WANTTAB ) // FALSE for Ctrl-Tab + if ( lDlgCode & DLGC_WANTTAB ) { bProcess = FALSE; - else + } + else { + // Ctrl-Tab cycles thru notebook pages + bWindowChange = bCtrlDown; bForward = !(::GetKeyState(VK_SHIFT) & 0x100); + } break; case VK_UP: @@ -1924,24 +2107,75 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) bProcess = FALSE; break; + case VK_RETURN: + { + if ( lDlgCode & DLGC_WANTMESSAGE ) + { + // control wants to process Enter itself, don't + // call IsDialogMessage() which would interpret + // it + return FALSE; + } +#ifndef __WIN16__ + wxButton *btnDefault = GetDefaultItem(); + if ( btnDefault && !bCtrlDown ) + { + // if there is a default button, Enter should + // press it + (void)::SendMessage((HWND)btnDefault->GetHWND(), + BM_CLICK, 0, 0); + return TRUE; + } + // else: but if there is not it makes sense to make it + // work like a TAB - and that's what we do. + // Note that Ctrl-Enter always works this way. +#endif + } + break; + default: bProcess = FALSE; } - } - if ( bProcess ) { - wxNavigationKeyEvent event; - event.SetDirection(bForward); - event.SetWindowChange(bCtrlDown); - event.SetEventObject(this); + if ( bProcess ) + { + wxNavigationKeyEvent event; + event.SetDirection(bForward); + event.SetWindowChange(bWindowChange); + event.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(event) ) - return TRUE; + if ( GetEventHandler()->ProcessEvent(event) ) + return TRUE; + } } - return ::IsDialogMessage((HWND)GetHWND(), msg) != 0; + if ( ::IsDialogMessage((HWND)GetHWND(), msg) ) + return TRUE; } +#if wxUSE_TOOLTIPS + if ( m_tooltip ) + { + // relay mouse move events to the tooltip control + MSG *msg = (MSG *)pMsg; + if ( msg->message == WM_MOUSEMOVE ) + m_tooltip->RelayEvent(pMsg); + } +#endif // wxUSE_TOOLTIPS + +/* This code manages to disable character input completely. Nice one! + * Probably because the dialog is requesting all char input. Or, + * it gets called by non-dialog windows. + + // 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; } @@ -2051,7 +2285,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) long wxWindow::MSWOnSysCommand(WXWPARAM wParam, WXLPARAM lParam) { - switch (wParam) + switch (wParam & 0xFFFFFFF0) { case SC_MAXIMIZE: { @@ -2157,7 +2391,6 @@ void wxWindow::MSWOnMButtonDown(int x, int y, WXUINT flags) void wxWindow::MSWOnMButtonUp(int x, int y, WXUINT flags) { - //wxDebugMsg("MButtonUp\n") ; wxMouseEvent event(wxEVT_MIDDLE_UP); event.m_x = x; event.m_y = y; @@ -2254,11 +2487,6 @@ void wxWindow::MSWOnRButtonDClick(int x, int y, WXUINT flags) void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags) { // 'normal' move event... - // Set cursor, but only if we're not in 'busy' mode - - // Trouble with this is that it sets the cursor for controls too :-( - if (m_windowCursor.Ok() && !wxIsBusy()) - ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR()); if (!m_mouseInWindow) { @@ -2337,7 +2565,9 @@ void wxWindow::MSWOnMouseLeave(int x, int y, WXUINT flags) GetEventHandler()->ProcessEvent(event); } -void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII) +// isASCII is TRUE only when we're called from WM_CHAR handler and not from +// WM_KEYDOWN one +bool wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII) { int id; bool tempControlDown = FALSE; @@ -2399,12 +2629,16 @@ void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII) event.m_x = pt.x; event.m_y = pt.y; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); + if (GetEventHandler()->ProcessEvent(event)) + return TRUE; + else + return FALSE; } + else + return FALSE; } -void wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII) +bool wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam) { int id; @@ -2433,12 +2667,19 @@ void wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII) event.m_x = pt.x; event.m_y = pt.y; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); + if (GetEventHandler()->ProcessEvent(event)) + { + return TRUE; + } + else return FALSE; + } + else + { + return FALSE; } } -void wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII) +bool wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam) { int id; @@ -2467,9 +2708,13 @@ void wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII) event.m_x = pt.x; event.m_y = pt.y; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); + if (GetEventHandler()->ProcessEvent(event)) + return TRUE; + else + return FALSE; } + else + return FALSE; } void wxWindow::MSWOnJoyDown(int joystick, int x, int y, WXUINT flags) @@ -2963,7 +3208,7 @@ void wxSetKeyboardHook(bool doIt) { wxTheKeyboardHookProc = MakeProcInstance((FARPROC) wxKeyboardHook, wxGetInstance()); wxTheKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) wxTheKeyboardHookProc, wxGetInstance(), -#ifdef __WIN32__ +#if defined(__WIN32__) && !defined(__TWIN32__) GetCurrentThreadId()); // (DWORD)GetCurrentProcess()); // This is another possibility. Which is right? #else @@ -3047,13 +3292,6 @@ void wxWindow::Centre(int direction) } -/* TODO (maybe) -void wxWindow::OnPaint() -{ -PaintSelectionHandles(); -} -*/ - void wxWindow::WarpPointer (int x_pos, int y_pos) { // Move the pointer to (x_pos,y_pos) coordinates. They are expressed in @@ -3102,10 +3340,14 @@ bool wxWindow::MSWOnEraseBkgnd (WXHDC pDC) void wxWindow::OnEraseBackground(wxEraseEvent& event) { + if (!GetHWND()) + return; + RECT rect; ::GetClientRect((HWND) GetHWND(), &rect); - HBRUSH hBrush = ::CreateSolidBrush(PALETTERGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue())); + COLORREF ref = PALETTERGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue()) ; + HBRUSH hBrush = ::CreateSolidBrush(ref); int mode = ::SetMapMode((HDC) event.GetDC()->GetHDC(), MM_TEXT); // ::GetClipBox((HDC) event.GetDC()->GetHDC(), &rect); @@ -3523,7 +3765,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) // 5) If this isn't a Win95 app, and we are using CTL3D, remove border // effects from extended style -#if CTL3D +#if wxUSE_CTL3D if ( *want3D ) nativeBorder = FALSE; #endif @@ -3533,7 +3775,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) // If we want 3D, but haven't specified a border here, // apply the default border style specified. // TODO what about non-Win95 WIN32? Does it have borders? -#if defined(__WIN95__) && !CTL3D +#if defined(__WIN95__) && !wxUSE_CTL3D if (defaultBorderStyle && (*want3D) && ! ((m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER) || (m_windowStyle & wxSTATIC_BORDER) || (m_windowStyle & wxSIMPLE_BORDER) )) exStyle |= defaultBorderStyle; // WS_EX_CLIENTEDGE ; @@ -3544,26 +3786,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) void wxWindow::OnChar(wxKeyEvent& event) { -/* I'm commenting this out because otherwise, we lose tabs in e.g. a text window (see MDI sample) - * (JACS, 14/01/99) - if ( event.KeyCode() == WXK_TAB ) { - // propagate the TABs to the parent - it's up to it to decide what - // to do with it - if ( GetParent() ) { - if ( GetParent()->GetEventHandler()->ProcessEvent(event) ) - return; - } - } -*/ - - bool isVirtual; - int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual); - - if ( id == -1 ) - id= m_lastWParam; - - if ( !event.ControlDown() ) - (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam); + event.Skip(); } void wxWindow::OnKeyDown(wxKeyEvent& event) @@ -3604,7 +3827,7 @@ bool wxWindow::TransferDataToWindow() if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->TransferToWindow() ) { - wxMessageBox("Application Error", "Could not transfer data to window", wxOK|wxICON_EXCLAMATION); + wxLogError(_("Could not transfer data to window")); return FALSE; } @@ -3986,16 +4209,17 @@ void wxWindow::SetConstraintSizes(bool recurse) winName = "unnamed"; else winName = GetName(); - wxDebugMsg("Constraint(s) not satisfied for window of type %s, name %s:\n", (const char *)windowClass, (const char *)winName); + wxLogDebug("Constraint(s) not satisfied for window of type %s, name %s:", + (const char *)windowClass, (const char *)winName); if (!constr->left.GetDone()) - wxDebugMsg(" unsatisfied 'left' constraint.\n"); + wxLogDebug(" unsatisfied 'left' constraint."); if (!constr->right.GetDone()) - wxDebugMsg(" unsatisfied 'right' constraint.\n"); + wxLogDebug(" unsatisfied 'right' constraint."); if (!constr->width.GetDone()) - wxDebugMsg(" unsatisfied 'width' constraint.\n"); + wxLogDebug(" unsatisfied 'width' constraint."); if (!constr->height.GetDone()) - wxDebugMsg(" unsatisfied 'height' constraint.\n"); - wxDebugMsg("Please check constraints: try adding AsIs() constraints.\n"); + wxLogDebug(" unsatisfied 'height' constraint."); + wxLogDebug("Please check constraints: try adding AsIs() constraints.\n"); } if (recurse) @@ -4129,7 +4353,9 @@ bool wxWindow::Close(bool force) { wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); event.SetEventObject(this); +#if WXWIN_COMPATIBILITY event.SetForce(force); +#endif event.SetCanVeto(!force); return (GetEventHandler()->ProcessEvent(event) && !event.GetVeto()); @@ -4421,6 +4647,7 @@ long wxWindow::MSWGetDlgCode() bool wxWindow::AcceptsFocus() const { + // invisible and disabled controls don't need focus return IsShown() && IsEnabled(); }