X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c8b5f745c40c24b266e58b8870915558ddf14561..72c71d39724af116d419295b684dd2946efb3da3:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 1f9123f388..d032c864b7 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -347,12 +347,23 @@ bool wxWindow::Create( if (pParent) { + int nTempy; + pParent->AddChild(this); hParent = GetWinHwnd(pParent); // // OS2 uses normal coordinates, no bassackwards Windows ones // - vPos.y = pParent->GetSize().y - (vPos.y + rSize.y); + nTempy = pParent->GetSize().y - (vPos.y + rSize.y); +#if 0 + if (nTempy < 0) + { + nTempy = pParent->GetSize().y + (vPos.y + rSize.y); + pParent->SetSize(0, 0, pParent->GetSize().x, nTempy); + nTempy = pParent->GetSize().y - (vPos.y + rSize.y); + } +#endif + vPos.y = nTempy; } else { @@ -602,7 +613,24 @@ void wxWindow::SetScrollRange( , bool bRefresh ) { - ::WinSendMsg(GetHwnd(), SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, nRange)); + int nRange1 = nRange; + int nPageSize = GetScrollPage(nOrient); + + if (nPpageSize > 1 && nRange > 0) + { + nRange1 += (nPageSize - 1); + } + + if (nOrient == wxHORIZONTAL) + { + ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1)); + ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); + } + else + { + ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1)); + ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); + } } // end of wxWindow::SetScrollRange void wxWindow::SetScrollPage( @@ -611,11 +639,11 @@ void wxWindow::SetScrollPage( , bool bRefresh ) { - if ( orient == wxHORIZONTAL ) - m_xThumbSize = page; + if (nOrient == wxHORIZONTAL ) + m_nXThumbSize = nPage; else - m_yThumbSize = page; -} + m_nYThumbSize = nPage; +} // end of wxWindow::SetScrollPage int wxWindow::OldGetScrollRange( int nOrient @@ -647,7 +675,10 @@ int wxWindow::GetScrollPos( int nOrient ) const { - return((int)::WinSendMsg(GetHwnd(), SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL)); + if (nOrient == wxHORIZONTAL) + return((int)::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL)); + else + return((int)::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL)); } // end of wxWindow::GetScrollPos int wxWindow::GetScrollRange( @@ -656,7 +687,10 @@ int wxWindow::GetScrollRange( { MRESULT mr; - mr = ::WinSendMsg(GetHwnd(), SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL); + if (nOrient == wxHORIZONTAL) + mr = ::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL); + else + mr = ::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL); return((int)SHORT2FROMMR(mr)); } // end of wxWindow::GetScrollRange @@ -664,12 +698,10 @@ int wxWindow::GetScrollThumb( int nOrient ) const { - WNDPARAMS vWndParams; - PSBCDATA pSbcd; - - ::WinSendMsg(GetHwnd(), WM_QUERYWINDOWPARAMS, (MPARAM)&vWndParams, (MPARAM)NULL); - pSbcd = (PSBCDATA)vWndParams.pCtlData; - return((int)pSbcd->posThumb); + if (nOrient == wxHORIZONTAL ) + return m_nXThumbSize; + else + return m_nYThumbSize; } // end of wxWindow::GetScrollThumb void wxWindow::SetScrollPos( @@ -678,7 +710,10 @@ void wxWindow::SetScrollPos( , bool bRefresh ) { - ::WinSendMsg(GetHwnd(), SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL); + if (nOrient == wxHORIZONTAL ) + ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL); + else + ::WinSendMsg(m_hWndScrollBarVert, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL); } // end of wxWindow::SetScrollPos( void wxWindow::SetScrollbar( @@ -694,7 +729,7 @@ void wxWindow::SetScrollbar( int nPageSize = nThumbVisible; SBCDATA vInfo; HWND hWnd = GetHwnd(); - ULONG ulStyle = WS_VISIBLE; + ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT; RECTL vRect; ::WinQueryWindowRect(hWnd, &vRect); @@ -713,6 +748,11 @@ void wxWindow::SetScrollbar( ulStyle |= SBS_HORZ; if (m_hWndScrollBarHorz == 0L) { + // + // We create the scrollbars with the desktop so that they are not + // registered as child windows of the window in order that child + // windows may be scrolled without scrolling the scrollbars themselves! + // m_hWndScrollBarHorz = ::WinCreateWindow( hWnd ,WC_SCROLLBAR ,(PSZ)NULL @@ -723,7 +763,7 @@ void wxWindow::SetScrollbar( ,20 ,hWnd ,HWND_TOP - ,-1 + ,FID_HORZSCROLL ,&vInfo ,NULL ); @@ -755,6 +795,7 @@ void wxWindow::SetScrollbar( ); } ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1)); + ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); } } else @@ -767,12 +808,12 @@ void wxWindow::SetScrollbar( ,(PSZ)NULL ,ulStyle ,vRect.xRight - 20 - ,vRect.yBottom + ,vRect.yBottom + 20 ,20 - ,vRect.yTop - vRect.yBottom + ,vRect.yTop - (vRect.yBottom + 20) ,hWnd ,HWND_TOP - ,-1 + ,FID_VERTSCROLL ,&vInfo ,NULL ); @@ -797,13 +838,14 @@ void wxWindow::SetScrollbar( ::WinSetWindowPos( m_hWndScrollBarVert ,HWND_TOP ,vRect.xRight - 20 - ,vRect.yBottom + ,vRect.yBottom + 20 ,20 - ,vRect.yTop - vRect.yBottom + ,vRect.yTop - (vRect.yBottom + 20) ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ); } ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1)); + ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); } m_nYThumbSize = nThumbVisible; } @@ -815,20 +857,67 @@ void wxWindow::ScrollWindow( , const wxRect* pRect ) { + RECTL vRect; RECTL vRect2; + nDy *= -1; // flip the sign of Dy as OS/2 is opposite wxWin. if (pRect) { vRect2.xLeft = pRect->x; - vRect2.yTop = pRect->y; + vRect2.yTop = pRect->y + pRect->height; vRect2.xRight = pRect->x + pRect->width; - vRect2.yBottom = pRect->y + pRect->height; + vRect2.yBottom = pRect->y; } + else + { + ::WinQueryWindowRect(GetHwnd(), &vRect2); + ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect); + vRect2.yBottom += vRect.yTop - vRect.yBottom; + ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect); + vRect2.xRight -= vRect.xRight - vRect.xLeft; + } if (pRect) - ::WinScrollWindow(GetHwnd(), (LONG)nDx, (LONG)nDy, &vRect2, NULL, NULLHANDLE, NULL, 0L); + ::WinScrollWindow( GetHwnd() + ,(LONG)nDx + ,(LONG)nDy + ,&vRect2 + ,NULL + ,NULLHANDLE + ,NULL + ,SW_INVALIDATERGN + ); else - ::WinScrollWindow(GetHwnd(), nDx, nDy, NULL, NULL, NULLHANDLE, NULL, 0L); + ::WinScrollWindow( GetHwnd() + ,nDx + ,nDy + ,NULL + ,NULL + ,NULLHANDLE + ,NULL + ,SW_INVALIDATERGN + ); + + // + // Move the children + wxWindowList::Node* pCurrent = GetChildren().GetFirst(); + SWP vSwp; + + while (pCurrent) + { + wxWindow* pChildWin = pCurrent->GetData(); + + ::WinQueryWindowPos(pChildWin->GetHWND(), &vSwp); + ::WinSetWindowPos( pChildWin->GetHWND() + ,HWND_TOP + ,vSwp.x + nDx + ,vSwp.y + nDy + ,0 + ,0 + , SWP_MOVE | SWP_SHOW + ); + pCurrent = pCurrent->GetNext(); + } } // end of wxWindow::ScrollWindow // --------------------------------------------------------------------------- @@ -1218,7 +1307,10 @@ void wxWindow::DoGetClientSize( HWND hWndClient; RECTL vRect; - hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT); + if (IsKindOf(CLASSINFO(wxFrame))) + hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT); + else + hWndClient = NULLHANDLE; if( hWndClient == NULLHANDLE) ::WinQueryWindowRect(GetHwnd(), &vRect); else @@ -1872,9 +1964,18 @@ void wxWindow::UnpackScroll( , WXHWND* phWnd ) { - *pCode = LOWORD(wParam); - *pPos = HIWORD(wParam); - *phWnd = (WXHWND)lParam; + ULONG ulId; + HWND hWnd; + + ulId = (ULONG)LONGFROMMP(wParam); + hWnd = ::WinWindowFromID(GetHwnd(), ulId); + if (hWnd == m_hWndScrollBarHorz || hWnd == m_hWndScrollBarVert) + *phWnd = NULLHANDLE; + else + *phWnd = hWnd; + + *pPos = SHORT1FROMMP(lParam); + *pCode = SHORT2FROMMP(lParam); } // end of wxWindow::UnpackScroll void wxWindow::UnpackMenuSelect(