X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/debe6624c1e9d4bf3243381153d1e173c849bcd8..02569ba8eb3fbb43b136cc417ecf0ee774ae6205:/src/msw/window.cpp?ds=inline diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 8fdc4d7cb9..e594c9b07b 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -46,6 +46,7 @@ #endif #include "wx/menuitem.h" +#include "wx/log.h" #include "wx/msw/private.h" #include @@ -79,6 +80,10 @@ #undef GetClassInfo #endif +#ifdef __WXDEBUG__ +const char *wxGetMessageName(int message); +#endif //WXDEBUG + #define WINDOW_MARGIN 3 // This defines sensitivity of Leave events wxMenu *wxCurrentPopupMenu = NULL; @@ -93,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) @@ -248,7 +252,7 @@ wxWindow::wxWindow(void) m_lastMsg = 0; m_lastWParam = 0; m_lastLParam = 0; - m_acceleratorTable = 0; +// m_acceleratorTable = 0; m_hMenu = 0; m_xThumbSize = 0; @@ -430,7 +434,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, m_lastMsg = 0; m_lastWParam = 0; m_lastLParam = 0; - m_acceleratorTable = 0; +// m_acceleratorTable = 0; m_hMenu = 0; m_xThumbSize = 0; @@ -617,6 +621,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; } @@ -629,6 +643,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; } @@ -639,6 +665,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; @@ -670,7 +709,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(); @@ -693,6 +731,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) @@ -741,6 +781,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(); @@ -803,7 +861,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; @@ -861,7 +919,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA wxWndHook = NULL; wnd->m_hWnd = (WXHWND) hWnd; } -#if (DEBUG > 1) +#if (WXDEBUG > 1) wxDebugMsg("hWnd = %d, m_hWnd = %d, msg = %d\n", hWnd, m_hWnd, message); #endif // Stop right here if we don't have a valid handle @@ -895,57 +953,9 @@ 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) { -#if 0 - switch (message) - { - case WM_INITDIALOG: - case WM_ACTIVATE: - case WM_SETFOCUS: - case WM_KILLFOCUS: - case WM_CREATE: - case WM_PAINT: - case WM_QUERYDRAGICON: - case WM_SIZE: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - case WM_MOUSEMOVE: -// case WM_DESTROY: - case WM_COMMAND: - case WM_NOTIFY: - case WM_MENUSELECT: - case WM_INITMENUPOPUP: - case WM_DRAWITEM: - case WM_MEASUREITEM: - case WM_KEYDOWN: - case WM_KEYUP: - case WM_CHAR: // Always an ASCII character - case WM_HSCROLL: - case WM_VSCROLL: - case WM_CTLCOLORBTN: - case WM_CTLCOLORDLG: - case WM_CTLCOLORLISTBOX: - case WM_CTLCOLORMSGBOX: - case WM_CTLCOLORSCROLLBAR: - case WM_CTLCOLORSTATIC: - case WM_CTLCOLOREDIT: - case WM_SYSCOLORCHANGE: - case WM_ERASEBKGND: - case WM_MDIACTIVATE: - case WM_DROPFILES: - case WM_QUERYENDSESSION: -// case WM_CLOSE: - case WM_GETMINMAXINFO: - return MSWDefWindowProc(message, wParam, lParam ); - } -#endif - + #ifdef __WXDEBUG__ + wxLogTrace(wxTraceMessages, "Processing %s", wxGetMessageName(message)); + #endif // WXDEBUG HWND hWnd = (HWND)m_hWnd; @@ -986,27 +996,27 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) return MSWDefWindowProc(message, wParam, lParam ); break; } - case WM_CREATE: - { - MSWOnCreate((WXLPCREATESTRUCT) (LPCREATESTRUCT)lParam); - return 0; - break; - } - case WM_SHOWWINDOW: - { - MSWOnShow((wParam != 0), (int) lParam); - break; - } - case WM_PAINT: - { + case WM_CREATE: + { + MSWOnCreate((WXLPCREATESTRUCT) (LPCREATESTRUCT)lParam); + return 0; + break; + } + case WM_SHOWWINDOW: + { + MSWOnShow((wParam != 0), (int) lParam); + break; + } + case WM_PAINT: + { if (MSWOnPaint()) return 0; else return MSWDefWindowProc(message, wParam, lParam ); break; } - case WM_QUERYDRAGICON: - { - HICON hIcon = 0; + case WM_QUERYDRAGICON: + { + HICON hIcon = 0; if ((hIcon = (HICON) MSWOnQueryDragIcon())) return (long)hIcon; else return MSWDefWindowProc(message, wParam, lParam ); @@ -1165,7 +1175,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; } case WM_COMMAND: - { + { #ifdef __WIN32__ WORD id = LOWORD(wParam); HWND hwnd = (HWND)lParam; @@ -1178,10 +1188,10 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) if (!MSWOnCommand(id, cmd, (WXHWND) hwnd)) return MSWDefWindowProc(message, wParam, lParam ); break; - } + } #if defined(__WIN95__) case WM_NOTIFY: - { + { if (!MSWOnNotify(wParam, lParam)) return MSWDefWindowProc(message, wParam, lParam ); break; @@ -1216,33 +1226,33 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) } case WM_KEYDOWN: - { - if (wParam == VK_SHIFT) - return Default(); - - else if (wParam == VK_CONTROL) - return Default(); - + // we consider these message "not interesting" + if ( wParam == VK_SHIFT || wParam == VK_CONTROL ) + return Default(); + // Avoid duplicate messages to OnChar - else if ((wParam != VK_ESCAPE) && (wParam != VK_SPACE) && (wParam != VK_RETURN) && (wParam != VK_BACK) && (wParam != VK_TAB)) - { + 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(); - } + if ( ::GetKeyState(VK_CONTROL) & 0x100 ) + return Default(); + } + else if ( ::GetKeyState(VK_CONTROL) & 0x100 ) + MSWOnChar((WORD)wParam, lParam); + else + return Default(); + break; + case WM_KEYUP: - { break; - } - // VZ: WM_KEYUP not processed + case WM_CHAR: // Always an ASCII character - { - MSWOnChar((WORD)wParam, lParam, TRUE); - break; - } + { + MSWOnChar((WORD)wParam, lParam, TRUE); + break; + } case WM_HSCROLL: { @@ -1274,68 +1284,68 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) } #ifdef __WIN32__ case WM_CTLCOLORBTN: - { + { int nCtlColor = CTLCOLOR_BTN; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } case WM_CTLCOLORDLG: - { + { int nCtlColor = CTLCOLOR_DLG; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam);\ break; - } + } case WM_CTLCOLORLISTBOX: - { + { int nCtlColor = CTLCOLOR_LISTBOX; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } case WM_CTLCOLORMSGBOX: - { + { int nCtlColor = CTLCOLOR_MSGBOX; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } case WM_CTLCOLORSCROLLBAR: - { + { int nCtlColor = CTLCOLOR_SCROLLBAR; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } case WM_CTLCOLORSTATIC: - { + { int nCtlColor = CTLCOLOR_STATIC; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } case WM_CTLCOLOREDIT: - { + { int nCtlColor = CTLCOLOR_EDIT; HWND control = (HWND)lParam; HDC pDC = (HDC)wParam; return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor, message, wParam, lParam); break; - } + } #else case WM_CTLCOLOR: { @@ -1356,6 +1366,16 @@ 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 @@ -1384,15 +1404,15 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { MSWOnDropFiles(wParam); break; - } + } case WM_INITDIALOG: { return 0; // MSWOnInitDialog((WXHWND)(HWND)wParam); break; - } + } case WM_QUERYENDSESSION: { - // Same as WM_CLOSE, but inverted results. Thx Microsoft :-) + // Same as WM_CLOSE, but inverted results. Thx Microsoft :-) return MSWOnClose(); break; } @@ -1420,6 +1440,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; } + case WM_GETDLGCODE: + return MSWGetDlgCode(); + /* #if HAVE_SOCKET case WM_TIMER: @@ -1476,7 +1499,7 @@ void wxWindow::MSWDestroyWindow(void) { #if 0 -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWDestroyWindow %d\n", handle); #endif MSWDetachWindowMenu(); @@ -1581,7 +1604,7 @@ void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow wxWndHook = NULL; wxWinHandleList->Append((long)m_hWnd, this); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWCreate %d\n", m_hWnd); #endif } @@ -1592,7 +1615,7 @@ void wxWindow::MSWOnCreate(WXLPCREATESTRUCT WXUNUSED(cs)) bool wxWindow::MSWOnClose(void) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnClose %d\n", handle); #endif return FALSE; @@ -1600,7 +1623,7 @@ bool wxWindow::MSWOnClose(void) bool wxWindow::MSWOnDestroy(void) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnDestroy %d\n", handle); #endif // delete our drop target if we've got one @@ -1661,22 +1684,18 @@ bool wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam) void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnMenuHighlight %d\n", handle); #endif } void wxWindow::MSWOnInitMenuPopup(WXHMENU menu, int pos, bool isSystem) { -/* - if (!isSystem) - OldOnInitMenuPopup(pos); -*/ } bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSED(activate)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnActivate %d\n", handle); #endif @@ -1689,7 +1708,7 @@ bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSE bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnSetFocus %d\n", m_hWnd); #endif // Deal with caret @@ -1709,7 +1728,7 @@ bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd)) bool wxWindow::MSWOnKillFocus(WXHWND WXUNUSED(hwnd)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnKillFocus %d\n", m_hWnd); #endif // Deal with caret @@ -1727,11 +1746,11 @@ bool wxWindow::MSWOnKillFocus(WXHWND WXUNUSED(hwnd)) void wxWindow::MSWOnDropFiles(WXWPARAM wParam) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnDropFiles %d\n", m_hWnd); #endif - HANDLE hFilesInfo = (HANDLE)wParam; + HDROP hFilesInfo = (HDROP) wParam; POINT dropPoint; DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); @@ -1820,7 +1839,7 @@ bool wxWindow::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnCtlColour %d\n", m_hWnd); #endif if (nCtlColor == CTLCOLOR_DLG) @@ -1853,7 +1872,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)) @@ -1863,6 +1882,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) { @@ -1896,33 +1936,90 @@ long wxWindow::Default() if (m_lastMsg == 0) return 0; + #ifdef __WXDEBUG__ + wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.", + wxGetMessageName(m_lastMsg)); + #endif // WXDEBUG + return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); } bool wxWindow::MSWProcessMessage(WXMSG* pMsg) { - if (!m_hWnd) - return FALSE; - else - { - // Suggestion by Andrew Davison to allow - // a panel to accept character input in user edit mode - - // OK, what we probably want to do here for wxWin 2.0 - // is have a window style to indicate whether the window - // should process dialog-style input, since we can't - // otherwise tell whether it's supposed to do tab traversal - // or not. - if (GetWindowStyleFlag() & wxTAB_TRAVERSAL) - return (::IsDialogMessage((HWND) m_hWnd, (MSG *)pMsg) != 0); - else - return FALSE; + if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) { + // intercept dialog navigation keys + MSG *msg = (MSG *)pMsg; + bool bProcess = TRUE; + if ( msg->message != WM_KEYDOWN ) + bProcess = FALSE; + + if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN ) + bProcess = FALSE; + + bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0; + + // WM_GETDLGCODE: if the control wants it for itself, don't process it + // (except for Ctrl-Tab combination which is always processed) + LONG lDlgCode; + if ( bProcess && !bCtrlDown ) { + lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); + } + + bool bForward; + if ( bProcess ) { + switch ( msg->wParam ) { + case VK_TAB: + if ( lDlgCode & DLGC_WANTTAB ) + bProcess = FALSE; + else + bForward = !(::GetKeyState(VK_SHIFT) & 0x100); + break; + + case VK_UP: + case VK_LEFT: + if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown ) + bProcess = FALSE; + else + bForward = FALSE; + break; + + case VK_DOWN: + case VK_RIGHT: + if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown ) + bProcess = FALSE; + else + bForward = TRUE; + break; + + default: + bProcess = FALSE; + } + } + + if ( bProcess ) { + wxNavigationKeyEvent event; + event.SetDirection(bForward); + event.SetWindowChange(bCtrlDown); + event.SetEventObject(this); + + if ( GetEventHandler()->ProcessEvent(event) ) + return TRUE; + } + + return ::IsDialogMessage((HWND)GetHWND(), msg) != 0; } + + return FALSE; +} + +bool wxWindow::MSWTranslateMessage(WXMSG* WXUNUSED(pMsg)) +{ + return FALSE; } long wxWindow::MSWOnMDIActivate(long WXUNUSED(flag), WXHWND WXUNUSED(activate), WXHWND WXUNUSED(deactivate)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnMDIActivate %d\n", m_hWnd); #endif return 1; @@ -1949,6 +2046,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)) @@ -1961,7 +2071,7 @@ void wxWindow::MSWOnSize(int w, int h, WXUINT WXUNUSED(flag)) if (m_inOnSize) return; -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnSize %d\n", m_hWnd); #endif if (!m_hWnd) @@ -1985,7 +2095,7 @@ void wxWindow::MSWOnWindowPosChanging(void *WXUNUSED(lpPos)) // Deal with child commands from buttons etc. bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxWindow::MSWOnCommand\n"); #endif if (wxCurrentPopupMenu) @@ -1995,7 +2105,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) bool succ = popupMenu->MSWCommand(cmd, id); return succ; } -#if DEBUG > 1 +#if WXDEBUG > 1 char buf[80]; sprintf(buf, "Looking for item %d...\n", id); wxDebugMsg(buf); @@ -2005,7 +2115,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) if (item) { bool value = item->MSWCommand(cmd, id); -#if DEBUG > 1 +#if WXDEBUG > 1 if (value) wxDebugMsg("MSWCommand succeeded\n"); else @@ -2015,7 +2125,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control)) } else { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Could not find item!\n"); char buf[100]; wxDebugMsg("Item ids for this panel:\n"); @@ -2494,15 +2604,15 @@ void wxWindow::MSWOnVScroll(WXWORD wParam, WXWORD pos, WXHWND control) if (control) { wxWindow *child = wxFindWinFromHandle(control); - if ( child ) - child->MSWOnVScroll(wParam, pos, control); + if ( child ) + child->MSWOnVScroll(wParam, pos, control); return; } - wxScrollEvent event; - event.SetPosition(pos); - event.SetOrientation(wxVERTICAL); - event.m_eventObject = this; + wxScrollEvent event; + event.SetPosition(pos); + event.SetOrientation(wxVERTICAL); + event.m_eventObject = this; switch ( wParam ) { @@ -2549,18 +2659,18 @@ void wxWindow::MSWOnHScroll( WXWORD wParam, WXWORD pos, WXHWND control) if (control) { wxWindow *child = wxFindWinFromHandle(control); - if ( child ) - child->MSWOnHScroll(wParam, pos, control); + if ( child ) + child->MSWOnHScroll(wParam, pos, control); return; } - - wxScrollEvent event; - event.SetPosition(pos); - event.SetOrientation(wxHORIZONTAL); - event.m_eventObject = this; - - switch ( wParam ) - { + + wxScrollEvent event; + event.SetPosition(pos); + event.SetOrientation(wxHORIZONTAL); + event.m_eventObject = this; + + switch ( wParam ) + { case SB_TOP: event.m_eventType = wxEVT_SCROLL_TOP; break; @@ -2600,30 +2710,30 @@ void wxWindow::MSWOnHScroll( WXWORD wParam, WXWORD pos, WXHWND control) void wxWindow::MSWOnShow(bool show, int status) { - wxShowEvent event(GetId(), show); - event.m_eventObject = this; - GetEventHandler()->ProcessEvent(event); + wxShowEvent event(GetId(), show); + event.m_eventObject = this; + GetEventHandler()->ProcessEvent(event); } bool wxWindow::MSWOnInitDialog(WXHWND WXUNUSED(hWndFocus)) { - wxInitDialogEvent event(GetId()); - event.m_eventObject = this; - GetEventHandler()->ProcessEvent(event); - return TRUE; + wxInitDialogEvent event(GetId()); + event.m_eventObject = this; + GetEventHandler()->ProcessEvent(event); + return TRUE; } void wxWindow::InitDialog(void) { - wxInitDialogEvent event(GetId()); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); + wxInitDialogEvent event(GetId()); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); } // Default init dialog behaviour is to transfer data to window void wxWindow::OnInitDialog(wxInitDialogEvent& event) { - TransferDataToWindow(); + TransferDataToWindow(); } void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font) @@ -2634,18 +2744,18 @@ void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font) HFONT was = 0; if (the_font) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxGetCharSize: Selecting HFONT %X\n", fnt); #endif // 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) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxGetCharSize: Selecting old HFONT %X\n", was); #endif SelectObject(dc,was) ; @@ -2859,6 +2969,9 @@ void wxWindow::GetCaretPos(int *x, int *y) const *y = point.y; } +// OBSOLETE: use GetUpdateRegion instead. + +#if 0 /* * Update iterator. Use from within OnPaint. */ @@ -2945,6 +3058,7 @@ int wxUpdateIterator::GetH() { return ((RECT *)rp)[current].bottom-GetY(); } +#endif wxWindow *wxGetActiveWindow(void) { @@ -3439,15 +3553,6 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRectangle *rect) ::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 { @@ -3592,64 +3697,25 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) return exStyle; } -/* -#if WXWIN_COMPATIBILITY -void wxWindow::OldOnPaint(void) -{ - wxPaintEvent event(m_windowId); - event.m_eventObject = this; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; - -void wxWindow::OldOnSize(int w, int h) -{ - wxSizeEvent event(wxSize(w, h), m_windowId); - event.m_eventObject = this; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; - -void wxWindow::OldOnMouseEvent(wxMouseEvent& event) -{ - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; - -void wxWindow::OldOnChar(wxKeyEvent& event) -{ - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; - -void wxWindow::OldOnSetFocus(void) -{ - wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); - event.m_eventObject = this; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; - -void wxWindow::OldOnKillFocus(void) -{ - wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId); - event.m_eventObject = this; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); -}; -#endif -*/ - void wxWindow::OnChar(wxKeyEvent& event) { - bool isVirtual; - int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual); + if ( event.KeyCode() == WXK_TAB ) { + // propagate the TABs to the parent - it's up to it to decide what + // to do with it + if ( GetParent() ) { + if ( GetParent()->ProcessEvent(event) ) + return; + } + } - if ( id == -1 ) - id= m_lastWParam; + bool isVirtual; + int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual); + + if ( id == -1 ) + id= m_lastWParam; if ( !event.ControlDown() ) - (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam); + (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam); } void wxWindow::OnPaint(wxPaintEvent& event) @@ -4386,7 +4452,7 @@ void wxWindow::OnChar(wxKeyEvent& event) if (vert_units) y_pages = (int)(v_height/vert_units) - y_page; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ int y = 0; #else int y = y_page-1; @@ -4471,44 +4537,6 @@ void wxWindow::SetupColours(void) 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()); - } - } - } - -} - void wxWindow::OnIdle(wxIdleEvent& event) { // Check if we need to send a LEAVE event @@ -4538,3 +4566,177 @@ void wxWindow::Lower(void) ::SetWindowPos((HWND) GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); } +long wxWindow::MSWGetDlgCode() +{ + // default: just forward to def window proc (the msg has no parameters) + return MSWDefWindowProc(WM_GETDLGCODE, 0, 0); +} + +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__ +const char *wxGetMessageName(int message) +{ + switch ( message ) { + case 0x0000: return "WM_NULL"; + case 0x0001: return "WM_CREATE"; + case 0x0002: return "WM_DESTROY"; + case 0x0003: return "WM_MOVE"; + case 0x0005: return "WM_SIZE"; + case 0x0006: return "WM_ACTIVATE"; + case 0x0007: return "WM_SETFOCUS"; + case 0x0008: return "WM_KILLFOCUS"; + case 0x000A: return "WM_ENABLE"; + case 0x000B: return "WM_SETREDRAW"; + case 0x000C: return "WM_SETTEXT"; + case 0x000D: return "WM_GETTEXT"; + case 0x000E: return "WM_GETTEXTLENGTH"; + case 0x000F: return "WM_PAINT"; + case 0x0010: return "WM_CLOSE"; + case 0x0011: return "WM_QUERYENDSESSION"; + case 0x0012: return "WM_QUIT"; + case 0x0013: return "WM_QUERYOPEN"; + case 0x0014: return "WM_ERASEBKGND"; + case 0x0015: return "WM_SYSCOLORCHANGE"; + case 0x0016: return "WM_ENDSESSION"; + case 0x0017: return "WM_SYSTEMERROR"; + case 0x0018: return "WM_SHOWWINDOW"; + case 0x0019: return "WM_CTLCOLOR"; + case 0x001A: return "WM_WININICHANGE"; + case 0x001B: return "WM_DEVMODECHANGE"; + case 0x001C: return "WM_ACTIVATEAPP"; + case 0x001D: return "WM_FONTCHANGE"; + case 0x001E: return "WM_TIMECHANGE"; + case 0x001F: return "WM_CANCELMODE"; + case 0x0020: return "WM_SETCURSOR"; + case 0x0021: return "WM_MOUSEACTIVATE"; + case 0x0022: return "WM_CHILDACTIVATE"; + case 0x0023: return "WM_QUEUESYNC"; + case 0x0024: return "WM_GETMINMAXINFO"; + case 0x0026: return "WM_PAINTICON"; + case 0x0027: return "WM_ICONERASEBKGND"; + case 0x0028: return "WM_NEXTDLGCTL"; + case 0x002A: return "WM_SPOOLERSTATUS"; + case 0x002B: return "WM_DRAWITEM"; + case 0x002C: return "WM_MEASUREITEM"; + case 0x002D: return "WM_DELETEITEM"; + case 0x002E: return "WM_VKEYTOITEM"; + case 0x002F: return "WM_CHARTOITEM"; + case 0x0030: return "WM_SETFONT"; + case 0x0031: return "WM_GETFONT"; + case 0x0037: return "WM_QUERYDRAGICON"; + case 0x0039: return "WM_COMPAREITEM"; + case 0x0041: return "WM_COMPACTING"; + case 0x0044: return "WM_COMMNOTIFY"; + case 0x0046: return "WM_WINDOWPOSCHANGING"; + case 0x0047: return "WM_WINDOWPOSCHANGED"; + case 0x0048: return "WM_POWER"; + case 0x0081: return "WM_NCCREATE"; + case 0x0082: return "WM_NCDESTROY"; + case 0x0083: return "WM_NCCALCSIZE"; + case 0x0084: return "WM_NCHITTEST"; + case 0x0085: return "WM_NCPAINT"; + case 0x0086: return "WM_NCACTIVATE"; + case 0x0087: return "WM_GETDLGCODE"; + case 0x00A0: return "WM_NCMOUSEMOVE"; + case 0x00A1: return "WM_NCLBUTTONDOWN"; + case 0x00A2: return "WM_NCLBUTTONUP"; + case 0x00A3: return "WM_NCLBUTTONDBLCLK"; + case 0x00A4: return "WM_NCRBUTTONDOWN"; + case 0x00A5: return "WM_NCRBUTTONUP"; + case 0x00A6: return "WM_NCRBUTTONDBLCLK"; + case 0x00A7: return "WM_NCMBUTTONDOWN"; + case 0x00A8: return "WM_NCMBUTTONUP"; + case 0x00A9: return "WM_NCMBUTTONDBLCLK"; + case 0x0100: return "WM_KEYDOWN"; + case 0x0101: return "WM_KEYUP"; + case 0x0102: return "WM_CHAR"; + case 0x0103: return "WM_DEADCHAR"; + case 0x0104: return "WM_SYSKEYDOWN"; + case 0x0105: return "WM_SYSKEYUP"; + case 0x0106: return "WM_SYSCHAR"; + case 0x0107: return "WM_SYSDEADCHAR"; + case 0x0108: return "WM_KEYLAST"; + case 0x0110: return "WM_INITDIALOG"; + case 0x0111: return "WM_COMMAND"; + case 0x0112: return "WM_SYSCOMMAND"; + case 0x0113: return "WM_TIMER"; + case 0x0114: return "WM_HSCROLL"; + case 0x0115: return "WM_VSCROLL"; + case 0x0116: return "WM_INITMENU"; + case 0x0117: return "WM_INITMENUPOPUP"; + case 0x011F: return "WM_MENUSELECT"; + case 0x0120: return "WM_MENUCHAR"; + case 0x0121: return "WM_ENTERIDLE"; + case 0x0200: return "WM_MOUSEMOVE"; + case 0x0201: return "WM_LBUTTONDOWN"; + case 0x0202: return "WM_LBUTTONUP"; + case 0x0203: return "WM_LBUTTONDBLCLK"; + case 0x0204: return "WM_RBUTTONDOWN"; + case 0x0205: return "WM_RBUTTONUP"; + case 0x0206: return "WM_RBUTTONDBLCLK"; + case 0x0207: return "WM_MBUTTONDOWN"; + case 0x0208: return "WM_MBUTTONUP"; + case 0x0209: return "WM_MBUTTONDBLCLK"; + case 0x0210: return "WM_PARENTNOTIFY"; + case 0x0220: return "WM_MDICREATE"; + case 0x0221: return "WM_MDIDESTROY"; + case 0x0222: return "WM_MDIACTIVATE"; + case 0x0223: return "WM_MDIRESTORE"; + case 0x0224: return "WM_MDINEXT"; + case 0x0225: return "WM_MDIMAXIMIZE"; + case 0x0226: return "WM_MDITILE"; + case 0x0227: return "WM_MDICASCADE"; + case 0x0228: return "WM_MDIICONARRANGE"; + case 0x0229: return "WM_MDIGETACTIVE"; + case 0x0230: return "WM_MDISETMENU"; + case 0x0233: return "WM_DROPFILES"; + case 0x0300: return "WM_CUT"; + case 0x0301: return "WM_COPY"; + case 0x0302: return "WM_PASTE"; + case 0x0303: return "WM_CLEAR"; + case 0x0304: return "WM_UNDO"; + case 0x0305: return "WM_RENDERFORMAT"; + case 0x0306: return "WM_RENDERALLFORMATS"; + case 0x0307: return "WM_DESTROYCLIPBOARD"; + case 0x0308: return "WM_DRAWCLIPBOARD"; + case 0x0309: return "WM_PAINTCLIPBOARD"; + case 0x030A: return "WM_VSCROLLCLIPBOARD"; + case 0x030B: return "WM_SIZECLIPBOARD"; + case 0x030C: return "WM_ASKCBFORMATNAME"; + case 0x030D: return "WM_CHANGECBCHAIN"; + case 0x030E: return "WM_HSCROLLCLIPBOARD"; + case 0x030F: return "WM_QUERYNEWPALETTE"; + case 0x0310: return "WM_PALETTEISCHANGING"; + case 0x0311: return "WM_PALETTECHANGED"; + default: + static char s_szBuf[128]; + sprintf(s_szBuf, "", message); + return s_szBuf; + } +} +#endif //WXDEBUG