/////////////////////////////////////////////////////////////////////////////
// Name:        dcclient.h
// Purpose:     interface of wxClientDC and wxPaintDC
// Author:      wxWidgets team
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

/**
    @class wxPaintDC

    A wxPaintDC must be constructed if an application wishes to paint on the
    client area of a window from within an EVT_PAINT() event handler. This
    should normally be constructed as a temporary stack object; don't store a
    wxPaintDC object. If you have an EVT_PAINT() handler, you @e must create a
    wxPaintDC object within it even if you don't actually use it.

    Using wxPaintDC within your EVT_PAINT() handler is important because it
    automatically sets the clipping area to the damaged area of the window.
    Attempts to draw outside this area do not appear.

    A wxPaintDC object is initialized to use the same font and colours as the
    window it is associated with.

    @library{wxcore}
    @category{dc}

    @see wxDC, wxMemoryDC
*/
class wxPaintDC : public wxClientDC
{
public:
    /**
        Constructor. Pass a pointer to the window on which you wish to paint.
    */
    wxPaintDC(wxWindow* window);
};



/**
    @class wxClientDC

    Deprecated class for drawing on the client area of a window.

    wxClientDC should not be used any longer, please use wxInfoDC instead for
    obtaining information about the device context associated with a window.

    @note While wxClientDC may also be used for drawing on the client area of a
    window from outside an EVT_PAINT() handler in some ports, this does @em not
    work on all platforms: neither wxOSX nor wxGTK with GTK 3 Wayland backend
    support this at all, so drawing using wxClientDC simply doesn't have any
    effect there. CanBeUsedForDrawing() can be used to determine whether
    wxClientDC can be used for drawing in the current environment, but it is
    recommended to only draw on the window using wxPaintDC, as this is
    guaranteed to work everywhere. To redraw a small part of the window, use
    wxWindow::RefreshRect() to invalidate just this part and check
    wxWindow::GetUpdateRegion() in the paint event handler to redraw this part
    only.

    wxClientDC objects should normally be constructed as temporary stack
    objects, i.e. don't store a wxClientDC object.

    A wxClientDC object is initialized to use the same font and colours as the
    window it is associated with.

    @library{wxcore}
    @category{dc}

    @see wxDC, wxMemoryDC, wxPaintDC, wxWindowDC
*/
class wxClientDC : public wxWindowDC
{
public:
    /**
        Constructor. Pass a pointer to the window on which you wish to paint.
    */
    wxClientDC(wxWindow* window);

    /**
        Return true if drawing on wxClientDC actually works.

        In many environments (currently this includes wxGTK when using Wayland
        backend, wxMSW when using double buffering and wxOSX in all cases),
        wxClientDC can be only used for obtaining information about the device
        context, but not for actually drawing on it. Portable code should avoid
        using wxClientDC completely, as explained in the class documentation,
        but it is also possible to optionally use it only when it does work,
        i.e. when this function returns @true.

        @param window The window that would be used with wxClientDC.

        @since 3.3.0
     */
    static bool CanBeUsedForDrawing(const wxWindow* window);
};



/**
    @class wxWindowDC

    Deprecated class for drawing on the entire window.

    Please don't use this class in the new code, as it doesn't work on modern
    systems any longer and using it is not guaranteed to have any effect at all.

    A wxWindowDC must be constructed if an application wishes to paint on the
    whole area of a window (client and decorations). This should normally be
    constructed as a temporary stack object; don't store a wxWindowDC object.

    To draw on a window from inside an EVT_PAINT() handler, construct a
    wxPaintDC object instead.

    To draw on the client area of a window from outside an EVT_PAINT() handler,
    construct a wxClientDC object.

    A wxWindowDC object is initialized to use the same font and colours as the
    window it is associated with.

    @library{wxcore}
    @category{dc}

    @see wxDC, wxMemoryDC, wxPaintDC, wxClientDC
*/
class wxWindowDC : public wxDC
{
public:
    /**
        Constructor. Pass a pointer to the window on which you wish to paint.
    */
    wxWindowDC(wxWindow* window);
};

