From: Julian Smart Date: Mon, 22 Jun 1998 22:43:48 +0000 (+0000) Subject: Cured problem introduced by LEAVE/ENTER OnIdle code; bugs in gauge sizing X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1c089c47f344926e2f95a8aa342992ed844fe609 Cured problem introduced by LEAVE/ENTER OnIdle code; bugs in gauge sizing git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@135 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 8ba30c66f7..4c9218cb88 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -825,6 +825,7 @@ void wxApp::OnIdle(wxIdleEvent& event) // Send OnIdle events to all windows bool needMore = SendIdleEvents(); +// bool needMore = FALSE; if (needMore) event.RequestMore(TRUE); diff --git a/src/msw/checklst.cpp b/src/msw/checklst.cpp index 719c81643c..51fd72182e 100644 --- a/src/msw/checklst.cpp +++ b/src/msw/checklst.cpp @@ -24,6 +24,8 @@ #pragma hdrstop #endif +#if USE_OWNER_DRAWN + #include #include "wx/ownerdrw.h" @@ -304,3 +306,6 @@ void wxCheckListBox::OnLeftClick(wxMouseEvent& event) event.Skip(); } } + +#endif + diff --git a/src/msw/control.cpp b/src/msw/control.cpp index b173d2bd58..08ddcbc1aa 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -132,47 +132,6 @@ void wxConvertDialogToPixels(wxWindow *control, int *x, int *y) } */ -#if 0 -// We can't rely on Windows giving us events corresponding to the wxWindows Z-ordering. -// E.g. we can't push a wxGroupBox to the back for editing purposes. -// Convert the item event to parent coordinates, then search for -// an item that could receive this event. -wxControl *wxFakeItemEvent(wxWindow *parent, wxControl *item, wxMouseEvent& event) -{ - int x, y; - item->GetPosition(&x, &y); - event.m_x += x; - event.m_y += y; - - wxNode *node = parent->GetChildren()->Last(); - while (node) - { - wxControl *newItem = (wxControl *)node->Data(); - if (newItem->IsSelected() && newItem->SelectionHandleHitTest(event.x, event.GetY())) - { - // This event belongs to the panel. - parent->GetEventHandler()->OldOnMouseEvent(event); - return NULL; - } - else if (newItem->HitTest(event.x, event.GetY())) - { - int x1, y1; - newItem->GetPosition(&x1, &y1); - event.x -= x1; - event.GetY() -= y1; - newItem->OldOnMouseEvent(event); - return newItem; - } - node = node->Previous(); - } - // No takers, so do what we would have done anyway. - event.x -= x; - event.y -= y; - item->OldOnMouseEvent(event); - return item; -} -#endif - void wxControl::MSWOnMouseMove(const int x, const int y, const WXUINT flags) { /* diff --git a/src/msw/dcclient.cpp b/src/msw/dcclient.cpp index c406939a28..3288e3641b 100644 --- a/src/msw/dcclient.cpp +++ b/src/msw/dcclient.cpp @@ -111,7 +111,10 @@ wxPaintDC::wxPaintDC(wxWindow *the_canvas) m_staticPaintHDC = m_hDC ; } else + { + wxDebugMsg("wxPaintDC: Using existing HDC\n"); m_hDC = m_staticPaintHDC ; + } m_canvas = the_canvas; RECT updateRect1 = g_paintStruct.rcPaint; @@ -136,6 +139,13 @@ wxPaintDC::~wxPaintDC(void) m_hDCCount --; m_hDC = 0; } + else + wxDebugMsg("~wxPaintDC: Did not release HDC\n"); + m_staticPaintHDC = 0 ; } + else + { + wxDebugMsg("~wxPaintDC: Did not release HDC\n"); + } } diff --git a/src/msw/dcmemory.cpp b/src/msw/dcmemory.cpp index 1ff28ae283..34920234b1 100644 --- a/src/msw/dcmemory.cpp +++ b/src/msw/dcmemory.cpp @@ -41,6 +41,7 @@ wxMemoryDC::wxMemoryDC(void) { m_hDC = (WXHDC) ::CreateCompatibleDC(NULL); m_ok = (m_hDC != 0); + m_bOwnsDC = TRUE; SetBrush(*wxWHITE_BRUSH); SetPen(*wxBLACK_PEN); diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index ce0c0b0edf..2e00ecfccb 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -552,13 +552,11 @@ void wxFrame::MSWCreate(const int id, wxWindow *parent, const char *wclass, wxWi // If child windows aren't properly drawn initially, WS_CLIPCHILDREN // could be the culprit. But without it, you can get a lot of flicker. -// DWORD msflags = WS_POPUP | WS_CLIPCHILDREN ; - DWORD msflags = 0; if ((style & wxCAPTION) == wxCAPTION) - msflags = WS_OVERLAPPED | WS_CLIPCHILDREN ; // WS_POPUP | WS_CLIPCHILDREN ; + msflags = WS_OVERLAPPED; else - msflags = WS_POPUP | WS_CLIPCHILDREN ; + msflags = WS_POPUP; if (style & wxMINIMIZE_BOX) msflags |= WS_MINIMIZEBOX; @@ -574,6 +572,8 @@ void wxFrame::MSWCreate(const int id, wxWindow *parent, const char *wclass, wxWi msflags |= WS_MAXIMIZE; if (style & wxCAPTION) msflags |= WS_CAPTION; + if (style & wxCLIP_CHILDREN) + msflags |= WS_CLIPCHILDREN; // Keep this in wxFrame because it saves recoding this function // in wxTinyFrame @@ -642,12 +642,9 @@ bool wxFrame::MSWOnPaint(void) EndPaint((HWND) GetHWND(), &ps); } - - if (!m_iconized) + else { -// m_paintHDC = (WXHDC) cdc; GetEventHandler()->OldOnPaint(); -// m_paintHDC = NULL; } return 0; } diff --git a/src/msw/gauge.cpp b/src/msw/gauge.cpp index 5e5978a9fb..58281cb3fe 100644 --- a/src/msw/gauge.cpp +++ b/src/msw/gauge.cpp @@ -191,27 +191,20 @@ void wxGauge::SetSize(const int x, const int y, const int width, const int heigh if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) y1 = currentY; - float control_width, control_height, control_x, control_y; - // If we're prepared to use the existing size, then... if (width == -1 && height == -1 && ((sizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO)) { - GetSize(&x1, &y1); + GetSize(&w1, &h1); } // Deal with default size (using -1 values) - if (width<=0) + if (w1<=0) w1 = DEFAULT_ITEM_WIDTH; - if (height<=0) + if (h1<=0) h1 = DEFAULT_ITEM_HEIGHT; - control_x = (float)x1; - control_y = (float)y1; - control_width = (float)w1; - control_height = (float)h1; - - MoveWindow((HWND) GetHWND(), (int)control_x, (int)control_y, (int)control_width, (int)control_height, TRUE); + MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, TRUE); #if WXWIN_COMPATIBILITY GetEventHandler()->OldOnSize(width, height); diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index d6549a064c..e199362d2a 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -207,6 +207,9 @@ bool wxListBox::Create(wxWindow *parent, const wxWindowID id, 0, 0, 0, 0, (HWND)parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL); + + m_hWnd = (WXHWND)wx_list; + #if CTL3D if (want3D) { @@ -215,12 +218,15 @@ bool wxListBox::Create(wxWindow *parent, const wxWindowID id, } #endif + // Subclass again to catch messages + SubclassWin((WXHWND)wx_list); + uint ui; for (ui = 0; ui < (uint)n; ui++) { SendMessage(wx_list, LB_ADDSTRING, 0, (LPARAM)(const char *)choices[ui]); } - #if USE_OWNER_DRAWN +#if USE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { for (ui = 0; ui < (uint)n; ui++) { // create new item which will process WM_{DRAW|MEASURE}ITEM messages @@ -230,33 +236,30 @@ bool wxListBox::Create(wxWindow *parent, const wxWindowID id, ListBox_SetItemData(wx_list, ui, pNewItem); } } - #endif +#endif if ((m_windowStyle & wxLB_MULTIPLE) == 0) SendMessage(wx_list, LB_SETCURSEL, 0, 0); - ShowWindow(wx_list, SW_SHOW); - - m_hWnd = (WXHWND)wx_list; - - // Subclass again for purposes of dialog editing mode - SubclassWin((WXHWND)wx_list); - SetFont(* parent->GetFont()); SetSize(x, y, width, height); + ShowWindow(wx_list, SW_SHOW); + return TRUE; } wxListBox::~wxListBox(void) { - #if USE_OWNER_DRAWN +#if USE_OWNER_DRAWN uint uiCount = m_aItems.Count(); while ( uiCount-- != 0 ) { delete m_aItems[uiCount]; } - #endif +#endif + + DELETEA(m_selections); } void wxListBox::SetupColours(void) @@ -290,14 +293,14 @@ void wxListBox::Append(const wxString& item) int index = ListBox_AddString(hwnd, item); m_noItems ++; - #if USE_OWNER_DRAWN +#if USE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { wxOwnerDrawn *pNewItem = CreateItem(-1); // dummy argument pNewItem->SetName(item); m_aItems.Add(pNewItem); ListBox_SetItemData(hwnd, index, pNewItem); } - #endif +#endif SetHorizontalExtent(item); } @@ -307,14 +310,14 @@ void wxListBox::Append(const wxString& item, char *Client_data) int index = ListBox_AddString(hwnd, item); m_noItems ++; - #if USE_OWNER_DRAWN +#if USE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { // client data must be pointer to wxOwnerDrawn, otherwise we would crash // in OnMeasure/OnDraw. wxFAIL_MSG("Can't use client data with owner-drawn listboxes"); } else - #endif +#endif ListBox_SetItemData(hwnd, index, Client_data); SetHorizontalExtent(item); @@ -333,7 +336,7 @@ void wxListBox::Set(const int n, const wxString *choices, char** clientData) } m_noItems = n; - #if USE_OWNER_DRAWN +#if USE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { // first delete old items uint ui = m_aItems.Count(); @@ -353,7 +356,7 @@ void wxListBox::Set(const int n, const wxString *choices, char** clientData) "Can't use client data with owner-drawn listboxes"); } } - #endif +#endif SetHorizontalExtent(""); ShowWindow(hwnd, SW_SHOW); @@ -711,7 +714,6 @@ WXHBRUSH wxListBox::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT long wxListBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { -/* switch (nMsg) { case WM_INITDIALOG: @@ -730,7 +732,7 @@ long wxListBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) case WM_MBUTTONDBLCLK: case WM_LBUTTONDOWN: case WM_LBUTTONUP: -// case WM_LBUTTONDBLCLK: + case WM_LBUTTONDBLCLK: case WM_MOUSEMOVE: case WM_DESTROY: case WM_COMMAND: @@ -761,7 +763,6 @@ long wxListBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) case WM_NCHITTEST: return MSWDefWindowProc(nMsg, wParam, lParam ); } -*/ return wxControl::MSWWindowProc(nMsg, wParam, lParam); } diff --git a/src/msw/makefile.nt b/src/msw/makefile.nt index e6671606ca..e4813d9fcc 100644 --- a/src/msw/makefile.nt +++ b/src/msw/makefile.nt @@ -489,6 +489,11 @@ $(MSWDIR)/nativdlg.obj: $*.$(SRCSUFF) $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@ << +$(MSWDIR)/notebook.obj: $*.$(SRCSUFF) + cl @<< +$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@ +<< + $(MSWDIR)/ownerdrw.obj: $*.$(SRCSUFF) cl @<< $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@ diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index ff101f9e68..7f7c044db0 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -142,6 +142,8 @@ bool wxMDIParentFrame::Create(wxWindow *parent, msflags |= WS_MAXIMIZE; if (style & wxCAPTION) msflags |= WS_CAPTION; + if (style & wxCLIP_CHILDREN) + msflags |= WS_CLIPCHILDREN; wxWindow::MSWCreate(m_windowId, parent, wxMDIFrameClassName, this, title, x, y, width, height, msflags); diff --git a/src/msw/menuitem.cpp b/src/msw/menuitem.cpp index 3cde928232..4641f7d0dc 100644 --- a/src/msw/menuitem.cpp +++ b/src/msw/menuitem.cpp @@ -67,7 +67,7 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, { wxASSERT( pParentMenu != NULL ); -#ifdef USE_OWNER_DRAWN +#if USE_OWNER_DRAWN // set default menu colors #define SYS_COLOR(c) (wxSystemSettings::GetSystemColour(wxSYS_COLOUR_##c)) diff --git a/src/msw/scrolbar.cpp b/src/msw/scrolbar.cpp index e61cd8e178..fc0bf789f7 100644 --- a/src/msw/scrolbar.cpp +++ b/src/msw/scrolbar.cpp @@ -100,6 +100,8 @@ bool wxScrollBar::Create(wxWindow *parent, const wxWindowID id, ::SetScrollPos(scroll_bar, SB_CTL, 0, FALSE); ShowWindow(scroll_bar, SW_SHOW); + SetFont(parent->GetFont()); + m_hWnd = (WXHWND)scroll_bar; // Subclass again for purposes of dialog editing mode diff --git a/src/msw/slider.cpp b/src/msw/slider.cpp index 275e19e3d6..f09cdb8cb3 100644 --- a/src/msw/slider.cpp +++ b/src/msw/slider.cpp @@ -156,6 +156,8 @@ bool wxSlider::Create(wxWindow *parent, const wxWindowID id, SubclassWin(GetHWND()); + SetFont(parent->GetFont()); + if ( m_windowStyle & wxSL_LABELS ) { // Finally, create max value static item @@ -165,8 +167,6 @@ bool wxSlider::Create(wxWindow *parent, const wxWindowID id, 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), wxGetInstance(), NULL); - SetFont(parent->GetFont()); - if (GetFont()) { // GetFont()->RealizeResource(); diff --git a/src/msw/statbox.cpp b/src/msw/statbox.cpp index b943131324..25f303c58a 100644 --- a/src/msw/statbox.cpp +++ b/src/msw/statbox.cpp @@ -182,6 +182,21 @@ WXHBRUSH wxStaticBox::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUIN // outline. void wxStaticBox::OnEraseBackground(wxEraseEvent& event) { + // If we don't have this (call Default()), we don't paint the background properly. + // If we do have this, we seem to overwrite enclosed controls. + // Is it the WS_CLIPCHILDREN style that's causing the problems? + // Probably - without this style, the background of the window will show through, + // so the control doesn't have to paint it. The window background will always be + // painted before all other controls, therefore there are no problems with + // controls being hidden by the static box. + // So, if we could specify wxCLIP_CHILDREN in window, or not, we could optimise painting better. + // We would assume wxCLIP_CHILDREN in a frame and a scrolled window, but not in a panel. + // Is this too platform-specific?? What else can we do? Not a lot, since we have to pass + // this information from arbitrary wxWindow derivatives, and it depends on what you wish to + // do with the windows. + // Alternatively, just make sure that wxStaticBox is always at the back! There are probably + // few other circumstances where it matters about child clipping. But what about painting onto + // to panel, inside a groupbox? Doesn't appear, because the box wipes it out. wxWindow *parent = GetParent(); if ( parent && parent->GetHWND() && (::GetWindowLong((HWND) parent->GetHWND(), GWL_STYLE) & WS_CLIPCHILDREN) ) { @@ -204,7 +219,7 @@ void wxStaticBox::OnEraseBackground(wxEraseEvent& event) long wxStaticBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { - // TODO: somehow, this has to accept mouse clicks in user interface edit mode, + // TODO: somehow, this has to accept mouse clicks in user interface edit mode, // but not otherwise. Only there is no longer a UI edit mode... // It worked before because the message could be processed if not in UI @@ -215,8 +230,21 @@ long wxStaticBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // skip the code below. Too time consuming though. // Perhaps it's ok to do the default thing *anyway* because the title or edge // of the window may still be active! +// if (nMsg == WM_NCHITTEST) +// return Default(); + if (nMsg == WM_NCHITTEST) - return Default(); + { + int xPos = LOWORD(lParam); // horizontal position of cursor + int yPos = HIWORD(lParam); // vertical position of cursor + + ScreenToClient(&xPos, &yPos); + + // Make sure you can drag by the top of the groupbox, but let + // other (enclosed) controls get mouse events also + if (yPos < 10) + return (long)HTCLIENT; + } return wxControl::MSWWindowProc(nMsg, wParam, lParam); } diff --git a/src/msw/statbr95.cpp b/src/msw/statbr95.cpp index 581d1db266..6f02d0aa57 100644 --- a/src/msw/statbr95.cpp +++ b/src/msw/statbr95.cpp @@ -94,7 +94,7 @@ bool wxStatusBar95::Create(wxWindow *parent, wxWindowID id, long style) m_windowId = id == -1 ? NewControlId() : id; DWORD wstyle = WS_CHILD | WS_VISIBLE; - if ( style & wxSB_SIZEGRIP ) + if ( style & wxST_SIZEGRIP ) wstyle |= SBARS_SIZEGRIP; m_hWnd = (WXHWND)CreateStatusWindow(wstyle, diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index ea86d42cec..36ebad03d8 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -104,7 +104,7 @@ bool wxToolBar95::Create(wxWindow *parent, const wxWindowID id, const wxPoint& p m_windowStyle = style; - SetFont(wxTheFontList->FindOrCreateFont(11, wxSWISS, wxNORMAL, wxNORMAL)); + SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); SetParent(parent); diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 3090978dc5..07126b51e3 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -472,11 +472,10 @@ bool wxWindow::Create(wxWindow *parent, const wxWindowID id, msflags |= WS_BORDER; if (style & wxTHICK_FRAME) msflags |= WS_THICKFRAME; - // TODO: probably make WS_CLIPCHILDREN this a setting in wx/setup.h, - // to reduce flicker with the trade-off that groupboxes must paint in a solid - // colour (so your control order must be correct, and you can't easily draw a - // transparent group). - msflags |= WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN; + + msflags |= WS_CHILD | WS_VISIBLE; + if (style & wxCLIP_CHILDREN) + msflags |= WS_CLIPCHILDREN; bool want3D; WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ; @@ -819,9 +818,6 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, HFONT was = 0; if (fontToUse && fontToUse->Ok()) { -// fontToUse->UseResource(); - -// fontToUse->RealizeResource(); if ((fnt=(HFONT) fontToUse->GetResourceHandle())) was = SelectObject(dc,fnt) ; } @@ -881,42 +877,11 @@ void wxWindow::Refresh(const bool eraseBack, const wxRectangle *rect) } } -// TODO: Are these really necessary now? -/* -WXHDC wxWindow::GetHDC(void) const -{ - wxWindow *nonConst = (wxWindow *)this; - if (m_paintHDC) - return(m_paintHDC) ; - nonConst->m_tempHDC = (WXHDC) ::GetDC((HWND) GetHWND()) ; - return(m_tempHDC) ; -} - -void wxWindow::ReleaseHDC(void) -{ - // We're within an OnPaint: it'll be released. - if (m_paintHDC) - return ; - - ::ReleaseDC((HWND) GetHWND(),(HDC) m_tempHDC) ; -} -*/ - // Hook for new window just as it's being created, // when the window isn't yet associated with the handle wxWindow *wxWndHook = NULL; -/* -#if HAVE_SOCKET -// DDE Interface Handler -extern "C" { - long ddeWindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam); - void __ddeUnblock(HWND hWnd, WPARAM wParam); -}; -#endif -*/ - -// Main Windows 3 window proc +// Main window proc LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd); @@ -945,12 +910,6 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA wnd->m_lastMsg = message; wnd->m_lastWParam = wParam; wnd->m_lastLParam = lParam; -/* Don't know why this was here - if (message == WM_SETFONT) - return 0; - else if (message == WM_INITDIALOG) - return TRUE; -*/ } if (wnd) return wnd->MSWWindowProc(message, wParam, lParam); @@ -1024,12 +983,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) switch (message) { -/* - case WM_SETFONT: - { - return 0; - } -*/ case WM_ACTIVATE: { #ifdef __WIN32__ @@ -1296,25 +1249,27 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) case WM_KEYDOWN: { - // these keys are not interesting to the application (@@ or are they?) - if ( wParam == VK_SHIFT || wParam == VK_CONTROL ) - return Default(); + if (wParam == VK_SHIFT) + return Default(); + + else if (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)) - return Default(); - - MSWOnChar((WORD)wParam, lParam); - //VZ: commented - what is it for? - //if (::GetKeyState(VK_CONTROL)&0x100?TRUE:FALSE) - // return Default(); + else if ((wParam != VK_ESCAPE) && (wParam != VK_SPACE) && (wParam != VK_RETURN) && (wParam != VK_BACK) && (wParam != VK_TAB)) + { + MSWOnChar((WORD)wParam, lParam); + if (::GetKeyState(VK_CONTROL)&0x100?TRUE:FALSE) + return Default(); + } + else + return Default(); + } + case WM_KEYUP: + { break; } - // VZ: WM_KEYUP not processed - case WM_CHAR: // Always an ASCII character { MSWOnChar((WORD)wParam, lParam, TRUE); @@ -1981,7 +1936,11 @@ long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) long wxWindow::Default() { - return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); + // These are fake events, ignore them + if (m_lastEvent != wxEVT_ENTER_WINDOW && m_lastEvent != wxEVT_LEAVE_WINDOW) + return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); + else + return 0; } bool wxWindow::MSWProcessMessage(WXMSG* pMsg) @@ -2262,9 +2221,7 @@ void wxWindow::MSWOnLButtonUp(const int x, const int y, const WXUINT flags) void wxWindow::MSWOnLButtonDClick(const int x, const int y, const WXUINT flags) { - /* MATTHEW: If dclick not allowed, generate another single-click */ - wxMouseEvent event(m_doubleClickAllowed ? - wxEVENT_TYPE_LEFT_DCLICK : wxEVENT_TYPE_LEFT_DOWN); + wxMouseEvent event(wxEVENT_TYPE_LEFT_DCLICK); event.m_x = x; event.m_y = y; event.m_shiftDown = ((flags & MK_SHIFT) != 0); @@ -2315,7 +2272,7 @@ void wxWindow::MSWOnMButtonDown(const int x, const int y, const WXUINT flags) event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */ event.m_eventObject = this; - m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_LEFT_DOWN; + m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_MIDDLE_DOWN; GetEventHandler()->OldOnMouseEvent(event); } @@ -2333,16 +2290,13 @@ void wxWindow::MSWOnMButtonUp(const int x, const int y, const WXUINT flags) event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */ event.m_eventObject = this; - m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_LEFT_UP; + m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_MIDDLE_UP; GetEventHandler()->OldOnMouseEvent(event); } void wxWindow::MSWOnMButtonDClick(const int x, const int y, const WXUINT flags) { -//wxDebugMsg("MButtonDClick\n") ; - /* MATTHEW: If dclick not allowed, generate another single-click */ - wxMouseEvent event((m_doubleClickAllowed) ? - wxEVENT_TYPE_MIDDLE_DCLICK : wxEVENT_TYPE_MIDDLE_DOWN); + wxMouseEvent event(wxEVENT_TYPE_MIDDLE_DCLICK); event.m_x = x; event.m_y = y; event.m_shiftDown = ((flags & MK_SHIFT) != 0); @@ -2353,7 +2307,7 @@ void wxWindow::MSWOnMButtonDClick(const int x, const int y, const WXUINT flags) event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */ event.m_eventObject = this; - m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_LEFT_DCLICK; + m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_MIDDLE_DCLICK; // if (m_doubleClickAllowed) GetEventHandler()->OldOnMouseEvent(event); } @@ -2415,9 +2369,7 @@ void wxWindow::MSWOnRButtonUp(const int x, const int y, const WXUINT flags) void wxWindow::MSWOnRButtonDClick(const int x, const int y, const WXUINT flags) { - /* MATTHEW: If dclick not allowed, generate another single-click */ - wxMouseEvent event((m_doubleClickAllowed) ? - wxEVENT_TYPE_RIGHT_DCLICK : wxEVENT_TYPE_RIGHT_DOWN); + wxMouseEvent event(wxEVENT_TYPE_RIGHT_DCLICK); event.m_x = x; event.m_y = y; event.m_shiftDown = ((flags & MK_SHIFT) != 0); @@ -2492,7 +2444,7 @@ void wxWindow::MSWOnMouseEnter(const int x, const int y, const WXUINT flags) m_lastEvent = wxEVT_ENTER_WINDOW; m_lastXPos = event.m_x; m_lastYPos = event.m_y; - GetEventHandler()->OldOnMouseEvent(event); + GetEventHandler()->ProcessEvent(event); } void wxWindow::MSWOnMouseLeave(const int x, const int y, const WXUINT flags) @@ -2510,7 +2462,7 @@ void wxWindow::MSWOnMouseLeave(const int x, const int y, const WXUINT flags) m_lastEvent = wxEVT_LEAVE_WINDOW; m_lastXPos = event.m_x; m_lastYPos = event.m_y; - GetEventHandler()->OldOnMouseEvent(event); + GetEventHandler()->ProcessEvent(event); } void wxWindow::MSWOnChar(const WXWORD wParam, const WXLPARAM lParam, const bool isASCII) @@ -4718,7 +4670,6 @@ void wxWindow::OnIdle(wxIdleEvent& event) MSWOnMouseLeave(pt.x, pt.y, 0); } } - UpdateWindowUI(); }