#undef GetClassInfo
#endif
-#define WINDOW_MARGIN 3 // This defines sensitivity of Leave events
+#define WINDOW_MARGIN 3 // This defines sensitivity of Leave events
wxMenu *wxCurrentPopupMenu = NULL;
extern wxList wxPendingDelete;
// wxWnd
MSWDetachWindowMenu();
- wxRemoveHandleAssociation(this);
-
// TODO for backward compatibility
#if 0
// WX_CANVAS
if (m_hWnd)
::DestroyWindow((HWND)m_hWnd);
+
+ wxRemoveHandleAssociation(this);
m_hWnd = 0;
#ifndef __WIN32__
if (m_globalHandle)
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) ;
void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
{
- DELETEP(m_pDropTarget);
+ if ( m_pDropTarget != 0 ) {
+ m_pDropTarget->Revoke(m_hWnd);
+ delete m_pDropTarget;
+ }
+
m_pDropTarget = pDropTarget;
if ( m_pDropTarget != 0 )
m_pDropTarget->Register(m_hWnd);
HFONT was = 0;
if (fontToUse && fontToUse->Ok())
{
-// fontToUse->UseResource();
-
-// fontToUse->RealizeResource();
if ((fnt=(HFONT) fontToUse->GetResourceHandle()))
was = SelectObject(dc,fnt) ;
}
}
}
-// 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);
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);
switch (message)
{
-/*
- case WM_SETFONT:
- {
- return 0;
- }
-*/
case WM_ACTIVATE:
{
#ifdef __WIN32__
return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam);
break;
}
+
case WM_KEYDOWN:
{
-// return Default();
-
if (wParam == VK_SHIFT)
return Default();
}
else
return Default();
- break;
}
case WM_KEYUP:
{
-/*
- if (wParam == VK_SHIFT)
- wxShiftDown = FALSE;
- else if (wParam == VK_CONTROL)
- wxControlDown = FALSE;
-*/
break;
}
+ // VZ: WM_KEYUP not processed
case WM_CHAR: // Always an ASCII character
{
MSWOnChar((WORD)wParam, lParam, TRUE);
break;
}
+
case WM_HSCROLL:
{
#ifdef __WIN32__
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" );
+
if ( !wxWinHandleList->Find((long)hWnd) )
wxWinHandleList->Append((long)hWnd, win);
}
#if DEBUG > 1
wxDebugMsg("wxWindow::MSWOnDestroy %d\n", handle);
#endif
- // delete our log target if we've got one
-#if USE_DRAG_AND_DROP
- if ( m_pDropTarget != 0 ) {
+ // delete our drop target if we've got one
+ #if USE_DRAG_AND_DROP
+ if ( m_pDropTarget != NULL ) {
m_pDropTarget->Revoke(m_hWnd);
delete m_pDropTarget;
m_pDropTarget = NULL;
}
-#endif
+ #endif
return TRUE;
}
if ( id == 0 ) { // is it a menu item?
DRAWITEMSTRUCT *pDrawStruct = (DRAWITEMSTRUCT *)itemStruct;
wxMenuItem *pMenuItem = (wxMenuItem *)(pDrawStruct->itemData);
- wxCHECK_RET( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
// prepare to call OnDrawItem()
wxDC dc;
if ( id == 0 ) { // is it a menu item?
MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct;
wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData);
- wxCHECK_RET( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
return pMenuItem->OnMeasureItem(&pMeasureStruct->itemWidth,
&pMeasureStruct->itemHeight);
long wxWindow::Default()
{
- return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
+ // Ignore 'fake' events (perhaps generated as a result of a separate real event)
+ if (m_lastMsg == 0)
+ return 0;
+
+ return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
}
bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
}
#endif
-//wxDebugMsg("LButtonDown\n") ;
wxMouseEvent event(wxEVENT_TYPE_LEFT_DOWN);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
void wxWindow::MSWOnLButtonUp(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("LButtonUp\n") ;
wxMouseEvent event(wxEVENT_TYPE_LEFT_UP);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
void wxWindow::MSWOnLButtonDClick(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("LButtonDClick\n") ;
- /* MATTHEW: If dclick not allowed, generate another single-click */
- wxMouseEvent event(m_doubleClickAllowed ?
- wxEVENT_TYPE_LEFT_DCLICK : wxEVENT_TYPE_LEFT_DOWN);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
+ wxMouseEvent event(wxEVENT_TYPE_LEFT_DCLICK);
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
}
#endif
-//wxDebugMsg("MButtonDown\n") ;
wxMouseEvent event(wxEVENT_TYPE_MIDDLE_DOWN);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
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);
}
//wxDebugMsg("MButtonUp\n") ;
wxMouseEvent event(wxEVENT_TYPE_MIDDLE_UP);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
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);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
+ wxMouseEvent event(wxEVENT_TYPE_MIDDLE_DCLICK);
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
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);
}
}
#endif
-//wxDebugMsg("RButtonDown\n") ;
wxMouseEvent event(wxEVENT_TYPE_RIGHT_DOWN);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
void wxWindow::MSWOnRButtonUp(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("RButtonUp\n") ;
wxMouseEvent event(wxEVENT_TYPE_RIGHT_UP);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
void wxWindow::MSWOnRButtonDClick(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("RButtonDClick\n") ;
- /* MATTHEW: If dclick not allowed, generate another single-click */
- wxMouseEvent event((m_doubleClickAllowed) ?
- wxEVENT_TYPE_RIGHT_DCLICK : wxEVENT_TYPE_RIGHT_DOWN);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
+ wxMouseEvent event(wxEVENT_TYPE_RIGHT_DCLICK);
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
if (m_windowCursor.Ok() && !wxIsBusy())
::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
- wxMouseEvent event(wxEVENT_TYPE_MOTION);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
- event.m_x = x; event.m_y = y;
- event.m_shiftDown = ((flags & MK_SHIFT) != 0);
- event.m_controlDown = ((flags & MK_CONTROL) != 0);
- event.m_leftDown = ((flags & MK_LBUTTON) != 0);
- event.m_middleDown = ((flags & MK_MBUTTON) != 0);
- event.m_rightDown = ((flags & MK_RBUTTON) != 0);
- event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
- event.m_eventObject = this;
-
- // Window gets a click down message followed by a mouse move
- // message even if position isn't changed! We want to discard
- // the trailing move event if x and y are the same.
- if ((m_lastEvent == wxEVENT_TYPE_RIGHT_DOWN || m_lastEvent == wxEVENT_TYPE_LEFT_DOWN ||
- m_lastEvent == wxEVENT_TYPE_MIDDLE_DOWN) &&
- (m_lastXPos == event.m_x && m_lastYPos == event.m_y))
+ if (!m_mouseInWindow)
{
- m_lastXPos = event.m_x; m_lastYPos = event.m_y;
- m_lastEvent = wxEVENT_TYPE_MOTION;
- return;
+ // Generate an ENTER event
+ m_mouseInWindow = TRUE;
+ MSWOnMouseEnter(x, y, flags);
}
- m_lastEvent = wxEVENT_TYPE_MOTION;
- m_lastXPos = event.m_x; m_lastYPos = event.m_y;
- GetEventHandler()->OldOnMouseEvent(event);
-}
-
-/* TODO put back leave/enter code if required
- */
-#if 0
-void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
-{
-//wxDebugMsg("Client 0x%08x Move Msg %d,%d\n",this,x,y) ;
-
-// #if MOUSE_EXIT_FIX //Should work now!!
-
- // Don't do the Leave/Enter fix if we've captured the window,
- // or SetCapture won't work properly.
- if (!m_winCaptured)
- {
- HWND hunder ;
- POINT pt ;
- // See if we Leave/Enter the window.
- GetCursorPos(&pt) ;
- hunder = WindowFromPoint(pt) ;
- if (hunder==m_hWnd)
- {
- // I'm in the Window, but perhaps in NC area.
- RECT wind ;
- RECT nc ;
- GetClientRect(m_hWnd,&wind) ;
- GetWindowRect(m_hWnd,&nc) ;
- pt.x -= nc.left ;
- pt.y -= nc.top ;
- wind.left += WINDOW_MARGIN ; // to be able to 'see' leave
- wind.top += WINDOW_MARGIN ; // to be able to 'see' leave
- wind.right -= WINDOW_MARGIN ; // to be able to 'see' leave
- wind.bottom -= WINDOW_MARGIN ; // to be able to 'see' leave
-
- if (!PtInRect(&wind,pt))
- hunder = NULL ; // So, I can simulate a Leave event...
- }
-
- if (hunder!=m_hWnd)
- {
- if (m_mouseInWindow)
- {
- m_mouseInWindow = FALSE ;
- // Capture/Release is no more needed...
- //ReleaseCapture() ;
- MSWOnMouseLeave(x,y,flags) ;
- return ;
- }
- // We never want to see Enter or Motion in this part of the Window...
- return ;
- }
- else
- {
- // Event was triggered while I'm really into my client area.
- // Do an Enter if not done.
- if (!m_mouseInWindow)
- {
- m_mouseInWindow = TRUE ;
- // Capture/Release is no more needed...
- //SetCapture(m_hWnd) ;
- // Set cursor, but only if we're not in 'busy' mode
- if (m_windowCursor.Ok() && !wxIsBusy())
- ::SetCursor(m_windowCursor.ms_cursor);
- MSWOnMouseEnter(x,y,flags) ;
- return ;
- }
- }
- }
-// #endif //MOUSE_EXIT_FIX
-
- // 'normal' move event...
- // Set cursor, but only if we're not in 'busy' mode
- if (m_windowCursor.Ok() && !wxIsBusy())
- ::SetCursor(m_windowCursor.ms_cursor);
-
wxMouseEvent event(wxEVENT_TYPE_MOTION);
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
-
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.m_controlDown = ((flags & MK_CONTROL) != 0);
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
GetEventHandler()->OldOnMouseEvent(event);
}
-#endif
void wxWindow::MSWOnMouseEnter(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("Client 0x%08x Enter %d,%d\n",this,x,y) ;
-
- // Set cursor, but only if we're not in 'busy' mode
- if (m_windowCursor.Ok() && !wxIsBusy())
- ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
-
- wxMouseEvent event(wxEVENT_TYPE_ENTER_WINDOW);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
+ wxMouseEvent event(wxEVT_ENTER_WINDOW);
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
event.m_eventObject = this;
- m_lastEvent = wxEVENT_TYPE_ENTER_WINDOW;
+ m_lastEvent = wxEVT_ENTER_WINDOW;
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
- GetEventHandler()->OldOnMouseEvent(event);
+ // No message - ensure we don't try to call the default behaviour accidentally.
+ m_lastMsg = 0;
+ GetEventHandler()->ProcessEvent(event);
}
void wxWindow::MSWOnMouseLeave(const int x, const int y, const WXUINT flags)
{
-//wxDebugMsg("Client 0x%08x Leave %d,%d\n",this,x,y) ;
-
- // Set cursor, but only if we're not in 'busy' mode
- if (m_windowCursor.Ok() && !wxIsBusy())
- ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
-
- wxMouseEvent event(wxEVENT_TYPE_LEAVE_WINDOW);
-
-/*
- float px = (float)x;
- float py = (float)y;
-
- MSWDeviceToLogical(&px, &py);
-
- CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
-*/
+ wxMouseEvent event(wxEVT_LEAVE_WINDOW);
event.m_x = x; event.m_y = y;
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
event.m_eventObject = this;
- m_lastEvent = wxEVENT_TYPE_LEAVE_WINDOW;
+ m_lastEvent = wxEVT_LEAVE_WINDOW;
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
- GetEventHandler()->OldOnMouseEvent(event);
+ // No message - ensure we don't try to call the default behaviour accidentally.
+ m_lastMsg = 0;
+ GetEventHandler()->ProcessEvent(event);
}
void wxWindow::MSWOnChar(const WXWORD wParam, const WXLPARAM lParam, const bool isASCII)
}
}
}
- else
- if ((id = wxCharCodeMSWToWX(wParam)) == 0)
+ else if ((id = wxCharCodeMSWToWX(wParam)) == 0) {
+ // it's ASCII and will be processed here only when called from
+ // WM_CHAR (i.e. when isASCII = TRUE)
id = -1;
+ }
- if (id > -1)
+ if (id != -1)
{
wxKeyEvent event(wxEVT_CHAR);
event.m_shiftDown = (::GetKeyState(VK_SHIFT)&0x100?TRUE:FALSE);
pt.x -= rect.left ;
pt.y -= rect.top ;
-/*
- float fx,fy ;
- fx = (float)pt.x ;
- fy = (float)pt.y ;
- MSWDeviceToLogical(&fx,&fy) ;
- CalcUnscrolledPosition((int)fx,(int)fy,&event.m_x,&event.m_y) ;
-*/
event.m_x = pt.x; event.m_y = pt.y;
#if WXWIN_COMPATIBILITY
void wxWindow::OnIdle(wxIdleEvent& event)
{
+ // Check if we need to send a LEAVE event
+ if (m_mouseInWindow)
+ {
+ POINT pt;
+ ::GetCursorPos(&pt);
+ if (::WindowFromPoint(pt) != (HWND) GetHWND())
+ {
+ // Generate a LEAVE event
+ m_mouseInWindow = FALSE;
+ MSWOnMouseLeave(pt.x, pt.y, 0);
+ }
+ }
UpdateWindowUI();
}