Add wxWindow::BeginRepositioningChildren() and EndRepositioningChildren().

This is just a refactoring of wxMSW code to make it possible to use deferred
window positioning from other places in subsequent commits.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74066 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-05-31 23:21:03 +00:00
parent 4300317631
commit 1a986642f5
5 changed files with 156 additions and 44 deletions

View File

@@ -766,6 +766,70 @@ public:
*/
//@{
/**
Helper for ensuring EndRepositioningChildren() is called correctly.
This class wraps the calls to BeginRepositioningChildren() and
EndRepositioningChildren() by performing the former in its constructor
and the latter in its destructor if, and only if, the first call
returned @true. This is the simplest way to call these methods and if
this class is created as a local variable, it also ensures that
EndRepositioningChildren() is correctly called (or not) on scope exit,
so its use instead of calling these methods manually is highly
recommended.
@since 2.9.5
*/
class ChildrenRepositioningGuard
{
public:
/**
Constructor calls wxWindow::BeginRepositioningChildren().
@param win The window to call BeginRepositioningChildren() on. If
it is @NULL, nothing is done.
*/
explicit ChildrenRepositioningGuard(wxWindow* win);
/**
Destructor calls wxWindow::EndRepositioningChildren() if necessary.
EndRepositioningChildren() is called only if a valid window was
passed to the constructor and if BeginRepositioningChildren()
returned @true.
*/
~ChildrenRepositioningGuard();
};
/**
Prepare for changing positions of multiple child windows.
This method should be called before changing positions of multiple
child windows to reduce flicker and, in MSW case, even avoid display
corruption in some cases. It is used internally by wxWidgets and called
automatically when the window size changes but it can also be useful to
call it from outside of the library if a repositioning involving
multiple children is done without changing the window size.
If this method returns @true, then EndRepositioningChildren() must be
called after setting all children positions. Use
ChildrenRepositioningGuard class to ensure that this requirement is
satisfied.
@since 2.9.5
*/
bool BeginRepositioningChildren();
/**
Fix child window positions after setting all of them at once.
This method must be called if and only if the previous call to
BeginRepositioningChildren() returned @true.
@since 2.9.5
*/
void EndRepositioningChildren();
/**
Sets the cached best size value.