/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
Window::Window( WindowType eType )
: mpWindowImpl(new WindowImpl( *this, eType ))
{ // true: this outdev will be mirrored if RTL window layout (UI mirroring) is globally active
mpWindowImpl->mxOutDev->mbEnableRTL = AllSettings::GetLayoutRTL();
}
Window::Window( vcl::Window* pParent, WinBits nStyle )
: mpWindowImpl(new WindowImpl( *this, WindowType::WINDOW ))
{ // true: this outdev will be mirrored if RTL window layout (UI mirroring) is globally active
mpWindowImpl->mxOutDev->mbEnableRTL = AllSettings::GetLayoutRTL();
ImplInit( pParent, nStyle, nullptr );
}
#if OSL_DEBUG_LEVEL > 0 namespace
{
OString lcl_createWindowInfo(const vcl::Window* pWindow)
{ // skip border windows, they do not carry information that // would help with diagnosing the problem const vcl::Window* pTempWin( pWindow ); while ( pTempWin && pTempWin->GetType() == WindowType::BORDERWINDOW ) {
pTempWin = pTempWin->GetWindow( GetWindowType::FirstChild );
} // check if pTempWin is not null, otherwise use the // original address if ( pTempWin ) {
pWindow = pTempWin;
}
void Window::dispose()
{
assert( mpWindowImpl );
assert( !mpWindowImpl->mbInDispose ); // should only be called from disposeOnce()
assert( (!mpWindowImpl->mpParent ||
mpWindowImpl->mpParent->mpWindowImpl) && "vcl::Window child should have its parent disposed first" );
// remove Key and Mouse events issued by Application::PostKey/MouseEvent
Application::RemoveMouseAndKeyEvents( this );
// Dispose of the canvas implementation (which, currently, has an // own wrapper window as a child to this one.
GetOutDev()->ImplDisposeCanvas();
mpWindowImpl->mbInDispose = true;
CallEventListeners( VclEventId::ObjectDying );
// do not send child events for frames that were registered as native frames if( !IsNativeFrame() && mpWindowImpl->mbReallyVisible ) if ( ImplIsAccessibleCandidate() && GetAccessibleParentWindow() )
GetAccessibleParentWindow()->CallEventListeners( VclEventId::WindowChildDestroyed, this );
// remove associated data structures from dockingmanager
ImplGetDockingManager()->RemoveWindow( this );
// remove ownerdraw decorated windows from list in the top-most frame window if( (GetStyle() & WB_OWNERDRAWDECORATION) && mpWindowImpl->mbFrame )
{
::std::vector< VclPtr<vcl::Window> >& rList = ImplGetOwnerDrawList(); auto p = ::std::find( rList.begin(), rList.end(), VclPtr<vcl::Window>(this) ); if( p != rList.end() )
rList.erase( p );
}
// shutdown drag and drop if( mpWindowImpl->mxDNDListenerContainer.is() )
mpWindowImpl->mxDNDListenerContainer->dispose();
// shutdown drag and drop for this frame window
Reference< XComponent > xComponent( mpWindowImpl->mpFrameData->mxDropTarget, UNO_QUERY );
// DNDEventDispatcher does not hold a reference of the DropTarget, // so it's ok if it does not support XComponent if( xComponent.is() )
xComponent->dispose();
} catch (const Exception&)
{ // can be safely ignored here.
}
}
UnoWrapperBase* pWrapper = UnoWrapperBase::GetUnoWrapper( false ); if ( pWrapper )
pWrapper->WindowDestroyed( this );
// MT: Must be called after WindowDestroyed! // Otherwise, if the accessible is a VCLXWindow, it will try to destroy this window again! // But accessibility implementations from applications need this dispose. if ( mpWindowImpl->mxAccessible.is() )
{
Reference< XComponent> xC( mpWindowImpl->mxAccessible, UNO_QUERY ); if ( xC.is() )
xC->dispose();
mpWindowImpl->mxAccessible.clear();
}
if (mpWindowImpl->mpAccessibleInfos)
mpWindowImpl->mpAccessibleInfos->xAccessibleParent.clear();
SAL_WARN_IF(pSVData->mpWinData->mpTrackWin.get() == this, "vcl.window", "Window::~Window(): Window is in TrackingMode");
SAL_WARN_IF(IsMouseCaptured(), "vcl.window", "Window::~Window(): Window has the mouse captured");
// due to old compatibility if (pSVData->mpWinData->mpTrackWin == this)
EndTracking(); if (IsMouseCaptured())
ReleaseMouse();
// hide window in order to trigger the Paint-Handling
Hide();
// EndExtTextInputMode if (pSVData->mpWinData->mpExtTextInputWin == this)
{
EndExtTextInput(); if (pSVData->mpWinData->mpExtTextInputWin == this)
pSVData->mpWinData->mpExtTextInputWin = nullptr;
}
// check if the focus window is our child bool bHasFocusedChild = false; if (pSVData->mpWinData->mpFocusWin && ImplIsRealParentPath(pSVData->mpWinData->mpFocusWin))
{ // #122232#, this must not happen and is an application bug ! but we try some cleanup to hopefully avoid crashes, see below
bHasFocusedChild = true; #if OSL_DEBUG_LEVEL > 0
OUString aTempStr = "Window (" + GetText() + ") with focused child window destroyed ! THIS WILL LEAD TO CRASHES AND MUST BE FIXED !";
SAL_WARN( "vcl", aTempStr );
Application::Abort(aTempStr); #endif
}
// if we get focus pass focus to another window
vcl::Window* pOverlapWindow = ImplGetFirstOverlapWindow(); if (pSVData->mpWinData->mpFocusWin == this
|| bHasFocusedChild) // #122232#, see above, try some cleanup
{ if ( mpWindowImpl->mbFrame )
{
pSVData->mpWinData->mpFocusWin = nullptr;
pOverlapWindow->mpWindowImpl->mpLastFocusWindow = nullptr;
} else
{
vcl::Window* pParent = GetParent();
vcl::Window* pBorderWindow = mpWindowImpl->mpBorderWindow; // when windows overlap, give focus to the parent // of the next FrameWindow if ( pBorderWindow )
{ if ( pBorderWindow->ImplIsOverlapWindow() )
pParent = pBorderWindow->mpWindowImpl->mpOverlapWindow;
} elseif ( ImplIsOverlapWindow() )
pParent = mpWindowImpl->mpOverlapWindow;
// If the focus was set back to 'this' set it to nothing if (pSVData->mpWinData->mpFocusWin == this)
{
pSVData->mpWinData->mpFocusWin = nullptr;
pOverlapWindow->mpWindowImpl->mpLastFocusWindow = nullptr;
}
}
}
if ( pOverlapWindow != nullptr &&
pOverlapWindow->mpWindowImpl->mpLastFocusWindow == this )
pOverlapWindow->mpWindowImpl->mpLastFocusWindow = nullptr;
// reset hint for DefModalDialogParent if( pSVData->maFrameData.mpActiveApplicationFrame == this )
pSVData->maFrameData.mpActiveApplicationFrame = nullptr;
// reset hint of what was the last wheeled window if (pSVData->mpWinData->mpLastWheelWindow == this)
pSVData->mpWinData->mpLastWheelWindow = nullptr;
// reset marked windows if ( mpWindowImpl->mpFrameData != nullptr )
{ if ( mpWindowImpl->mpFrameData->mpFocusWin == this )
mpWindowImpl->mpFrameData->mpFocusWin = nullptr; if ( mpWindowImpl->mpFrameData->mpMouseMoveWin == this )
mpWindowImpl->mpFrameData->mpMouseMoveWin = nullptr; if ( mpWindowImpl->mpFrameData->mpMouseDownWin == this )
mpWindowImpl->mpFrameData->mpMouseDownWin = nullptr;
}
// reset Deactivate-Window if (pSVData->mpWinData->mpLastDeacWin == this)
pSVData->mpWinData->mpLastDeacWin = nullptr;
if ( mpWindowImpl->mbFrame && mpWindowImpl->mpFrameData )
{ if ( mpWindowImpl->mpFrameData->mnFocusId )
Application::RemoveUserEvent( mpWindowImpl->mpFrameData->mnFocusId );
mpWindowImpl->mpFrameData->mnFocusId = nullptr; if ( mpWindowImpl->mpFrameData->mnMouseMoveId )
Application::RemoveUserEvent( mpWindowImpl->mpFrameData->mnMouseMoveId );
mpWindowImpl->mpFrameData->mnMouseMoveId = nullptr;
}
// remove window from the lists
ImplRemoveWindow( true );
// de-register as "top window child" at our parent, if necessary if ( mpWindowImpl->mbFrame )
{ bool bIsTopWindow
= mpWindowImpl->mpWinData && (mpWindowImpl->mpWinData->mnIsTopWindow == 1); if ( mpWindowImpl->mpRealParent && bIsTopWindow )
{
ImplWinData* pParentWinData = mpWindowImpl->mpRealParent->ImplGetWinData();
auto myPos = ::std::find( pParentWinData->maTopWindowChildren.begin(),
pParentWinData->maTopWindowChildren.end(), VclPtr<vcl::Window>(this) );
SAL_WARN_IF( myPos == pParentWinData->maTopWindowChildren.end(), "vcl.window", "Window::~Window: inconsistency in top window chain!" ); if ( myPos != pParentWinData->maTopWindowChildren.end() )
pParentWinData->maTopWindowChildren.erase( myPos );
}
}
mpWindowImpl->mpWinData.reset();
// remove BorderWindow or Frame window data
mpWindowImpl->mpBorderWindow.disposeAndClear(); if ( mpWindowImpl->mbFrame )
{ if ( pSVData->maFrameData.mpFirstFrame == this )
pSVData->maFrameData.mpFirstFrame = mpWindowImpl->mpFrameData->mpNextFrame; else
{
sal_Int32 nWindows = 0;
vcl::Window* pSysWin = pSVData->maFrameData.mpFirstFrame; while ( pSysWin && pSysWin->mpWindowImpl->mpFrameData->mpNextFrame.get() != this )
{
pSysWin = pSysWin->mpWindowImpl->mpFrameData->mpNextFrame;
nWindows++;
}
if ( pSysWin )
{
assert (mpWindowImpl->mpFrameData->mpNextFrame.get() != pSysWin);
pSysWin->mpWindowImpl->mpFrameData->mpNextFrame = mpWindowImpl->mpFrameData->mpNextFrame;
} else// if it is not in the list, we can't remove it.
SAL_WARN("vcl.window", "Window " << this << " marked as frame window, " "is missing from list of " << nWindows << " frames");
} if (mpWindowImpl->mpFrame) // otherwise exception during init
{
mpWindowImpl->mpFrame->SetCallback( nullptr, nullptr );
pSVData->mpDefInst->DestroyFrame( mpWindowImpl->mpFrame );
}
assert (mpWindowImpl->mpFrameData->mnFocusId == nullptr);
assert (mpWindowImpl->mpFrameData->mnMouseMoveId == nullptr);
if (mpWindowImpl->mxWindowPeer)
mpWindowImpl->mxWindowPeer->dispose();
// should be the last statements
mpWindowImpl.reset();
pOutDev.disposeAndClear(); // just to make loplugin:vclwidgets happy
VclReferenceBase::dispose();
}
Window::~Window()
{
disposeOnce();
}
// We will eventually being removing the inheritance of OutputDevice // from Window. It will be replaced with a transient relationship such // that the OutputDevice is only live for the scope of the Paint method. // In the meantime this can help move us towards a Window use an // OutputDevice, not being one.
mpGraphics = mxOwnerWindow->mpWindowImpl->mpFrame->AcquireGraphics(); // try harder if no wingraphics was available directly if ( !mpGraphics )
{ // find another output device in the same frame
vcl::WindowOutputDevice* pReleaseOutDev = pSVData->maGDIData.mpLastWinGraphics.get(); while ( pReleaseOutDev )
{ if ( pReleaseOutDev->mxOwnerWindow && pReleaseOutDev->mxOwnerWindow->mpWindowImpl->mpFrame == mxOwnerWindow->mpWindowImpl->mpFrame ) break;
pReleaseOutDev = static_cast<vcl::WindowOutputDevice*>(pReleaseOutDev->mpPrevGraphics.get());
}
if ( pReleaseOutDev )
{ // steal the wingraphics from the other outdev
mpGraphics = pReleaseOutDev->mpGraphics;
pReleaseOutDev->ReleaseGraphics( false );
} else
{ // if needed retry after releasing least recently used wingraphics while ( !mpGraphics )
{ if ( !pSVData->maGDIData.mpLastWinGraphics ) break;
pSVData->maGDIData.mpLastWinGraphics->ReleaseGraphics();
mpGraphics = mxOwnerWindow->mpWindowImpl->mpFrame->AcquireGraphics();
}
}
}
if ( mpGraphics )
{ // update global LRU list of wingraphics
mpNextGraphics = pSVData->maGDIData.mpFirstWinGraphics.get();
pSVData->maGDIData.mpFirstWinGraphics = const_cast<vcl::WindowOutputDevice*>(this); if ( mpNextGraphics )
mpNextGraphics->mpPrevGraphics = const_cast<vcl::WindowOutputDevice*>(this); if ( !pSVData->maGDIData.mpLastWinGraphics )
pSVData->maGDIData.mpLastWinGraphics = const_cast<vcl::WindowOutputDevice*>(this);
static sal_Int32 CountDPIScaleFactor(sal_Int32 nDPI)
{ #ifndef MACOSX // Setting of HiDPI is unfortunately all only a heuristic; and to add // insult to an injury, the system is constantly lying to us about // the DPI and whatnot // eg. fdo#77059 - set the value from which we do consider the // screen HiDPI to greater than 168 if (nDPI > 216) // 96 * 2 + 96 / 4 return 250; elseif (nDPI > 168) // 96 * 2 - 96 / 4 return 200; elseif (nDPI > 120) // 96 * 1.5 - 96 / 4 return 150; #else
(void)nDPI; #endif
switch (mpWindowImpl->meType)
{ case WindowType::DIALOG: case WindowType::TABDIALOG: case WindowType::MODELESSDIALOG: case WindowType::MESSBOX: case WindowType::INFOBOX: case WindowType::WARNINGBOX: case WindowType::ERRORBOX: case WindowType::QUERYBOX:
nFrameStyle |= SalFrameStyleFlags::DIALOG; break; default: break;
}
// tdf#144624 for the DefaultWindow, which is never visible, don't // create an icon for it so construction of a DefaultWindow cannot // trigger creation of a VirtualDevice which itself requires a // DefaultWindow to exist if( nStyle & WB_DEFAULTWIN )
nFrameStyle |= SalFrameStyleFlags::NOICON;
SalFrame* pParentFrame = nullptr; if ( pParent )
pParentFrame = pParent->mpWindowImpl->mpFrame;
SalFrame* pFrame; if ( pSystemParentData )
pFrame = pSVData->mpDefInst->CreateChildFrame( pSystemParentData, nFrameStyle | SalFrameStyleFlags::PLUG ); else
pFrame = pSVData->mpDefInst->CreateFrame( pParentFrame, nFrameStyle ); if ( !pFrame )
{ // do not abort but throw an exception, may be the current thread terminates anyway (plugin-scenario) throw RuntimeException(
u"Could not create system window!"_ustr,
Reference< XInterface >() );
}
pFrame->SetCallback( this, ImplWindowFrameProc );
// set window frame data
mpWindowImpl->mpFrameData = new ImplFrameData( this );
mpWindowImpl->mpFrame = pFrame;
mpWindowImpl->mpFrameWindow = this;
mpWindowImpl->mpOverlapWindow = this;
if (!(nStyle & WB_DEFAULTWIN) && mpWindowImpl->mbDoubleBufferingRequested)
RequestDoubleBuffering(true);
// init data
mpWindowImpl->mpRealParent = pRealParent;
// #99318: make sure fontcache and list is available before call to SetSettings
mpWindowImpl->mxOutDev->mxFontCollection = mpWindowImpl->mpFrameData->mxFontCollection;
mpWindowImpl->mxOutDev->mxFontCache = mpWindowImpl->mpFrameData->mxFontCache;
if ( mpWindowImpl->mbFrame )
{ if ( pParent )
{
mpWindowImpl->mpFrameData->mnDPIX = pParent->mpWindowImpl->mpFrameData->mnDPIX;
mpWindowImpl->mpFrameData->mnDPIY = pParent->mpWindowImpl->mpFrameData->mnDPIY;
} else
{ if (auto* pGraphics = GetOutDev()->GetGraphics())
{
pGraphics->GetResolution(mpWindowImpl->mpFrameData->mnDPIX,
mpWindowImpl->mpFrameData->mnDPIY);
}
}
// add ownerdraw decorated frame windows to list in the top-most frame window // so they can be hidden on lose focus if( nStyle & WB_OWNERDRAWDECORATION )
ImplGetOwnerDrawList().emplace_back(this );
// delay settings initialization until first "real" frame // this relies on the IntroWindow not needing any system settings if ( !pSVData->maAppData.mbSettingsInit &&
! (nStyle & (WB_INTROWIN|WB_DEFAULTWIN))
)
{ // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
ImplUpdateGlobalSettings( *pSVData->maAppData.mxSettings );
mpWindowImpl->mxOutDev->SetSettings( *pSVData->maAppData.mxSettings );
pSVData->maAppData.mbSettingsInit = true;
}
// If we create a Window with default size, query this // size directly, because we want resize all Controls to // the correct size before we display the window if ( nStyle & (WB_MOVEABLE | WB_SIZEABLE | WB_APP) )
mpWindowImpl->mpFrame->GetClientSize( mpWindowImpl->mxOutDev->mnOutWidth, mpWindowImpl->mxOutDev->mnOutHeight );
} else
{ if ( pParent )
{ if ( !ImplIsOverlapWindow() )
{
mpWindowImpl->mbDisabled = pParent->mpWindowImpl->mbDisabled;
mpWindowImpl->mbInputDisabled = pParent->mpWindowImpl->mbInputDisabled;
mpWindowImpl->meAlwaysInputMode = pParent->mpWindowImpl->meAlwaysInputMode;
}
if (!comphelper::IsFuzzing())
{ // we don't want to call the WindowOutputDevice override of this because // it calls back into us.
mpWindowImpl->mxOutDev->OutputDevice::SetSettings( pParent->GetSettings() );
}
}
}
// setup the scale factor for HiDPI displays
mpWindowImpl->mxOutDev->mnDPIScalePercentage = CountDPIScaleFactor(mpWindowImpl->mpFrameData->mnDPIY);
mpWindowImpl->mxOutDev->mnDPIX = mpWindowImpl->mpFrameData->mnDPIX;
mpWindowImpl->mxOutDev->mnDPIY = mpWindowImpl->mpFrameData->mnDPIY;
// calculate app font res (except for the Intro Window or the default window) if ( mpWindowImpl->mbFrame && !pSVData->maGDIData.mnAppFontX && ! (nStyle & (WB_INTROWIN|WB_DEFAULTWIN)) )
ImplInitAppFontData( this );
}
void Window::ImplInitAppFontData( vcl::Window const * pWindow )
{
ImplSVData* pSVData = ImplGetSVData();
tools::Long nTextHeight = pWindow->GetTextHeight();
tools::Long nTextWidth = pWindow->approximate_char_width() * 8;
tools::Long nSymHeight = nTextHeight*4; // Make the basis wider if the font is too narrow // such that the dialog looks symmetrical and does not become too narrow. // Add some extra space when the dialog has the same width, // as a little more space is better. if ( nSymHeight > nTextWidth )
nTextWidth = nSymHeight; elseif ( nSymHeight+5 > nTextWidth )
nTextWidth = nSymHeight+5;
pSVData->maGDIData.mnAppFontX = nTextWidth * 10 / 8;
pSVData->maGDIData.mnAppFontY = nTextHeight * 10;
#ifdef MACOSX // FIXME: this is currently only on macOS, check with other // platforms if( pSVData->maNWFData.mbNoFocusRects )
{ // try to find out whether there is a large correction // of control sizes, if yes, make app font scalings larger // so dialog positioning is not completely off
ImplControlValue aControlValue;
tools::Rectangle aCtrlRegion( Point(), Size( nTextWidth < 10 ? 10 : nTextWidth, nTextHeight < 10 ? 10 : nTextHeight ) );
tools::Rectangle aBoundingRgn( aCtrlRegion );
tools::Rectangle aContentRgn( aCtrlRegion ); if( pWindow->GetNativeControlRegion( ControlType::Editbox, ControlPart::Entire, aCtrlRegion,
ControlState::ENABLED, aControlValue,
aBoundingRgn, aContentRgn ) )
{ // comment: the magical +6 is for the extra border in bordered // (which is the standard) edit fields if( aContentRgn.GetHeight() - nTextHeight > (nTextHeight+4)/4 )
pSVData->maGDIData.mnAppFontY = (aContentRgn.GetHeight()-4) * 10;
}
} #endif
}
const_cast<vcl::Window*>(this)->mpWindowImpl->mpWinData.reset(new ImplWinData);
mpWindowImpl->mpWinData->mbEnableNativeWidget = !(pNoNWF && *pNoNWF); // true: try to draw this control with native theme API
}
void Window::ImplSetReallyVisible()
{ // #i43594# it is possible that INITSHOW was never send, because the visibility state changed between // ImplCallInitShow() and ImplSetReallyVisible() when called from Show() // mbReallyShown is a useful indicator if( !mpWindowImpl->mbReallyShown )
ImplCallInitShow();
// the SHOW/HIDE events serve as indicators to send child creation/destroy events to the access bridge. // For this, the data member of the event must not be NULL. // Previously, we did this in Window::Show, but there some events got lost in certain situations. Now // we're doing it when the visibility really changes if( bBecameReallyVisible && ImplIsAccessibleCandidate() )
CallEventListeners( VclEventId::WindowShow, this ); // TODO. It's kind of a hack that we're re-using the VclEventId::WindowShow. Normally, we should // introduce another event which explicitly triggers the Accessibility implementations.
vcl::Window* pWindow = mpWindowImpl->mpFirstOverlap; while ( pWindow )
{ if ( pWindow->mpWindowImpl->mbVisible )
pWindow->ImplSetReallyVisible();
pWindow = pWindow->mpWindowImpl->mpNext;
}
pWindow = mpWindowImpl->mpFirstChild; while ( pWindow )
{ if ( pWindow->mpWindowImpl->mbVisible )
pWindow->ImplSetReallyVisible();
pWindow = pWindow->mpWindowImpl->mpNext;
}
}
void Window::ImplInitResolutionSettings()
{ // recalculate AppFont-resolution and DPI-resolution if (mpWindowImpl->mbFrame)
{
GetOutDev()->mnDPIX = mpWindowImpl->mpFrameData->mnDPIX;
GetOutDev()->mnDPIY = mpWindowImpl->mpFrameData->mnDPIY;
// update the recalculated values for logical units // and also tools belonging to the values if (IsMapModeEnabled())
{
MapMode aMapMode = GetMapMode();
SetMapMode();
SetMapMode( aMapMode );
}
}
// #106948# always mirror our pos if our parent is not mirroring, even // if we are also not mirroring // RTL: check if parent is in different coordinates if( !bnXRecycled && mpWindowImpl->mpParent && !mpWindowImpl->mpParent->mpWindowImpl->mbFrame && mpWindowImpl->mpParent->GetOutDev()->ImplIsAntiparallel() )
{
nX = mpWindowImpl->mpParent->GetOutDev()->mnOutWidth - GetOutDev()->mnOutWidth - nX;
} /* #i99166# An LTR window in RTL UI that gets sized only would be expected to not moved its upper left point
*/ if( bnXRecycled )
{ if( GetOutDev()->ImplIsAntiparallel() )
{
aPtDev.setX( mpWindowImpl->mnAbsScreenX );
nOrgX = mpWindowImpl->maPos.X();
}
}
} elseif( !bnXRecycled && mpWindowImpl->mpParent && !mpWindowImpl->mpParent->mpWindowImpl->mbFrame && mpWindowImpl->mpParent->GetOutDev()->ImplIsAntiparallel() )
{ // mirrored window in LTR UI
nX = mpWindowImpl->mpParent->GetOutDev()->mnOutWidth - GetOutDev()->mnOutWidth - nX;
}
// check maPos as well, as it could have been changed for client windows (ImplCallMove()) if ( mpWindowImpl->mnAbsScreenX != aPtDev.X() || nX != mpWindowImpl->mnX || nOrgX != mpWindowImpl->maPos.X() )
{ if ( bCopyBits && !pOverlapRegion )
{
pOverlapRegion.reset( new vcl::Region() );
ImplCalcOverlapRegion( GetOutputRectPixel(),
*pOverlapRegion, false, true );
}
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.49 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.