X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2aef89b7a675805b601e757492c982031f38d21..803bf1c5818154dbff797029441c7de0d85339d5:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index bfa74f9f0b..db9a0969bd 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -81,7 +81,7 @@ #endif #ifdef __WXDEBUG__ - static const char *GetMessageName(int message); +const char *wxGetMessageName(int message); #endif //WXDEBUG #define WINDOW_MARGIN 3 // This defines sensitivity of Leave events @@ -98,7 +98,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler) BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) EVT_CHAR(wxWindow::OnChar) - EVT_SIZE(wxWindow::OnSize) EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_INIT_DIALOG(wxWindow::OnInitDialog) @@ -160,8 +159,8 @@ wxWindow *wxWindow::FindItemByHWND(WXHWND hWnd, bool controlOnly) const return item; else { - if ( item->ContainsHWND(hWnd) ) - return item; + if ( item->ContainsHWND(hWnd) ) + return item; } } current = current->Next(); @@ -191,7 +190,7 @@ WXHWND wxWindow::GetHWND(void) const void wxWindow::SetHWND(WXHWND hWnd) { - m_hWnd = hWnd; + m_hWnd = hWnd; } // Constructor @@ -246,14 +245,14 @@ wxWindow::wxWindow(void) /* wxColour(GetRValue(GetSysColor(COLOR_WINDOW)), - GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE))); + GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE))); */ // wxWnd m_lastMsg = 0; m_lastWParam = 0; m_lastLParam = 0; - m_acceleratorTable = 0; +// m_acceleratorTable = 0; m_hMenu = 0; m_xThumbSize = 0; @@ -282,9 +281,9 @@ wxWindow::~wxWindow(void) // Restore old Window proc, if required // UnsubclassWin(); - // Have to delete constraints/sizer FIRST otherwise - // sizers may try to look at deleted windows as they - // delete themselves. + // Have to delete constraints/sizer FIRST otherwise + // sizers may try to look at deleted windows as they + // delete themselves. #if USE_CONSTRAINTS DeleteRelatedConstraints(); if (m_constraints) @@ -308,19 +307,6 @@ wxWindow::~wxWindow(void) // wxWnd MSWDetachWindowMenu(); - // TODO for backward compatibility -#if 0 - // WX_CANVAS - if (m_windowDC) - { - HWND hWnd = (HWND) GetHWND(); - HDC dc = ::GetDC(hWnd); - m_windowDC->SelectOldObjects (dc); - ReleaseDC(hWnd, dc); - delete m_windowDC; - } -#endif - if (m_windowParent) m_windowParent->RemoveChild(this); @@ -352,11 +338,8 @@ wxWindow::~wxWindow(void) // class wxTopLevelWindows.DeleteObject(this); -// if (GetFont() && GetFont()->Ok()) -// GetFont()->ReleaseResource(); - if ( m_windowValidator ) - delete m_windowValidator; + delete m_windowValidator; // Restore old Window proc, if required // and remove hWnd <-> wxWindow association @@ -386,10 +369,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_windowStyle = 0; m_windowParent = NULL; m_windowEventHandler = this; -// m_windowFont = NULL; - // We don't wish internal (potentially transient) fonts to be found - // by FindOrCreate -// wxTheFontList->RemoveFont(& m_windowFont); m_windowName = ""; m_windowCursor = *wxSTANDARD_CURSOR; m_doubleClickAllowed = 0 ; @@ -415,8 +394,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_minSizeY = -1; m_maxSizeX = -1; m_maxSizeY = -1; -// m_paintHDC = 0; -// m_tempHDC = 0; m_oldWndProc = 0; #ifndef __WIN32__ m_globalHandle = 0; @@ -424,7 +401,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_useCtl3D = FALSE; m_defaultItem = NULL; m_windowParent = NULL; -// m_windowDC = NULL; m_mouseInWindow = FALSE; if (!parent) return FALSE; @@ -435,7 +411,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_lastMsg = 0; m_lastWParam = 0; m_lastLParam = 0; - m_acceleratorTable = 0; m_hMenu = 0; m_xThumbSize = 0; @@ -450,9 +425,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, SetName(name); if ( id == -1 ) - m_windowId = (int)NewControlId(); + m_windowId = (int)NewControlId(); else - m_windowId = id; + m_windowId = id; int x = pos.x; int y = pos.y; @@ -465,10 +440,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_foregroundColour = *wxBLACK; m_defaultForegroundColour = *wxBLACK ; m_defaultBackgroundColour = settings.GetSystemColour(wxSYS_COLOUR_3DFACE) ; -/* - m_defaultBackgroundColour = wxColour(GetRValue(GetSysColor(COLOR_BTNFACE)), - GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE))); -*/ m_windowStyle = style; @@ -493,13 +464,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_mouseInWindow = FALSE ; - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; - - MSWCreate(m_windowId, (wxWindow *)parent, wxCanvasClassName, this, NULL, x, y, width, height, msflags, - NULL, exStyle); + MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL, + x, y, width, height, msflags, NULL, exStyle); return TRUE; } @@ -538,32 +504,38 @@ void wxWindow::ReleaseMouse(void) } } +void wxWindow::SetAcceleratorTable(const wxAcceleratorTable& accel) +{ + m_acceleratorTable = accel; +} + + // Push/pop event handler (i.e. allow a chain of event handlers // be searched) void wxWindow::PushEventHandler(wxEvtHandler *handler) { - handler->SetNextHandler(GetEventHandler()); - SetEventHandler(handler); + handler->SetNextHandler(GetEventHandler()); + SetEventHandler(handler); } wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler) { - if ( GetEventHandler() ) - { - wxEvtHandler *handlerA = GetEventHandler(); - wxEvtHandler *handlerB = handlerA->GetNextHandler(); - handlerA->SetNextHandler(NULL); - SetEventHandler(handlerB); - if ( deleteHandler ) - { - delete handlerA; - return NULL; - } - else - return handlerA; - } - else - return NULL; + if ( GetEventHandler() ) + { + wxEvtHandler *handlerA = GetEventHandler(); + wxEvtHandler *handlerB = handlerA->GetNextHandler(); + handlerA->SetNextHandler(NULL); + SetEventHandler(handlerB); + if ( deleteHandler ) + { + delete handlerA; + return NULL; + } + else + return handlerA; + } + else + return NULL; } #if USE_DRAG_AND_DROP @@ -622,6 +594,16 @@ void wxWindow::GetPosition(int *x, int *y) const { ::ScreenToClient(hParentWnd, &point); } + + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + if (GetParent()) + { + wxPoint pt(GetParent()->GetClientAreaOrigin()); + point.x -= pt.x; + point.y -= pt.y; + } *x = point.x; *y = point.y; } @@ -634,6 +616,18 @@ void wxWindow::ScreenToClient(int *x, int *y) const pt.y = *y; ::ScreenToClient(hWnd, &pt); +/* + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + if (GetParent()) + { + wxPoint pt1(GetParent()->GetClientAreaOrigin()); + pt.x -= pt1.x; + pt.y -= pt1.y; + } +*/ + *x = pt.x; *y = pt.y; } @@ -644,6 +638,19 @@ void wxWindow::ClientToScreen(int *x, int *y) const POINT pt; pt.x = *x; pt.y = *y; + +/* + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + if (GetParent()) + { + wxPoint pt1(GetParent()->GetClientAreaOrigin()); + pt.x += pt1.x; + pt.y += pt1.y; + } +*/ + ::ClientToScreen(hWnd, &pt); *x = pt.x; @@ -675,7 +682,6 @@ void wxWindow::SetCursor(const wxCursor& cursor) // Get size *available for subwindows* i.e. excluding menu bar etc. -// For XView, this is the same as GetSize void wxWindow::GetClientSize(int *x, int *y) const { HWND hWnd = (HWND) GetHWND(); @@ -698,6 +704,8 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags) if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) actualY = currentY; + AdjustForParentClientOrigin(actualX, actualY, sizeFlags); + int currentW,currentH; GetSize(¤tW, ¤tH); if (width == -1) @@ -746,6 +754,24 @@ void wxWindow::SetClientSize(int width, int height) GetEventHandler()->ProcessEvent(event); } +// For implementation purposes - sometimes decorations make the client area +// smaller +wxPoint wxWindow::GetClientAreaOrigin() const +{ + return wxPoint(0, 0); +} + +// Makes an adjustment to the window position (for example, a frame that has +// a toolbar that it manages itself). +void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) +{ + if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) + { + wxPoint pt(GetParent()->GetClientAreaOrigin()); + x += pt.x; y += pt.y; + } +} + bool wxWindow::Show(bool show) { HWND hWnd = (HWND) GetHWND(); @@ -808,7 +834,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, if (fontToUse && fontToUse->Ok()) { if ((fnt=(HFONT) fontToUse->GetResourceHandle())) - was = SelectObject(dc,fnt) ; + was = (HFONT) SelectObject(dc,fnt) ; } SIZE sizeRect; @@ -850,6 +876,28 @@ void wxWindow::Refresh(bool eraseBack, const wxRectangle *rect) } } +bool wxWindow::ProcessEvent(wxEvent& event) +{ + // we save here the information about the last message because it might be + // overwritten if the event handler sends any messages to our window (case + // in point: wxNotebook::OnSize) - and then if we call Default() later + // (which is done quite often if the message is not processed) it will use + // incorrect values for m_lastXXX variables + WXUINT lastMsg = m_lastMsg; + WXWPARAM lastWParam = m_lastWParam; + WXLPARAM lastLParam = m_lastLParam; + + // call the base version + bool bProcessed = wxEvtHandler::ProcessEvent(event); + + // restore + m_lastMsg = lastMsg; + m_lastWParam = lastWParam; + m_lastLParam = lastLParam; + + return bProcessed; +} + // Hook for new window just as it's being created, // when the window isn't yet associated with the handle wxWindow *wxWndHook = NULL; @@ -861,9 +909,9 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA if (!wnd && wxWndHook) { - wxAssociateWinWithHandle(hWnd, wxWndHook); + wxAssociateWinWithHandle(hWnd, wxWndHook); wnd = wxWndHook; - wxWndHook = NULL; + wxWndHook = NULL; wnd->m_hWnd = (WXHWND) hWnd; } #if (WXDEBUG > 1) @@ -900,8 +948,13 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA // Main Windows 3 window proc long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { + wxASSERT( m_lastMsg == message && + m_lastWParam == wParam && + m_lastLParam == lParam ); + #ifdef __WXDEBUG__ - wxLogTrace(wxTraceMessages, "Processing %s", GetMessageName(message)); + wxLogTrace(wxTraceMessages, "Processing %s(%lx, %lx)", + wxGetMessageName(message), wParam, lParam); #endif // WXDEBUG HWND hWnd = (HWND)m_hWnd; @@ -978,10 +1031,19 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; } + case WM_MOVE: + { + wxMoveEvent event(wxPoint(LOWORD(lParam), HIWORD(lParam)), + m_windowId); + event.SetEventObject(this); + if ( !GetEventHandler()->ProcessEvent(event) ) + Default(); + } + break; + case WM_WINDOWPOSCHANGING: { - WINDOWPOS *pos = (WINDOWPOS *)lParam; - MSWOnWindowPosChanging((void *)pos); + MSWOnWindowPosChanging((void *)lParam); break; } @@ -1192,9 +1254,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return Default(); break; - case WM_KEYUP: - break; - case WM_CHAR: // Always an ASCII character { MSWOnChar((WORD)wParam, lParam, TRUE); @@ -1313,13 +1372,21 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return MSWDefWindowProc(message, wParam, lParam ); break; } + case WM_PALETTECHANGED: + { + return MSWOnPaletteChanged((WXHWND) (HWND) wParam); + break; + } + case WM_QUERYNEWPALETTE: + { + return MSWOnQueryNewPalette(); + break; + } case WM_ERASEBKGND: { // Prevents flicker when dragging if (IsIconic(hWnd)) return 1; - // EXPERIMENTAL -// return 1; if (!MSWOnEraseBkgnd((WXHDC) (HDC)wParam)) return 0; // Default(); MSWDefWindowProc(message, wParam, lParam ); else return 1; @@ -1380,19 +1447,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) case WM_GETDLGCODE: return MSWGetDlgCode(); -/* -#if HAVE_SOCKET - case WM_TIMER: - { - __ddeUnblock(hWnd, wParam); - break; - } - - case ASYNC_SELECT_MESSAGE: - return ddeWindowProc(hWnd,message,wParam,lParam); -#endif -*/ - default: return MSWDefWindowProc(message, wParam, lParam ); } @@ -1434,29 +1488,6 @@ void wxRemoveHandleAssociation(wxWindow *win) // (e.g. with MDI child windows) void wxWindow::MSWDestroyWindow(void) { -#if 0 - -#if WXDEBUG > 1 - wxDebugMsg("wxWindow::MSWDestroyWindow %d\n", handle); -#endif - MSWDetachWindowMenu(); -// SetWindowLong(handle, 0, (long)0); - HWND oldHandle = handle; - handle = NULL; - - ::DestroyWindow(oldHandle); - - // Menu is destroyed explicitly by wxMDIChild::DestroyWindow, - // or when Windows HWND is deleted if MDI parent or - // SDI frame. -/* - if (m_hMenu) - { - ::DestroyMenu(m_hMenu); - m_hMenu = 0; - } - */ -#endif } void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow *wx_win, const char *title, @@ -1520,24 +1551,20 @@ void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow if (!title) title = ""; - m_hWnd = (WXHWND) CreateWindowEx(extendedStyle, wclass, + m_hWnd = (WXHWND)CreateWindowEx(extendedStyle, wclass, title, style, x1, y1, width1, height1, -// hParent, NULL, wxGetInstance(), hParent, (HMENU)controlId, wxGetInstance(), NULL); - if (m_hWnd == 0) - { - char buf[300]; - sprintf(buf, "Can't create window of class %s! Weird.\nPossible Windows 3.x compatibility problem?", - wclass); - wxFatalError(buf, - "Fatal wxWindows Error"); + if ( !m_hWnd ) { + wxLogError("Can't create window of class %s!\n" + "Possible Windows 3.x compatibility problem?", wclass); } } + wxWndHook = NULL; wxWinHandleList->Append((long)m_hWnd, this); @@ -1588,8 +1615,8 @@ bool wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam) // So, since we don't know which hWnd or wxWindow originated the // WM_NOTIFY, we'll need to go through all the children of this window // trying out MSWNotify. - // This won't work now, though, because any number of controls - // could respond to the same generic messages :-( + // This won't work now, though, because any number of controls + // could respond to the same generic messages :-( /* This doesn't work for toolbars, but try for other controls first. */ @@ -1597,21 +1624,21 @@ bool wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam) HWND hWnd = (HWND)hdr->hwndFrom; wxWindow *win = wxFindWinFromHandle((WXHWND) hWnd); - if ( win ) - return win->MSWNotify(wParam, lParam); - else - { - // Rely on MSWNotify to check whether the message - // belongs to the window or not - wxNode *node = GetChildren()->First(); - while (node) - { - wxWindow *child = (wxWindow *)node->Data(); - if ( child->MSWNotify(wParam, lParam) ) - return TRUE; - node = node->Next(); - } - } + if ( win ) + return win->MSWNotify(wParam, lParam); + else + { + // Rely on MSWNotify to check whether the message + // belongs to the window or not + wxNode *node = GetChildren()->First(); + while (node) + { + wxWindow *child = (wxWindow *)node->Data(); + if ( child->MSWNotify(wParam, lParam) ) + return TRUE; + node = node->Next(); + } + } return FALSE; @@ -1637,7 +1664,7 @@ bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSE #endif wxActivateEvent event(wxEVT_ACTIVATE, ((state == WA_ACTIVE) || (state == WA_CLICKACTIVE)), - m_windowId); + m_windowId); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); return 0; @@ -1687,13 +1714,13 @@ void wxWindow::MSWOnDropFiles(WXWPARAM wParam) wxDebugMsg("wxWindow::MSWOnDropFiles %d\n", m_hWnd); #endif - HANDLE hFilesInfo = (HANDLE)wParam; + HDROP hFilesInfo = (HDROP) wParam; POINT dropPoint; DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); // Get the total number of files dropped WORD gwFilesDropped = (WORD)DragQueryFile ((HDROP)hFilesInfo, - (UINT)-1, + (UINT)-1, (LPSTR)0, (UINT)0); @@ -1781,7 +1808,7 @@ WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, #endif if (nCtlColor == CTLCOLOR_DLG) { - return OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); + return OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); } wxControl *item = (wxControl *)FindItemByHWND(pWnd, TRUE); @@ -1789,7 +1816,7 @@ WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, WXHBRUSH hBrush = 0; if ( item ) - hBrush = item->OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); + hBrush = item->OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); // I think that even for dialogs, we may need to call DefWindowProc (?) // Or maybe just rely on the usual default behaviour. @@ -1801,7 +1828,7 @@ WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, // Define for each class of dialog and control WXHBRUSH wxWindow::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) + WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { return (WXHBRUSH) MSWDefWindowProc(message, wParam, lParam); } @@ -1809,7 +1836,7 @@ WXHBRUSH wxWindow::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, bool wxWindow::MSWOnColorChange(WXHWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { wxSysColourChangedEvent event; - event.m_eventObject = this; + event.SetEventObject(this); // Check if app handles this. if (GetEventHandler()->ProcessEvent(event)) @@ -1819,6 +1846,27 @@ bool wxWindow::MSWOnColorChange(WXHWND hWnd, WXUINT message, WXWPARAM wParam, WX return 1; } +long wxWindow::MSWOnPaletteChanged(WXHWND hWndPalChange) +{ + wxPaletteChangedEvent event(GetId()); + event.SetEventObject(this); + event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange)); + GetEventHandler()->ProcessEvent(event); + return 0; +} + +long wxWindow::MSWOnQueryNewPalette() +{ + wxQueryNewPaletteEvent event(GetId()); + event.SetEventObject(this); + if (!GetEventHandler()->ProcessEvent(event) || !event.GetPaletteRealized()) + { + return (long) FALSE; + } + else + return (long) TRUE; +} + // Responds to colour changes: passes event on to children. void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) { @@ -1841,9 +1889,9 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { if ( m_oldWndProc ) - return ::CallWindowProc(CASTWNDPROC (FARPROC) m_oldWndProc, (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); + return ::CallWindowProc(CASTWNDPROC m_oldWndProc, (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); else - return ::DefWindowProc((HWND) GetHWND(), nMsg, wParam, lParam); + return ::DefWindowProc((HWND) GetHWND(), nMsg, wParam, lParam); } long wxWindow::Default() @@ -1854,7 +1902,7 @@ long wxWindow::Default() #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.", - GetMessageName(m_lastMsg)); + wxGetMessageName(m_lastMsg)); #endif // WXDEBUG return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); @@ -1876,7 +1924,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) // WM_GETDLGCODE: if the control wants it for itself, don't process it // (except for Ctrl-Tab combination which is always processed) - LONG lDlgCode; + LONG lDlgCode = 0; if ( bProcess && !bCtrlDown ) { lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); } @@ -1885,7 +1933,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) if ( bProcess ) { switch ( msg->wParam ) { case VK_TAB: - if ( lDlgCode & DLGC_WANTTAB ) + if ( lDlgCode & DLGC_WANTTAB ) // this is FALSE for Ctrl-Tab bProcess = FALSE; else bForward = !(::GetKeyState(VK_SHIFT) & 0x100); @@ -1893,7 +1941,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) case VK_UP: case VK_LEFT: - if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown ) + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) bProcess = FALSE; else bForward = FALSE; @@ -1901,7 +1949,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) case VK_DOWN: case VK_RIGHT: - if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown ) + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) bProcess = FALSE; else bForward = TRUE; @@ -1928,6 +1976,15 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) return FALSE; } +bool wxWindow::MSWTranslateMessage(WXMSG* pMsg) +{ + if (m_acceleratorTable.Ok() && + ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), (MSG *)pMsg)) + return TRUE; + else + return FALSE; +} + long wxWindow::MSWOnMDIActivate(long WXUNUSED(flag), WXHWND WXUNUSED(activate), WXHWND WXUNUSED(deactivate)) { #if WXDEBUG > 1 @@ -1957,6 +2014,19 @@ void wxWindow::MSWDetachWindowMenu(void) bool wxWindow::MSWOnPaint(void) { +#ifdef __WIN32__ + HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle + ::GetUpdateRgn((HWND) GetHWND(), hRegion, FALSE); + + m_updateRegion = wxRegion((WXHRGN) hRegion); +#else + RECT updateRect; + ::GetUpdateRect((HWND) GetHWND(), & updateRect, FALSE); + + m_updateRegion = wxRegion(updateRect.left, updateRect.top, + updateRect.right - updateRect.left, updateRect.bottom - updateRect.top); +#endif + wxPaintEvent event(m_windowId); event.SetEventObject(this); if (!GetEventHandler()->ProcessEvent(event)) @@ -1991,7 +2061,7 @@ void wxWindow::MSWOnWindowPosChanging(void *WXUNUSED(lpPos)) } // Deal with child commands from buttons etc. -bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) +bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) { #if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnCommand\n"); @@ -2023,27 +2093,11 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) } else { -#if WXDEBUG > 1 - wxDebugMsg("Could not find item!\n"); - char buf[100]; - wxDebugMsg("Item ids for this panel:\n"); - - wxNode *current = GetChildren()->First(); - while (current) - { - wxObject *obj = (wxObject *)current->Data() ; - if (obj->IsKindOf(CLASSINFO(wxControl))) - { - wxControl *item = (wxControl *)current->Data(); - sprintf(buf, " %d\n", (int)item->m_windowId); - wxDebugMsg(buf); - } - current = current->Next(); - } - wxYield(); -#endif - return FALSE; + wxWindow *win = wxFindWinFromHandle(control); + if (win) + return win->MSWCommand(cmd, id); } + return FALSE; } long wxWindow::MSWOnSysCommand(WXWPARAM wParam, WXLPARAM lParam) @@ -2397,7 +2451,7 @@ void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII) event.m_x = pt.x; event.m_y = pt.y; if (!GetEventHandler()->ProcessEvent(event)) - Default(); + Default(); } } @@ -2512,41 +2566,41 @@ void wxWindow::MSWOnVScroll(WXWORD wParam, WXWORD pos, WXHWND control) event.SetOrientation(wxVERTICAL); event.m_eventObject = this; - switch ( wParam ) - { - case SB_TOP: - event.m_eventType = wxEVT_SCROLL_TOP; - break; + switch ( wParam ) + { + case SB_TOP: + event.m_eventType = wxEVT_SCROLL_TOP; + break; - case SB_BOTTOM: - event.m_eventType = wxEVT_SCROLL_BOTTOM; - break; + case SB_BOTTOM: + event.m_eventType = wxEVT_SCROLL_BOTTOM; + break; - case SB_LINEUP: - event.m_eventType = wxEVT_SCROLL_LINEUP; - break; + case SB_LINEUP: + event.m_eventType = wxEVT_SCROLL_LINEUP; + break; - case SB_LINEDOWN: - event.m_eventType = wxEVT_SCROLL_LINEDOWN; - break; + case SB_LINEDOWN: + event.m_eventType = wxEVT_SCROLL_LINEDOWN; + break; - case SB_PAGEUP: + case SB_PAGEUP: event.m_eventType = wxEVT_SCROLL_PAGEUP; - break; + break; - case SB_PAGEDOWN: + case SB_PAGEDOWN: event.m_eventType = wxEVT_SCROLL_PAGEDOWN; - break; + break; case SB_THUMBTRACK: case SB_THUMBPOSITION: event.m_eventType = wxEVT_SCROLL_THUMBTRACK; - break; + break; - default: + default: return; break; - } + } if (!GetEventHandler()->ProcessEvent(event)) Default(); @@ -2557,53 +2611,60 @@ void wxWindow::MSWOnHScroll( WXWORD wParam, WXWORD pos, WXHWND control) if (control) { wxWindow *child = wxFindWinFromHandle(control); - if ( child ) + if ( child ) { child->MSWOnHScroll(wParam, pos, control); - return; + + return; + } } + else { + wxScrollEvent event; + event.SetPosition(pos); + event.SetOrientation(wxHORIZONTAL); + event.m_eventObject = this; - wxScrollEvent event; - event.SetPosition(pos); - event.SetOrientation(wxHORIZONTAL); - event.m_eventObject = this; - - switch ( wParam ) - { - case SB_TOP: - event.m_eventType = wxEVT_SCROLL_TOP; - break; - - case SB_BOTTOM: - event.m_eventType = wxEVT_SCROLL_BOTTOM; - break; - - case SB_LINEUP: - event.m_eventType = wxEVT_SCROLL_LINEUP; - break; - - case SB_LINEDOWN: - event.m_eventType = wxEVT_SCROLL_LINEDOWN; - break; - - case SB_PAGEUP: - event.m_eventType = wxEVT_SCROLL_PAGEUP; - break; - - case SB_PAGEDOWN: - event.m_eventType = wxEVT_SCROLL_PAGEDOWN; - break; + switch ( wParam ) + { + case SB_TOP: + event.m_eventType = wxEVT_SCROLL_TOP; + break; + + case SB_BOTTOM: + event.m_eventType = wxEVT_SCROLL_BOTTOM; + break; + + case SB_LINEUP: + event.m_eventType = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + event.m_eventType = wxEVT_SCROLL_LINEDOWN; + break; + + case SB_PAGEUP: + event.m_eventType = wxEVT_SCROLL_PAGEUP; + break; + + case SB_PAGEDOWN: + event.m_eventType = wxEVT_SCROLL_PAGEDOWN; + break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + event.m_eventType = wxEVT_SCROLL_THUMBTRACK; + break; + + default: + return; + } - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - event.m_eventType = wxEVT_SCROLL_THUMBTRACK; - break; + if ( GetEventHandler()->ProcessEvent(event) ) + return; + } - default: - return; - break; - } - if (!GetEventHandler()->ProcessEvent(event)) - Default(); + // call the default WM_HSCROLL handler: it's non trivial in some common + // controls (up-down control for example) + Default(); } void wxWindow::MSWOnShow(bool show, int status) @@ -2648,7 +2709,7 @@ void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font) // the_font->UseResource(); // the_font->RealizeResource(); if ((fnt=(HFONT) the_font->GetResourceHandle())) - was = SelectObject(dc,fnt) ; + was = (HFONT) SelectObject(dc,fnt) ; } GetTextMetrics(dc, &tm); if (the_font && fnt && was) @@ -2675,70 +2736,70 @@ int wxCharCodeMSWToWX(int keySym) { case VK_CANCEL: id = WXK_CANCEL; break; case VK_BACK: id = WXK_BACK; break; - case VK_TAB: id = WXK_TAB; break; - case VK_CLEAR: id = WXK_CLEAR; break; - case VK_RETURN: id = WXK_RETURN; break; - case VK_SHIFT: id = WXK_SHIFT; break; - case VK_CONTROL: id = WXK_CONTROL; break; - case VK_MENU : id = WXK_MENU; break; - case VK_PAUSE: id = WXK_PAUSE; break; - case VK_SPACE: id = WXK_SPACE; break; - case VK_ESCAPE: id = WXK_ESCAPE; break; - case VK_PRIOR: id = WXK_PRIOR; break; - case VK_NEXT : id = WXK_NEXT; break; - case VK_END: id = WXK_END; break; - case VK_HOME : id = WXK_HOME; break; - case VK_LEFT : id = WXK_LEFT; break; - case VK_UP: id = WXK_UP; break; - case VK_RIGHT: id = WXK_RIGHT; break; - case VK_DOWN : id = WXK_DOWN; break; - case VK_SELECT: id = WXK_SELECT; break; - case VK_PRINT: id = WXK_PRINT; break; - case VK_EXECUTE: id = WXK_EXECUTE; break; - case VK_INSERT: id = WXK_INSERT; break; - case VK_DELETE: id = WXK_DELETE; break; - case VK_HELP : id = WXK_HELP; break; - case VK_NUMPAD0: id = WXK_NUMPAD0; break; - case VK_NUMPAD1: id = WXK_NUMPAD1; break; - case VK_NUMPAD2: id = WXK_NUMPAD2; break; - case VK_NUMPAD3: id = WXK_NUMPAD3; break; - case VK_NUMPAD4: id = WXK_NUMPAD4; break; - case VK_NUMPAD5: id = WXK_NUMPAD5; break; - case VK_NUMPAD6: id = WXK_NUMPAD6; break; - case VK_NUMPAD7: id = WXK_NUMPAD7; break; - case VK_NUMPAD8: id = WXK_NUMPAD8; break; - case VK_NUMPAD9: id = WXK_NUMPAD9; break; - case VK_MULTIPLY: id = WXK_MULTIPLY; break; - case VK_ADD: id = WXK_ADD; break; - case VK_SUBTRACT: id = WXK_SUBTRACT; break; - case VK_DECIMAL: id = WXK_DECIMAL; break; - case VK_DIVIDE: id = WXK_DIVIDE; break; - case VK_F1: id = WXK_F1; break; - case VK_F2: id = WXK_F2; break; - case VK_F3: id = WXK_F3; break; - case VK_F4: id = WXK_F4; break; - case VK_F5: id = WXK_F5; break; - case VK_F6: id = WXK_F6; break; - case VK_F7: id = WXK_F7; break; - case VK_F8: id = WXK_F8; break; - case VK_F9: id = WXK_F9; break; - case VK_F10: id = WXK_F10; break; - case VK_F11: id = WXK_F11; break; - case VK_F12: id = WXK_F12; break; - case VK_F13: id = WXK_F13; break; - case VK_F14: id = WXK_F14; break; - case VK_F15: id = WXK_F15; break; - case VK_F16: id = WXK_F16; break; - case VK_F17: id = WXK_F17; break; - case VK_F18: id = WXK_F18; break; - case VK_F19: id = WXK_F19; break; - case VK_F20: id = WXK_F20; break; - case VK_F21: id = WXK_F21; break; - case VK_F22: id = WXK_F22; break; - case VK_F23: id = WXK_F23; break; - case VK_F24: id = WXK_F24; break; - case VK_NUMLOCK: id = WXK_NUMLOCK; break; - case VK_SCROLL: id = WXK_SCROLL; break; + case VK_TAB: id = WXK_TAB; break; + case VK_CLEAR: id = WXK_CLEAR; break; + case VK_RETURN: id = WXK_RETURN; break; + case VK_SHIFT: id = WXK_SHIFT; break; + case VK_CONTROL: id = WXK_CONTROL; break; + case VK_MENU : id = WXK_MENU; break; + case VK_PAUSE: id = WXK_PAUSE; break; + case VK_SPACE: id = WXK_SPACE; break; + case VK_ESCAPE: id = WXK_ESCAPE; break; + case VK_PRIOR: id = WXK_PRIOR; break; + case VK_NEXT : id = WXK_NEXT; break; + case VK_END: id = WXK_END; break; + case VK_HOME : id = WXK_HOME; break; + case VK_LEFT : id = WXK_LEFT; break; + case VK_UP: id = WXK_UP; break; + case VK_RIGHT: id = WXK_RIGHT; break; + case VK_DOWN : id = WXK_DOWN; break; + case VK_SELECT: id = WXK_SELECT; break; + case VK_PRINT: id = WXK_PRINT; break; + case VK_EXECUTE: id = WXK_EXECUTE; break; + case VK_INSERT: id = WXK_INSERT; break; + case VK_DELETE: id = WXK_DELETE; break; + case VK_HELP : id = WXK_HELP; break; + case VK_NUMPAD0: id = WXK_NUMPAD0; break; + case VK_NUMPAD1: id = WXK_NUMPAD1; break; + case VK_NUMPAD2: id = WXK_NUMPAD2; break; + case VK_NUMPAD3: id = WXK_NUMPAD3; break; + case VK_NUMPAD4: id = WXK_NUMPAD4; break; + case VK_NUMPAD5: id = WXK_NUMPAD5; break; + case VK_NUMPAD6: id = WXK_NUMPAD6; break; + case VK_NUMPAD7: id = WXK_NUMPAD7; break; + case VK_NUMPAD8: id = WXK_NUMPAD8; break; + case VK_NUMPAD9: id = WXK_NUMPAD9; break; + case VK_MULTIPLY: id = WXK_MULTIPLY; break; + case VK_ADD: id = WXK_ADD; break; + case VK_SUBTRACT: id = WXK_SUBTRACT; break; + case VK_DECIMAL: id = WXK_DECIMAL; break; + case VK_DIVIDE: id = WXK_DIVIDE; break; + case VK_F1: id = WXK_F1; break; + case VK_F2: id = WXK_F2; break; + case VK_F3: id = WXK_F3; break; + case VK_F4: id = WXK_F4; break; + case VK_F5: id = WXK_F5; break; + case VK_F6: id = WXK_F6; break; + case VK_F7: id = WXK_F7; break; + case VK_F8: id = WXK_F8; break; + case VK_F9: id = WXK_F9; break; + case VK_F10: id = WXK_F10; break; + case VK_F11: id = WXK_F11; break; + case VK_F12: id = WXK_F12; break; + case VK_F13: id = WXK_F13; break; + case VK_F14: id = WXK_F14; break; + case VK_F15: id = WXK_F15; break; + case VK_F16: id = WXK_F16; break; + case VK_F17: id = WXK_F17; break; + case VK_F18: id = WXK_F18; break; + case VK_F19: id = WXK_F19; break; + case VK_F20: id = WXK_F20; break; + case VK_F21: id = WXK_F21; break; + case VK_F22: id = WXK_F22; break; + case VK_F23: id = WXK_F23; break; + case VK_F24: id = WXK_F24; break; + case VK_NUMLOCK: id = WXK_NUMLOCK; break; + case VK_SCROLL: id = WXK_SCROLL; break; default: { return 0; @@ -2754,66 +2815,66 @@ int wxCharCodeWXToMSW(int id, bool *isVirtual) switch (id) { case WXK_CANCEL: keySym = VK_CANCEL; break; - case WXK_CLEAR: keySym = VK_CLEAR; break; - case WXK_SHIFT: keySym = VK_SHIFT; break; - case WXK_CONTROL: keySym = VK_CONTROL; break; - case WXK_MENU : keySym = VK_MENU; break; - case WXK_PAUSE: keySym = VK_PAUSE; break; - case WXK_PRIOR: keySym = VK_PRIOR; break; - case WXK_NEXT : keySym = VK_NEXT; break; - case WXK_END: keySym = VK_END; break; - case WXK_HOME : keySym = VK_HOME; break; - case WXK_LEFT : keySym = VK_LEFT; break; - case WXK_UP: keySym = VK_UP; break; - case WXK_RIGHT: keySym = VK_RIGHT; break; - case WXK_DOWN : keySym = VK_DOWN; break; - case WXK_SELECT: keySym = VK_SELECT; break; - case WXK_PRINT: keySym = VK_PRINT; break; - case WXK_EXECUTE: keySym = VK_EXECUTE; break; - case WXK_INSERT: keySym = VK_INSERT; break; - case WXK_DELETE: keySym = VK_DELETE; break; - case WXK_HELP : keySym = VK_HELP; break; - case WXK_NUMPAD0: keySym = VK_NUMPAD0; break; - case WXK_NUMPAD1: keySym = VK_NUMPAD1; break; - case WXK_NUMPAD2: keySym = VK_NUMPAD2; break; - case WXK_NUMPAD3: keySym = VK_NUMPAD3; break; - case WXK_NUMPAD4: keySym = VK_NUMPAD4; break; - case WXK_NUMPAD5: keySym = VK_NUMPAD5; break; - case WXK_NUMPAD6: keySym = VK_NUMPAD6; break; - case WXK_NUMPAD7: keySym = VK_NUMPAD7; break; - case WXK_NUMPAD8: keySym = VK_NUMPAD8; break; - case WXK_NUMPAD9: keySym = VK_NUMPAD9; break; - case WXK_MULTIPLY: keySym = VK_MULTIPLY; break; - case WXK_ADD: keySym = VK_ADD; break; - case WXK_SUBTRACT: keySym = VK_SUBTRACT; break; - case WXK_DECIMAL: keySym = VK_DECIMAL; break; - case WXK_DIVIDE: keySym = VK_DIVIDE; break; - case WXK_F1: keySym = VK_F1; break; - case WXK_F2: keySym = VK_F2; break; - case WXK_F3: keySym = VK_F3; break; - case WXK_F4: keySym = VK_F4; break; - case WXK_F5: keySym = VK_F5; break; - case WXK_F6: keySym = VK_F6; break; - case WXK_F7: keySym = VK_F7; break; - case WXK_F8: keySym = VK_F8; break; - case WXK_F9: keySym = VK_F9; break; - case WXK_F10: keySym = VK_F10; break; - case WXK_F11: keySym = VK_F11; break; - case WXK_F12: keySym = VK_F12; break; - case WXK_F13: keySym = VK_F13; break; - case WXK_F14: keySym = VK_F14; break; - case WXK_F15: keySym = VK_F15; break; - case WXK_F16: keySym = VK_F16; break; - case WXK_F17: keySym = VK_F17; break; - case WXK_F18: keySym = VK_F18; break; - case WXK_F19: keySym = VK_F19; break; - case WXK_F20: keySym = VK_F20; break; - case WXK_F21: keySym = VK_F21; break; - case WXK_F22: keySym = VK_F22; break; - case WXK_F23: keySym = VK_F23; break; - case WXK_F24: keySym = VK_F24; break; - case WXK_NUMLOCK: keySym = VK_NUMLOCK; break; - case WXK_SCROLL: keySym = VK_SCROLL; break; + case WXK_CLEAR: keySym = VK_CLEAR; break; + case WXK_SHIFT: keySym = VK_SHIFT; break; + case WXK_CONTROL: keySym = VK_CONTROL; break; + case WXK_MENU : keySym = VK_MENU; break; + case WXK_PAUSE: keySym = VK_PAUSE; break; + case WXK_PRIOR: keySym = VK_PRIOR; break; + case WXK_NEXT : keySym = VK_NEXT; break; + case WXK_END: keySym = VK_END; break; + case WXK_HOME : keySym = VK_HOME; break; + case WXK_LEFT : keySym = VK_LEFT; break; + case WXK_UP: keySym = VK_UP; break; + case WXK_RIGHT: keySym = VK_RIGHT; break; + case WXK_DOWN : keySym = VK_DOWN; break; + case WXK_SELECT: keySym = VK_SELECT; break; + case WXK_PRINT: keySym = VK_PRINT; break; + case WXK_EXECUTE: keySym = VK_EXECUTE; break; + case WXK_INSERT: keySym = VK_INSERT; break; + case WXK_DELETE: keySym = VK_DELETE; break; + case WXK_HELP : keySym = VK_HELP; break; + case WXK_NUMPAD0: keySym = VK_NUMPAD0; break; + case WXK_NUMPAD1: keySym = VK_NUMPAD1; break; + case WXK_NUMPAD2: keySym = VK_NUMPAD2; break; + case WXK_NUMPAD3: keySym = VK_NUMPAD3; break; + case WXK_NUMPAD4: keySym = VK_NUMPAD4; break; + case WXK_NUMPAD5: keySym = VK_NUMPAD5; break; + case WXK_NUMPAD6: keySym = VK_NUMPAD6; break; + case WXK_NUMPAD7: keySym = VK_NUMPAD7; break; + case WXK_NUMPAD8: keySym = VK_NUMPAD8; break; + case WXK_NUMPAD9: keySym = VK_NUMPAD9; break; + case WXK_MULTIPLY: keySym = VK_MULTIPLY; break; + case WXK_ADD: keySym = VK_ADD; break; + case WXK_SUBTRACT: keySym = VK_SUBTRACT; break; + case WXK_DECIMAL: keySym = VK_DECIMAL; break; + case WXK_DIVIDE: keySym = VK_DIVIDE; break; + case WXK_F1: keySym = VK_F1; break; + case WXK_F2: keySym = VK_F2; break; + case WXK_F3: keySym = VK_F3; break; + case WXK_F4: keySym = VK_F4; break; + case WXK_F5: keySym = VK_F5; break; + case WXK_F6: keySym = VK_F6; break; + case WXK_F7: keySym = VK_F7; break; + case WXK_F8: keySym = VK_F8; break; + case WXK_F9: keySym = VK_F9; break; + case WXK_F10: keySym = VK_F10; break; + case WXK_F11: keySym = VK_F11; break; + case WXK_F12: keySym = VK_F12; break; + case WXK_F13: keySym = VK_F13; break; + case WXK_F14: keySym = VK_F14; break; + case WXK_F15: keySym = VK_F15; break; + case WXK_F16: keySym = VK_F16; break; + case WXK_F17: keySym = VK_F17; break; + case WXK_F18: keySym = VK_F18; break; + case WXK_F19: keySym = VK_F19; break; + case WXK_F20: keySym = VK_F20; break; + case WXK_F21: keySym = VK_F21; break; + case WXK_F22: keySym = VK_F22; break; + case WXK_F23: keySym = VK_F23; break; + case WXK_F24: keySym = VK_F24; break; + case WXK_NUMLOCK: keySym = VK_NUMLOCK; break; + case WXK_SCROLL: keySym = VK_SCROLL; break; default: { *isVirtual = FALSE; @@ -2867,93 +2928,6 @@ void wxWindow::GetCaretPos(int *x, int *y) const *y = point.y; } -/* - * Update iterator. Use from within OnPaint. - */ - -static RECT gs_UpdateRect; - -wxUpdateIterator::wxUpdateIterator(wxWindow* wnd) -{ - current = 0; //start somewhere... -#if defined(__WIN32__) && !defined(__win32s__) - rlist = NULL; //make sure I don't free randomly - int len = GetRegionData((HRGN) wnd->m_updateRgn,0,NULL); //Get buffer size - if (len) - { - rlist = (WXRGNDATA *) (RGNDATA *)new char[len]; - GetRegionData((HRGN) wnd->m_updateRgn,len, (RGNDATA *)rlist); - rp = (void *)(RECT*) ((RGNDATA *)rlist)->Buffer; - rects = ((RGNDATA *)rlist)->rdh.nCount; - } - else -#endif - { - gs_UpdateRect.left = wnd->m_updateRect.x; - gs_UpdateRect.top = wnd->m_updateRect.y; - gs_UpdateRect.right = wnd->m_updateRect.x + wnd->m_updateRect.width; - gs_UpdateRect.bottom = wnd->m_updateRect.y + wnd->m_updateRect.height; - rects = 1; - rp = (void *)&gs_UpdateRect; //Only one available in Win16,32s - } -} - -wxUpdateIterator::~wxUpdateIterator(void) -{ -#ifdef __WIN32__ -#ifndef __win32s__ - if (rlist) delete (RGNDATA *) rlist; -#endif -#endif -} - -wxUpdateIterator::operator int (void) -{ - if (current < rects) - { - return TRUE; - } - else - { - return FALSE; - } -} - -wxUpdateIterator* wxUpdateIterator::operator ++(int) -{ - current++; - return this; -} - -void wxUpdateIterator::GetRect(wxRect *rect) -{ - RECT *mswRect = ((RECT *)rp)+current; //ought to error check this... - rect->x = mswRect->left; - rect->y = mswRect->top; - rect->width = mswRect->right - mswRect->left; - rect->height = mswRect->bottom - mswRect->top; -} - -int wxUpdateIterator::GetX() -{ - return ((RECT*)rp)[current].left; -} - -int wxUpdateIterator::GetY() -{ - return ((RECT *)rp)[current].top; -} - -int wxUpdateIterator::GetW() -{ - return ((RECT *)rp)[current].right-GetX(); -} - -int wxUpdateIterator::GetH() -{ - return ((RECT *)rp)[current].bottom-GetY(); -} - wxWindow *wxGetActiveWindow(void) { HWND hWnd = GetActiveWindow(); @@ -3012,17 +2986,17 @@ int APIENTRY _EXPORT /* end Albert's fix for control and shift key 26.5 */ event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */ - wxWindow *win = wxGetActiveWindow(); - if (win) - { + wxWindow *win = wxGetActiveWindow(); + if (win) + { if (win->GetEventHandler()->ProcessEvent(event)) - return 1; - } - else - { - if ( wxTheApp && wxTheApp->ProcessEvent(event) ) - return 1; - } + return 1; + } + else + { + if ( wxTheApp && wxTheApp->ProcessEvent(event) ) + return 1; + } } } return (int)CallNextHookEx(wxTheKeyboardHook, nCode, wParam, lParam); @@ -3070,58 +3044,44 @@ void wxWindow::OnPaint(void) void wxWindow::WarpPointer (int x_pos, int y_pos) { - // Move the pointer to (x_pos,y_pos) coordinates. They are expressed in - // pixel coordinates, relatives to the canvas -- So, we first need to - // substract origin of the window, then convert to screen position + // Move the pointer to (x_pos,y_pos) coordinates. They are expressed in + // pixel coordinates, relatives to the canvas -- So, we first need to + // substract origin of the window, then convert to screen position - int x = x_pos; int y = y_pos; -/* Leave this to the app to decide (and/or wxScrolledWindow) - x -= m_xScrollPosition * m_xScrollPixelsPerLine; - y -= m_yScrollPosition * m_yScrollPixelsPerLine; -*/ - RECT rect; - GetWindowRect ((HWND) GetHWND(), &rect); + int x = x_pos; int y = y_pos; + RECT rect; + GetWindowRect ((HWND) GetHWND(), &rect); - x += rect.left; - y += rect.top; + x += rect.left; + y += rect.top; - SetCursorPos (x, y); + SetCursorPos (x, y); } void wxWindow::MSWDeviceToLogical (float *x, float *y) const { - // TODO - // Do we have a SetUserScale in wxWindow too, so we can - // get mouse events scaled? -/* - if (m_windowDC) - { - *x = m_windowDC->DeviceToLogicalX ((int) *x); - *y = m_windowDC->DeviceToLogicalY ((int) *y); - } -*/ } bool wxWindow::MSWOnEraseBkgnd (WXHDC pDC) { wxDC dc ; - dc.SetHDC(pDC); - dc.SetWindow(this); - dc.BeginDrawing(); + dc.SetHDC(pDC); + dc.SetWindow(this); + dc.BeginDrawing(); wxEraseEvent event(m_windowId, &dc); event.m_eventObject = this; if (!GetEventHandler()->ProcessEvent(event)) { - dc.EndDrawing(); - dc.SelectOldObjects(pDC); + dc.EndDrawing(); + dc.SelectOldObjects(pDC); return FALSE; } else { - dc.EndDrawing(); - dc.SelectOldObjects(pDC); + dc.EndDrawing(); + dc.SelectOldObjects(pDC); } dc.SetHDC((WXHDC) NULL); @@ -3164,16 +3124,16 @@ void wxWindow::SetScrollRange(int orient, int range, bool refresh) int pageSize = GetScrollPage(orient); if ( pageSize > 1 && range > 0) { - range1 += (pageSize - 1); + range1 += (pageSize - 1); } SCROLLINFO info; int dir; if (orient == wxHORIZONTAL) { - dir = SB_HORZ; + dir = SB_HORZ; } else { - dir = SB_VERT; + dir = SB_VERT; } info.cbSize = sizeof(SCROLLINFO); @@ -3206,10 +3166,10 @@ void wxWindow::SetScrollPage(int orient, int page, bool refresh) int dir; if (orient == wxHORIZONTAL) { - dir = SB_HORZ; + dir = SB_HORZ; m_xThumbSize = page; } else { - dir = SB_VERT; + dir = SB_VERT; m_yThumbSize = page; } @@ -3252,7 +3212,7 @@ int wxWindow::OldGetScrollRange(int orient) const int pageSize = GetScrollPage(orient); if ( pageSize > 1 ) { - maxPos -= (pageSize - 1); + maxPos -= (pageSize - 1); } #endif return maxPos; @@ -3311,7 +3271,7 @@ int wxWindow::GetScrollRange(int orient) const int pageSize = GetScrollPage(orient); if ( pageSize > 1 ) { - maxPos -= (pageSize - 1); + maxPos -= (pageSize - 1); } // October 10th: new range concept. maxPos += pageSize; @@ -3338,9 +3298,9 @@ void wxWindow::SetScrollPos(int orient, int pos, bool refresh) int dir; if (orient == wxHORIZONTAL) { - dir = SB_HORZ; + dir = SB_HORZ; } else { - dir = SB_VERT; + dir = SB_VERT; } info.cbSize = sizeof(SCROLLINFO); @@ -3387,16 +3347,16 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, int pageSize = thumbVisible; if ( pageSize > 1 && range > 0) { - range1 += (pageSize - 1); + range1 += (pageSize - 1); } SCROLLINFO info; int dir; if (orient == wxHORIZONTAL) { - dir = SB_HORZ; + dir = SB_HORZ; } else { - dir = SB_VERT; + dir = SB_VERT; } info.cbSize = sizeof(SCROLLINFO); @@ -3432,63 +3392,31 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, void wxWindow::ScrollWindow(int dx, int dy, const wxRectangle *rect) { - RECT rect2; - if ( rect ) - { - rect2.left = rect->x; - rect2.top = rect->y; - rect2.right = rect->x + rect->width; - rect2.bottom = rect->y + rect->height; - } - - if ( rect ) - ::ScrollWindow((HWND) GetHWND(), dx, dy, &rect2, NULL); - else - ::ScrollWindow((HWND) GetHWND(), dx, dy, NULL, NULL); -} - -void wxWindow::OnSize(wxSizeEvent& event) -{ - Default(); -#if USE_CONSTRAINTS - if (GetAutoLayout()) - Layout(); -#endif -} - -/* -void wxWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const -{ - *xx = x; - *yy = y; -} + RECT rect2; + if ( rect ) + { + rect2.left = rect->x; + rect2.top = rect->y; + rect2.right = rect->x + rect->width; + rect2.bottom = rect->y + rect->height; + } -void wxWindow::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const -{ - *xx = x; - *yy = y; + if ( rect ) + ::ScrollWindow((HWND) GetHWND(), dx, dy, &rect2, NULL); + else + ::ScrollWindow((HWND) GetHWND(), dx, dy, NULL, NULL); } -*/ void wxWindow::SetFont(const wxFont& font) { - // Decrement the usage count of the old label font - // (we may be able to free it up) -// if (GetFont()->Ok()) -// GetFont()->ReleaseResource(); - m_windowFont = font; if (!m_windowFont.Ok()) - return; - -// m_windowFont.UseResource(); + return; HWND hWnd = (HWND) GetHWND(); if (hWnd != 0) { -// m_windowFont.RealizeResource(); - if (m_windowFont.GetResourceHandle()) SendMessage(hWnd, WM_SETFONT, (WPARAM)m_windowFont.GetResourceHandle(),TRUE); @@ -3497,6 +3425,8 @@ void wxWindow::SetFont(const wxFont& font) void wxWindow::SubclassWin(WXHWND hWnd) { + wxASSERT_MSG( !m_oldWndProc, "subclassing window twice?" ); + wxAssociateWinWithHandle((HWND)hWnd, this); m_oldWndProc = (WXFARPROC) GetWindowLong((HWND) hWnd, GWL_WNDPROC); @@ -3505,38 +3435,38 @@ void wxWindow::SubclassWin(WXHWND hWnd) void wxWindow::UnsubclassWin(void) { - wxRemoveHandleAssociation(this); + wxRemoveHandleAssociation(this); // Restore old Window proc if ((HWND) GetHWND()) { FARPROC farProc = (FARPROC) GetWindowLong((HWND) GetHWND(), GWL_WNDPROC); if ((m_oldWndProc != 0) && (farProc != (FARPROC) m_oldWndProc)) - { + { SetWindowLong((HWND) GetHWND(), GWL_WNDPROC, (LONG) m_oldWndProc); - m_oldWndProc = 0; - } + m_oldWndProc = 0; + } } } // Make a Windows extended style from the given wxWindows window style WXDWORD wxWindow::MakeExtendedStyle(long style, bool eliminateBorders) { - WXDWORD exStyle = 0; - if ( style & wxTRANSPARENT_WINDOW ) - exStyle |= WS_EX_TRANSPARENT ; + WXDWORD exStyle = 0; + if ( style & wxTRANSPARENT_WINDOW ) + exStyle |= WS_EX_TRANSPARENT ; if ( !eliminateBorders ) { - if ( style & wxSUNKEN_BORDER ) - exStyle |= WS_EX_CLIENTEDGE ; - if ( style & wxDOUBLE_BORDER ) - exStyle |= WS_EX_DLGMODALFRAME ; + if ( style & wxSUNKEN_BORDER ) + exStyle |= WS_EX_CLIENTEDGE ; + if ( style & wxDOUBLE_BORDER ) + exStyle |= WS_EX_DLGMODALFRAME ; #if defined(__WIN95__) - if ( style & wxRAISED_BORDER ) - exStyle |= WS_EX_WINDOWEDGE ; - if ( style & wxSTATIC_BORDER ) - exStyle |= WS_EX_STATICEDGE ; + if ( style & wxRAISED_BORDER ) + exStyle |= WS_EX_WINDOWEDGE ; + if ( style & wxSTATIC_BORDER ) + exStyle |= WS_EX_STATICEDGE ; #endif } return exStyle; @@ -3551,8 +3481,8 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) // unless specifically requested (dealt with in MakeExtendedStyle) if ( !GetParent() || !IsKindOf(CLASSINFO(wxControl)) || (m_windowStyle & wxNO_BORDER) ) { - *want3D = FALSE; - return MakeExtendedStyle(m_windowStyle, FALSE); + *want3D = FALSE; + return MakeExtendedStyle(m_windowStyle, FALSE); } // Determine whether we should be using 3D effects or not. @@ -3564,26 +3494,26 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) // 2) If the parent is being drawn with user colours, or simple border specified, // switch effects off. TODO: replace wxUSER_COLOURS with wxNO_3D if (GetParent() && (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) || (m_windowStyle & wxSIMPLE_BORDER)) - *want3D = FALSE; + *want3D = FALSE; // 3) Control can override this global setting by defining // a border style, e.g. wxSUNKEN_BORDER if (m_windowStyle & wxSUNKEN_BORDER ) - *want3D = TRUE; + *want3D = TRUE; // 4) If it's a special border, CTL3D can't cope so we want a native border if ( (m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER) || (m_windowStyle & wxSTATIC_BORDER) ) { - *want3D = TRUE; - nativeBorder = TRUE; + *want3D = TRUE; + nativeBorder = TRUE; } // 5) If this isn't a Win95 app, and we are using CTL3D, remove border // effects from extended style #if CTL3D if ( *want3D ) - nativeBorder = FALSE; + nativeBorder = FALSE; #endif DWORD exStyle = MakeExtendedStyle(m_windowStyle, !nativeBorder); @@ -3594,7 +3524,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) #if defined(__WIN95__) && !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 ; + exStyle |= defaultBorderStyle; // WS_EX_CLIENTEDGE ; #endif return exStyle; @@ -3623,12 +3553,12 @@ void wxWindow::OnChar(wxKeyEvent& event) void wxWindow::OnPaint(wxPaintEvent& event) { - Default(); + Default(); } bool wxWindow::IsEnabled(void) const { - return (::IsWindowEnabled((HWND) GetHWND()) != 0); + return (::IsWindowEnabled((HWND) GetHWND()) != 0); } // Dialog support: override these and call @@ -3642,54 +3572,54 @@ bool wxWindow::IsEnabled(void) const // it's an application error (pops up a dialog) bool wxWindow::TransferDataToWindow(void) { - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *child = (wxWindow *)node->Data(); - if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ - !child->GetValidator()->TransferToWindow() ) - { - wxMessageBox("Application Error", "Could not transfer data to window", wxOK|wxICON_EXCLAMATION); - return FALSE; - } + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *child = (wxWindow *)node->Data(); + if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ + !child->GetValidator()->TransferToWindow() ) + { + wxMessageBox("Application Error", "Could not transfer data to window", wxOK|wxICON_EXCLAMATION); + return FALSE; + } - node = node->Next(); - } - return TRUE; + node = node->Next(); + } + return TRUE; } // Transfer values from controls. If returns FALSE, // validation failed: don't quit bool wxWindow::TransferDataFromWindow(void) { - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *child = (wxWindow *)node->Data(); - if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->TransferFromWindow() ) - { - return FALSE; - } + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *child = (wxWindow *)node->Data(); + if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->TransferFromWindow() ) + { + return FALSE; + } - node = node->Next(); - } - return TRUE; + node = node->Next(); + } + return TRUE; } bool wxWindow::Validate(void) { - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *child = (wxWindow *)node->Data(); - if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->Validate(this) ) - { - return FALSE; - } + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *child = (wxWindow *)node->Data(); + if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->Validate(this) ) + { + return FALSE; + } - node = node->Next(); - } - return TRUE; + node = node->Next(); + } + return TRUE; } // Get the window with the focus @@ -3724,8 +3654,8 @@ void wxWindow::DestroyChildren(void) wxWindow *child; if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) { delete child; - if ( GetChildren()->Member(child) ) - delete node; + if ( GetChildren()->Member(child) ) + delete node; } } /* while */ } @@ -3754,7 +3684,7 @@ void wxWindow::MakeModal(bool modal) void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event) { if (GetEventHandler()->ProcessEvent(event) ) - return; + return; if (m_windowParent) m_windowParent->GetEventHandler()->OnCommand(win, event); } @@ -4029,10 +3959,10 @@ void wxWindow::SetConstraintSizes(bool recurse) char *windowClass = this->GetClassInfo()->GetClassName(); wxString winName; - if (GetName() == "") - winName = "unnamed"; - else - winName = GetName(); + if (GetName() == "") + winName = "unnamed"; + else + winName = GetName(); wxDebugMsg("Constraint(s) not satisfied for window of type %s, name %s:\n", (const char *)windowClass, (const char *)winName); if (!constr->left.GetDone()) wxDebugMsg(" unsatisfied 'left' constraint.\n"); @@ -4063,7 +3993,7 @@ void wxWindow::SetConstraintSizes(bool recurse) void wxWindow::TransformSizerToActual(int *x, int *y) const { if (!m_sizerParent || m_sizerParent->IsKindOf(CLASSINFO(wxDialog)) || - m_sizerParent->IsKindOf(CLASSINFO(wxFrame)) ) + m_sizerParent->IsKindOf(CLASSINFO(wxFrame)) ) return; int xp, yp; @@ -4075,16 +4005,16 @@ void wxWindow::TransformSizerToActual(int *x, int *y) const void wxWindow::SizerSetSize(int x, int y, int w, int h) { - int xx = x; - int yy = y; + int xx = x; + int yy = y; TransformSizerToActual(&xx, &yy); SetSize(xx, yy, w, h); } void wxWindow::SizerMove(int x, int y) { - int xx = x; - int yy = y; + int xx = x; + int yy = y; TransformSizerToActual(&xx, &yy); Move(xx, yy); } @@ -4258,7 +4188,7 @@ void wxWindow::OnDefaultAction(wxControl *initiatingItem) void wxWindow::Clear(void) { - wxClientDC dc(this); + wxClientDC dc(this); wxBrush brush(GetBackgroundColour(), wxSOLID); dc.SetBackground(brush); dc.Clear(); @@ -4267,68 +4197,68 @@ void wxWindow::Clear(void) // Fits the panel around the items void wxWindow::Fit(void) { - int maxX = 0; - int maxY = 0; - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *win = (wxWindow *)node->Data(); - int wx, wy, ww, wh; - win->GetPosition(&wx, &wy); - win->GetSize(&ww, &wh); - if ( wx + ww > maxX ) - maxX = wx + ww; - if ( wy + wh > maxY ) - maxY = wy + wh; - - node = node->Next(); - } - SetClientSize(maxX + 5, maxY + 5); + int maxX = 0; + int maxY = 0; + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *win = (wxWindow *)node->Data(); + int wx, wy, ww, wh; + win->GetPosition(&wx, &wy); + win->GetSize(&ww, &wh); + if ( wx + ww > maxX ) + maxX = wx + ww; + if ( wy + wh > maxY ) + maxY = wy + wh; + + node = node->Next(); + } + SetClientSize(maxX + 5, maxY + 5); } void wxWindow::SetValidator(const wxValidator& validator) { - if ( m_windowValidator ) - delete m_windowValidator; - m_windowValidator = validator.Clone(); + if ( m_windowValidator ) + delete m_windowValidator; + m_windowValidator = validator.Clone(); - if ( m_windowValidator ) - m_windowValidator->SetWindow(this) ; + if ( m_windowValidator ) + m_windowValidator->SetWindow(this) ; } // Find a window by id or name wxWindow *wxWindow::FindWindow(long id) { - if ( GetId() == id) - return this; + if ( GetId() == id) + return this; - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *child = (wxWindow *)node->Data(); - wxWindow *found = child->FindWindow(id); - if ( found ) - return found; - node = node->Next(); - } - return NULL; + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *child = (wxWindow *)node->Data(); + wxWindow *found = child->FindWindow(id); + if ( found ) + return found; + node = node->Next(); + } + return NULL; } wxWindow *wxWindow::FindWindow(const wxString& name) { - if ( GetName() == name) - return this; + if ( GetName() == name) + return this; - wxNode *node = GetChildren()->First(); - while ( node ) - { - wxWindow *child = (wxWindow *)node->Data(); - wxWindow *found = child->FindWindow(name); - if ( found ) - return found; - node = node->Next(); - } - return NULL; + wxNode *node = GetChildren()->First(); + while ( node ) + { + wxWindow *child = (wxWindow *)node->Data(); + wxWindow *found = child->FindWindow(name); + if ( found ) + return found; + node = node->Next(); + } + return NULL; } /* TODO @@ -4353,9 +4283,9 @@ void wxWindow::OnChar(wxKeyEvent& event) ViewStart(&start_x, &start_y); // Bugfix begin if (vert_units) - y_pages = (int)(v_height/vert_units) - y_page; + y_pages = (int)(v_height/vert_units) - y_page; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ int y = 0; #else int y = y_page-1; @@ -4363,72 +4293,72 @@ void wxWindow::OnChar(wxKeyEvent& event) // Bugfix End switch (event.keyCode) { - case WXK_PRIOR: - { - // BugFix Begin - if (y_page > 0) - { - if (start_y - y_page > 0) - Scroll(start_x, start_y - y_page); - else - Scroll(start_x, 0); - } - // Bugfix End - break; - } - case WXK_NEXT: - { - // Bugfix Begin - if ((y_page > 0) && (start_y <= y_pages-y-1)) - { - if (y_pages + y < start_y + y_page) - Scroll(start_x, y_pages + y); - else - Scroll(start_x, start_y + y_page); - } - // Bugfix End - break; - } - case WXK_UP: - { - if ((y_page > 0) && (start_y >= 1)) - Scroll(start_x, start_y - 1); - break; - } - case WXK_DOWN: - { - // Bugfix Begin - if ((y_page > 0) && (start_y <= y_pages-y-1)) - // Bugfix End - { - Scroll(start_x, start_y + 1); - } - break; - } - case WXK_LEFT: - { - if ((x_page > 0) && (start_x >= 1)) - Scroll(start_x - 1, start_y); - break; - } - case WXK_RIGHT: - { - if (x_page > 0) - Scroll(start_x + 1, start_y); - break; - } - case WXK_HOME: - { - Scroll(0, 0); - break; - } - // This is new - case WXK_END: - { - Scroll(start_x, y_pages+y); - break; - } - // end + case WXK_PRIOR: + { + // BugFix Begin + if (y_page > 0) + { + if (start_y - y_page > 0) + Scroll(start_x, start_y - y_page); + else + Scroll(start_x, 0); + } + // Bugfix End + break; + } + case WXK_NEXT: + { + // Bugfix Begin + if ((y_page > 0) && (start_y <= y_pages-y-1)) + { + if (y_pages + y < start_y + y_page) + Scroll(start_x, y_pages + y); + else + Scroll(start_x, start_y + y_page); + } + // Bugfix End + break; + } + case WXK_UP: + { + if ((y_page > 0) && (start_y >= 1)) + Scroll(start_x, start_y - 1); + break; + } + case WXK_DOWN: + { + // Bugfix Begin + if ((y_page > 0) && (start_y <= y_pages-y-1)) + // Bugfix End + { + Scroll(start_x, start_y + 1); + } + break; + } + case WXK_LEFT: + { + if ((x_page > 0) && (start_x >= 1)) + Scroll(start_x - 1, start_y); + break; + } + case WXK_RIGHT: + { + if (x_page > 0) + Scroll(start_x + 1, start_y); + break; + } + case WXK_HOME: + { + Scroll(0, 0); + break; + } + // This is new + case WXK_END: + { + Scroll(start_x, y_pages+y); + break; + } + // end } } */ @@ -4436,46 +4366,8 @@ void wxWindow::OnChar(wxKeyEvent& event) // Setup background and foreground colours correctly void wxWindow::SetupColours(void) { - if (GetParent()) - SetBackgroundColour(GetParent()->GetBackgroundColour()); -} - -// Do Update UI processing for child controls - -// TODO: should this be implemented for the child window rather -// than the parent? Then you can override it e.g. for wxCheckBox -// to do the Right Thing rather than having to assume a fixed number -// of control classes. - -void wxWindow::UpdateWindowUI(void) -{ - wxWindowID id = GetId(); - if (id > 0) - { - wxUpdateUIEvent event(id); - event.m_eventObject = this; - - if (this->GetEventHandler()->ProcessEvent(event)) - { - if (event.GetSetEnabled()) - this->Enable(event.GetEnabled()); - - if (event.GetSetText() && this->IsKindOf(CLASSINFO(wxControl))) - ((wxControl*)this)->SetLabel(event.GetText()); - - if (this->IsKindOf(CLASSINFO(wxCheckBox))) - { - if (event.GetSetChecked()) - ((wxCheckBox *) this)->SetValue(event.GetChecked()); - } - else if (this->IsKindOf(CLASSINFO(wxRadioButton))) - { - if (event.GetSetChecked()) - ((wxRadioButton *) this)->SetValue(event.GetChecked()); - } - } - } - + if (GetParent()) + SetBackgroundColour(GetParent()->GetBackgroundColour()); } void wxWindow::OnIdle(wxIdleEvent& event) @@ -4489,10 +4381,21 @@ void wxWindow::OnIdle(wxIdleEvent& event) { // Generate a LEAVE event m_mouseInWindow = FALSE; - MSWOnMouseLeave(pt.x, pt.y, 0); + + int state; + if (::GetKeyState(VK_SHIFT) != 0) + state |= MK_SHIFT; + if (::GetKeyState(VK_CONTROL) != 0) + state |= MK_CONTROL; + + // Unfortunately the mouse button and keyboard state may have changed + // by the time the OnIdle function is called, so 'state' may be + // meaningless. + + MSWOnMouseLeave(pt.x, pt.y, state); } } - UpdateWindowUI(); + UpdateWindowUI(); } // Raise the window to the top of the Z order @@ -4518,8 +4421,29 @@ bool wxWindow::AcceptsFocus() const return IsShown() && IsEnabled(); } +// Update region access +wxRegion wxWindow::GetUpdateRegion() const +{ + return m_updateRegion; +} + +bool wxWindow::IsExposed(int x, int y, int w, int h) const +{ + return (m_updateRegion.Contains(x, y, w, h) != wxOutRegion); +} + +bool wxWindow::IsExposed(const wxPoint& pt) const +{ + return (m_updateRegion.Contains(pt) != wxOutRegion); +} + +bool wxWindow::IsExposed(const wxRect& rect) const +{ + return (m_updateRegion.Contains(rect) != wxOutRegion); +} + #ifdef __WXDEBUG__ -static const char *GetMessageName(int message) +const char *wxGetMessageName(int message) { switch ( message ) { case 0x0000: return "WM_NULL"; @@ -4575,6 +4499,25 @@ static const char *GetMessageName(int message) case 0x0046: return "WM_WINDOWPOSCHANGING"; case 0x0047: return "WM_WINDOWPOSCHANGED"; case 0x0048: return "WM_POWER"; + +#ifdef __WIN32__ + case 0x004A: return "WM_COPYDATA"; + case 0x004B: return "WM_CANCELJOURNAL"; + case 0x004E: return "WM_NOTIFY"; + case 0x0050: return "WM_INPUTLANGCHANGEREQUEST"; + case 0x0051: return "WM_INPUTLANGCHANGE"; + case 0x0052: return "WM_TCARD"; + case 0x0053: return "WM_HELP"; + case 0x0054: return "WM_USERCHANGED"; + case 0x0055: return "WM_NOTIFYFORMAT"; + case 0x007B: return "WM_CONTEXTMENU"; + case 0x007C: return "WM_STYLECHANGING"; + case 0x007D: return "WM_STYLECHANGED"; + case 0x007E: return "WM_DISPLAYCHANGE"; + case 0x007F: return "WM_GETICON"; + case 0x0080: return "WM_SETICON"; +#endif //WIN32 + case 0x0081: return "WM_NCCREATE"; case 0x0082: return "WM_NCDESTROY"; case 0x0083: return "WM_NCCALCSIZE"; @@ -4601,6 +4544,13 @@ static const char *GetMessageName(int message) case 0x0106: return "WM_SYSCHAR"; case 0x0107: return "WM_SYSDEADCHAR"; case 0x0108: return "WM_KEYLAST"; + +#ifdef __WIN32__ + case 0x010D: return "WM_IME_STARTCOMPOSITION"; + case 0x010E: return "WM_IME_ENDCOMPOSITION"; + case 0x010F: return "WM_IME_COMPOSITION"; +#endif //WIN32 + case 0x0110: return "WM_INITDIALOG"; case 0x0111: return "WM_COMMAND"; case 0x0112: return "WM_SYSCOMMAND"; @@ -4623,6 +4573,18 @@ static const char *GetMessageName(int message) case 0x0208: return "WM_MBUTTONUP"; case 0x0209: return "WM_MBUTTONDBLCLK"; case 0x0210: return "WM_PARENTNOTIFY"; + case 0x0211: return "WM_ENTERMENULOOP"; + case 0x0212: return "WM_EXITMENULOOP"; + +#ifdef __WIN32__ + case 0x0213: return "WM_NEXTMENU"; + case 0x0214: return "WM_SIZING"; + case 0x0215: return "WM_CAPTURECHANGED"; + case 0x0216: return "WM_MOVING"; + case 0x0218: return "WM_POWERBROADCAST"; + case 0x0219: return "WM_DEVICECHANGE"; +#endif //WIN32 + case 0x0220: return "WM_MDICREATE"; case 0x0221: return "WM_MDIDESTROY"; case 0x0222: return "WM_MDIACTIVATE"; @@ -4635,6 +4597,18 @@ static const char *GetMessageName(int message) case 0x0229: return "WM_MDIGETACTIVE"; case 0x0230: return "WM_MDISETMENU"; case 0x0233: return "WM_DROPFILES"; + +#ifdef __WIN32__ + case 0x0281: return "WM_IME_SETCONTEXT"; + case 0x0282: return "WM_IME_NOTIFY"; + case 0x0283: return "WM_IME_CONTROL"; + case 0x0284: return "WM_IME_COMPOSITIONFULL"; + case 0x0285: return "WM_IME_SELECT"; + case 0x0286: return "WM_IME_CHAR"; + case 0x0290: return "WM_IME_KEYDOWN"; + case 0x0291: return "WM_IME_KEYUP"; +#endif //WIN32 + case 0x0300: return "WM_CUT"; case 0x0301: return "WM_COPY"; case 0x0302: return "WM_PASTE"; @@ -4653,10 +4627,235 @@ static const char *GetMessageName(int message) case 0x030F: return "WM_QUERYNEWPALETTE"; case 0x0310: return "WM_PALETTEISCHANGING"; case 0x0311: return "WM_PALETTECHANGED"; + +#ifdef __WIN32__ + // common controls messages - although they're not strictly speaking + // standard, it's nice to decode them nevertheless + + // listview + case 0x1000 + 0: return "LVM_GETBKCOLOR"; + case 0x1000 + 1: return "LVM_SETBKCOLOR"; + case 0x1000 + 2: return "LVM_GETIMAGELIST"; + case 0x1000 + 3: return "LVM_SETIMAGELIST"; + case 0x1000 + 4: return "LVM_GETITEMCOUNT"; + case 0x1000 + 5: return "LVM_GETITEMA"; + case 0x1000 + 75: return "LVM_GETITEMW"; + case 0x1000 + 6: return "LVM_SETITEMA"; + case 0x1000 + 76: return "LVM_SETITEMW"; + case 0x1000 + 7: return "LVM_INSERTITEMA"; + case 0x1000 + 77: return "LVM_INSERTITEMW"; + case 0x1000 + 8: return "LVM_DELETEITEM"; + case 0x1000 + 9: return "LVM_DELETEALLITEMS"; + case 0x1000 + 10: return "LVM_GETCALLBACKMASK"; + case 0x1000 + 11: return "LVM_SETCALLBACKMASK"; + case 0x1000 + 12: return "LVM_GETNEXTITEM"; + case 0x1000 + 13: return "LVM_FINDITEMA"; + case 0x1000 + 83: return "LVM_FINDITEMW"; + case 0x1000 + 14: return "LVM_GETITEMRECT"; + case 0x1000 + 15: return "LVM_SETITEMPOSITION"; + case 0x1000 + 16: return "LVM_GETITEMPOSITION"; + case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA"; + case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW"; + case 0x1000 + 18: return "LVM_HITTEST"; + case 0x1000 + 19: return "LVM_ENSUREVISIBLE"; + case 0x1000 + 20: return "LVM_SCROLL"; + case 0x1000 + 21: return "LVM_REDRAWITEMS"; + case 0x1000 + 22: return "LVM_ARRANGE"; + case 0x1000 + 23: return "LVM_EDITLABELA"; + case 0x1000 + 118: return "LVM_EDITLABELW"; + case 0x1000 + 24: return "LVM_GETEDITCONTROL"; + case 0x1000 + 25: return "LVM_GETCOLUMNA"; + case 0x1000 + 95: return "LVM_GETCOLUMNW"; + case 0x1000 + 26: return "LVM_SETCOLUMNA"; + case 0x1000 + 96: return "LVM_SETCOLUMNW"; + case 0x1000 + 27: return "LVM_INSERTCOLUMNA"; + case 0x1000 + 97: return "LVM_INSERTCOLUMNW"; + case 0x1000 + 28: return "LVM_DELETECOLUMN"; + case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH"; + case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH"; + case 0x1000 + 31: return "LVM_GETHEADER"; + case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE"; + case 0x1000 + 34: return "LVM_GETVIEWRECT"; + case 0x1000 + 35: return "LVM_GETTEXTCOLOR"; + case 0x1000 + 36: return "LVM_SETTEXTCOLOR"; + case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR"; + case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR"; + case 0x1000 + 39: return "LVM_GETTOPINDEX"; + case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE"; + case 0x1000 + 41: return "LVM_GETORIGIN"; + case 0x1000 + 42: return "LVM_UPDATE"; + case 0x1000 + 43: return "LVM_SETITEMSTATE"; + case 0x1000 + 44: return "LVM_GETITEMSTATE"; + case 0x1000 + 45: return "LVM_GETITEMTEXTA"; + case 0x1000 + 115: return "LVM_GETITEMTEXTW"; + case 0x1000 + 46: return "LVM_SETITEMTEXTA"; + case 0x1000 + 116: return "LVM_SETITEMTEXTW"; + case 0x1000 + 47: return "LVM_SETITEMCOUNT"; + case 0x1000 + 48: return "LVM_SORTITEMS"; + case 0x1000 + 49: return "LVM_SETITEMPOSITION32"; + case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT"; + case 0x1000 + 51: return "LVM_GETITEMSPACING"; + case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA"; + case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW"; + case 0x1000 + 53: return "LVM_SETICONSPACING"; + case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE"; + case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE"; + case 0x1000 + 56: return "LVM_GETSUBITEMRECT"; + case 0x1000 + 57: return "LVM_SUBITEMHITTEST"; + case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY"; + case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY"; + case 0x1000 + 60: return "LVM_SETHOTITEM"; + case 0x1000 + 61: return "LVM_GETHOTITEM"; + case 0x1000 + 62: return "LVM_SETHOTCURSOR"; + case 0x1000 + 63: return "LVM_GETHOTCURSOR"; + case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT"; + case 0x1000 + 65: return "LVM_SETWORKAREA"; + + // tree view + case 0x1100 + 0: return "TVM_INSERTITEMA"; + case 0x1100 + 50: return "TVM_INSERTITEMW"; + case 0x1100 + 1: return "TVM_DELETEITEM"; + case 0x1100 + 2: return "TVM_EXPAND"; + case 0x1100 + 4: return "TVM_GETITEMRECT"; + case 0x1100 + 5: return "TVM_GETCOUNT"; + case 0x1100 + 6: return "TVM_GETINDENT"; + case 0x1100 + 7: return "TVM_SETINDENT"; + case 0x1100 + 8: return "TVM_GETIMAGELIST"; + case 0x1100 + 9: return "TVM_SETIMAGELIST"; + case 0x1100 + 10: return "TVM_GETNEXTITEM"; + case 0x1100 + 11: return "TVM_SELECTITEM"; + case 0x1100 + 12: return "TVM_GETITEMA"; + case 0x1100 + 62: return "TVM_GETITEMW"; + case 0x1100 + 13: return "TVM_SETITEMA"; + case 0x1100 + 63: return "TVM_SETITEMW"; + case 0x1100 + 14: return "TVM_EDITLABELA"; + case 0x1100 + 65: return "TVM_EDITLABELW"; + case 0x1100 + 15: return "TVM_GETEDITCONTROL"; + case 0x1100 + 16: return "TVM_GETVISIBLECOUNT"; + case 0x1100 + 17: return "TVM_HITTEST"; + case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE"; + case 0x1100 + 19: return "TVM_SORTCHILDREN"; + case 0x1100 + 20: return "TVM_ENSUREVISIBLE"; + case 0x1100 + 21: return "TVM_SORTCHILDRENCB"; + case 0x1100 + 22: return "TVM_ENDEDITLABELNOW"; + case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA"; + case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW"; + case 0x1100 + 24: return "TVM_SETTOOLTIPS"; + case 0x1100 + 25: return "TVM_GETTOOLTIPS"; + + // header + case 0x1200 + 0: return "HDM_GETITEMCOUNT"; + case 0x1200 + 1: return "HDM_INSERTITEMA"; + case 0x1200 + 10: return "HDM_INSERTITEMW"; + case 0x1200 + 2: return "HDM_DELETEITEM"; + case 0x1200 + 3: return "HDM_GETITEMA"; + case 0x1200 + 11: return "HDM_GETITEMW"; + case 0x1200 + 4: return "HDM_SETITEMA"; + case 0x1200 + 12: return "HDM_SETITEMW"; + case 0x1200 + 5: return "HDM_LAYOUT"; + case 0x1200 + 6: return "HDM_HITTEST"; + case 0x1200 + 7: return "HDM_GETITEMRECT"; + case 0x1200 + 8: return "HDM_SETIMAGELIST"; + case 0x1200 + 9: return "HDM_GETIMAGELIST"; + case 0x1200 + 15: return "HDM_ORDERTOINDEX"; + case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE"; + case 0x1200 + 17: return "HDM_GETORDERARRAY"; + case 0x1200 + 18: return "HDM_SETORDERARRAY"; + case 0x1200 + 19: return "HDM_SETHOTDIVIDER"; + + // tab control + case 0x1300 + 2: return "TCM_GETIMAGELIST"; + case 0x1300 + 3: return "TCM_SETIMAGELIST"; + case 0x1300 + 4: return "TCM_GETITEMCOUNT"; + case 0x1300 + 5: return "TCM_GETITEMA"; + case 0x1300 + 60: return "TCM_GETITEMW"; + case 0x1300 + 6: return "TCM_SETITEMA"; + case 0x1300 + 61: return "TCM_SETITEMW"; + case 0x1300 + 7: return "TCM_INSERTITEMA"; + case 0x1300 + 62: return "TCM_INSERTITEMW"; + case 0x1300 + 8: return "TCM_DELETEITEM"; + case 0x1300 + 9: return "TCM_DELETEALLITEMS"; + case 0x1300 + 10: return "TCM_GETITEMRECT"; + case 0x1300 + 11: return "TCM_GETCURSEL"; + case 0x1300 + 12: return "TCM_SETCURSEL"; + case 0x1300 + 13: return "TCM_HITTEST"; + case 0x1300 + 14: return "TCM_SETITEMEXTRA"; + case 0x1300 + 40: return "TCM_ADJUSTRECT"; + case 0x1300 + 41: return "TCM_SETITEMSIZE"; + case 0x1300 + 42: return "TCM_REMOVEIMAGE"; + case 0x1300 + 43: return "TCM_SETPADDING"; + case 0x1300 + 44: return "TCM_GETROWCOUNT"; + case 0x1300 + 45: return "TCM_GETTOOLTIPS"; + case 0x1300 + 46: return "TCM_SETTOOLTIPS"; + case 0x1300 + 47: return "TCM_GETCURFOCUS"; + case 0x1300 + 48: return "TCM_SETCURFOCUS"; + case 0x1300 + 49: return "TCM_SETMINTABWIDTH"; + case 0x1300 + 50: return "TCM_DESELECTALL"; + + // toolbar + case WM_USER+1: return "TB_ENABLEBUTTON"; + case WM_USER+2: return "TB_CHECKBUTTON"; + case WM_USER+3: return "TB_PRESSBUTTON"; + case WM_USER+4: return "TB_HIDEBUTTON"; + case WM_USER+5: return "TB_INDETERMINATE"; + case WM_USER+9: return "TB_ISBUTTONENABLED"; + case WM_USER+10: return "TB_ISBUTTONCHECKED"; + case WM_USER+11: return "TB_ISBUTTONPRESSED"; + case WM_USER+12: return "TB_ISBUTTONHIDDEN"; + case WM_USER+13: return "TB_ISBUTTONINDETERMINATE"; + case WM_USER+17: return "TB_SETSTATE"; + case WM_USER+18: return "TB_GETSTATE"; + case WM_USER+19: return "TB_ADDBITMAP"; + case WM_USER+20: return "TB_ADDBUTTONS"; + case WM_USER+21: return "TB_INSERTBUTTON"; + case WM_USER+22: return "TB_DELETEBUTTON"; + case WM_USER+23: return "TB_GETBUTTON"; + case WM_USER+24: return "TB_BUTTONCOUNT"; + case WM_USER+25: return "TB_COMMANDTOINDEX"; + case WM_USER+26: return "TB_SAVERESTOREA"; + case WM_USER+76: return "TB_SAVERESTOREW"; + case WM_USER+27: return "TB_CUSTOMIZE"; + case WM_USER+28: return "TB_ADDSTRINGA"; + case WM_USER+77: return "TB_ADDSTRINGW"; + case WM_USER+29: return "TB_GETITEMRECT"; + case WM_USER+30: return "TB_BUTTONSTRUCTSIZE"; + case WM_USER+31: return "TB_SETBUTTONSIZE"; + case WM_USER+32: return "TB_SETBITMAPSIZE"; + case WM_USER+33: return "TB_AUTOSIZE"; + case WM_USER+35: return "TB_GETTOOLTIPS"; + case WM_USER+36: return "TB_SETTOOLTIPS"; + case WM_USER+37: return "TB_SETPARENT"; + case WM_USER+39: return "TB_SETROWS"; + case WM_USER+40: return "TB_GETROWS"; + case WM_USER+42: return "TB_SETCMDID"; + case WM_USER+43: return "TB_CHANGEBITMAP"; + case WM_USER+44: return "TB_GETBITMAP"; + case WM_USER+45: return "TB_GETBUTTONTEXTA"; + case WM_USER+75: return "TB_GETBUTTONTEXTW"; + case WM_USER+46: return "TB_REPLACEBITMAP"; + case WM_USER+47: return "TB_SETINDENT"; + case WM_USER+48: return "TB_SETIMAGELIST"; + case WM_USER+49: return "TB_GETIMAGELIST"; + case WM_USER+50: return "TB_LOADIMAGES"; + case WM_USER+51: return "TB_GETRECT"; + case WM_USER+52: return "TB_SETHOTIMAGELIST"; + case WM_USER+53: return "TB_GETHOTIMAGELIST"; + case WM_USER+54: return "TB_SETDISABLEDIMAGELIST"; + case WM_USER+55: return "TB_GETDISABLEDIMAGELIST"; + case WM_USER+56: return "TB_SETSTYLE"; + case WM_USER+57: return "TB_GETSTYLE"; + case WM_USER+58: return "TB_GETBUTTONSIZE"; + case WM_USER+59: return "TB_SETBUTTONWIDTH"; + case WM_USER+60: return "TB_SETMAXTEXTROWS"; + case WM_USER+61: return "TB_GETTEXTROWS"; + case WM_USER+41: return "TB_GETBITMAPFLAGS"; + +#endif //WIN32 + default: static char s_szBuf[128]; sprintf(s_szBuf, "", message); return s_szBuf; } } -#endif //WXDEBUG +#endif //WXDEBUG \ No newline at end of file