Creating wxPaintDC for a window outside of any wxEVT_PAINT handler already resulted in assert failures and crash due to using the empty wxDidCreatePaintDC stack, but the assert message was not really clear, so improve it by stating explicitly that wxPaintDC can only be created from wxEVT_PAINT handlers. Also check that wxPaintDC is being created for the correct window: this wasn't detected at all before, but could still result in a lot of grief, so check for this too. Finally, create a new private header with the paint data stack variable declaration instead of using "extern" to declare it manually in wxDC code.
40 lines
1021 B
C++
40 lines
1021 B
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/msw/private/paint.h
|
|
// Purpose: Helpers for handling repainting
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2020-02-10
|
|
// Copyright: (c) 2020 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_MSW_PRIVATE_PAINT_H_
|
|
#define _WX_MSW_PRIVATE_PAINT_H_
|
|
|
|
#include "wx/stack.h"
|
|
|
|
namespace wxMSWImpl
|
|
{
|
|
|
|
// Data used by WM_PAINT handler
|
|
struct PaintData
|
|
{
|
|
explicit PaintData(wxWindowMSW* window_)
|
|
: window(window_),
|
|
createdPaintDC(false)
|
|
{
|
|
}
|
|
|
|
// The window being repainted (never null).
|
|
wxWindowMSW* const window;
|
|
|
|
// True if the user-defined paint handler created wxPaintDC.
|
|
bool createdPaintDC;
|
|
};
|
|
|
|
// Stack storing data for the possibly nested WM_PAINT handlers.
|
|
extern wxStack<PaintData> paintStack;
|
|
|
|
} // namespace wxMSWImpl
|
|
|
|
#endif // _WX_MSW_PRIVATE_PAINT_H_
|