mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-08-18 01:19:45 +08:00
This allows the existing code passing wxStockCursor instead of wxCursor parameter to keep working with the functions taking wxCursorBundle instead of wxCursor too and, in particular, we can keep just a single version of wxSetCursor() instead of having two overloads (which wasn't necessarily a problem for just this function, but is inconsistent with the other functions taking wxCursor, notably wxDropSource ctor where overloads really can't be used because we would need too many of them to cover all combinations of 3 different wxCursor parameters).
154 lines
5.2 KiB
C++
154 lines
5.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/cursor.h
|
|
// Purpose: wxCursor base header
|
|
// Author: Julian Smart, Vadim Zeitlin
|
|
// Created:
|
|
// Copyright: (c) Julian Smart
|
|
// (c) 2014 Vadim Zeitlin (wxCursorBase)
|
|
// Licence: wxWindows Licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_CURSOR_H_BASE_
|
|
#define _WX_CURSOR_H_BASE_
|
|
|
|
#include "wx/gdiobj.h"
|
|
#include "wx/gdicmn.h"
|
|
|
|
// Under most ports, wxCursor derives directly from wxGDIObject, but in wxMSW
|
|
// there is an intermediate wxGDIImage class.
|
|
#ifdef __WXMSW__
|
|
#include "wx/msw/gdiimage.h"
|
|
#else
|
|
typedef wxGDIObject wxGDIImage;
|
|
#endif
|
|
|
|
class WXDLLIMPEXP_FWD_CORE wxBitmapBundle;
|
|
class WXDLLIMPEXP_FWD_CORE wxWindow;
|
|
|
|
class WXDLLIMPEXP_CORE wxCursorBase : public wxGDIImage
|
|
{
|
|
public:
|
|
/*
|
|
wxCursor classes should provide the following ctors:
|
|
|
|
wxCursor();
|
|
wxCursor(const wxImage& image);
|
|
wxCursor(const wxBitmap& bitmap, const wxPoint& hotSpot);
|
|
wxCursor(const wxBitmap& bitmap, int hotSpotX = 0, int hotSpotY = 0);
|
|
wxCursor(const wxString& name, wxBitmapType type, const wxPoint& hotSpot);
|
|
wxCursor(const wxString& name,
|
|
wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
|
|
int hotSpotX = 0, int hotSpotY = 0);
|
|
wxCursor(wxStockCursor id) { InitFromStock(id); }
|
|
*/
|
|
|
|
virtual wxPoint GetHotSpot() const { return wxDefaultPosition; }
|
|
};
|
|
|
|
#if defined(__WXMSW__)
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE
|
|
#include "wx/msw/cursor.h"
|
|
#elif defined(__WXGTK__)
|
|
#ifdef __WINDOWS__
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE
|
|
#else
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM
|
|
#endif
|
|
#include "wx/gtk/cursor.h"
|
|
#elif defined(__WXX11__)
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM
|
|
#include "wx/x11/cursor.h"
|
|
#elif defined(__WXDFB__)
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE
|
|
#include "wx/dfb/cursor.h"
|
|
#elif defined(__WXMAC__)
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_MACCURSOR_RESOURCE
|
|
#include "wx/osx/cursor.h"
|
|
#elif defined(__WXQT__)
|
|
#ifdef __WINDOWS__
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE
|
|
#else
|
|
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR
|
|
#endif
|
|
#include "wx/qt/cursor.h"
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxCursorBundle stores 1 or more versions of the same cursor, to be used at
|
|
// different DPI scaling levels.
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class wxCursorBundleImpl;
|
|
|
|
class WXDLLIMPEXP_CORE wxCursorBundle
|
|
{
|
|
public:
|
|
// Default ctor constructs an empty bundle which can't be used for
|
|
// anything, but can be assigned something later.
|
|
wxCursorBundle();
|
|
|
|
// Create a cursor bundle from the given bitmap bundle.
|
|
//
|
|
// Note that the hotspot coordinates must be relative to the default size
|
|
// of the bitmap bundle and are scaled for other sizes.
|
|
explicit wxCursorBundle(const wxBitmapBundle& bitmaps,
|
|
const wxPoint& hotSpot);
|
|
|
|
explicit wxCursorBundle(const wxBitmapBundle& bitmaps,
|
|
int hotSpotX = 0, int hotSpotY = 0)
|
|
: wxCursorBundle(bitmaps, wxPoint(hotSpotX, hotSpotY))
|
|
{
|
|
}
|
|
|
|
// This conversion ctor from a single cursor only exists for
|
|
// interoperability with the existing code using wxCursor.
|
|
wxCursorBundle(const wxCursor& cursor);
|
|
|
|
// This is another conversion ctor existing to allow existing code using
|
|
// wxCursor to work without changes with wxCursorBundle.
|
|
wxCursorBundle(wxStockCursor id);
|
|
|
|
// Default copy ctor and assignment operator and dtor would be ok, but need
|
|
// to be defined out of line, where wxCursorBundleImpl is fully declared.
|
|
|
|
wxCursorBundle(const wxCursorBundle& other);
|
|
wxCursorBundle& operator=(const wxCursorBundle& other);
|
|
|
|
~wxCursorBundle();
|
|
|
|
// Check if cursor bundle is non-empty.
|
|
wxNODISCARD bool IsOk() const { return m_impl.get() != nullptr; }
|
|
|
|
// Clear the bundle contents, IsOk() will return false after doing this.
|
|
void Clear();
|
|
|
|
// Get the cursor of the size suitable for the DPI used by the given window.
|
|
wxNODISCARD wxCursor GetCursorFor(const wxWindow* window) const;
|
|
|
|
// Get the cursor of the default size: prefer to use GetCursorFor() instead
|
|
// if there is a suitable window available, this function only exists as
|
|
// last resort.
|
|
wxNODISCARD wxCursor GetCursorForMainWindow() const;
|
|
|
|
// Check if two objects refer to the same bundle.
|
|
wxNODISCARD bool IsSameAs(const wxCursorBundle& other) const
|
|
{
|
|
return m_impl == other.m_impl;
|
|
}
|
|
|
|
private:
|
|
using ImplPtr = wxObjectDataPtr<wxCursorBundleImpl>;
|
|
|
|
// Private ctor used by static factory functions to create objects of this
|
|
// class. It takes ownership of the pointer (which must be non-null).
|
|
explicit wxCursorBundle(const ImplPtr& impl);
|
|
|
|
ImplPtr m_impl;
|
|
};
|
|
|
|
// For compatibility, include busy cursor-related stuff which used to be pulled
|
|
// in by this header via wx/utils.h.
|
|
#include "wx/busycursor.h"
|
|
|
|
#endif // _WX_CURSOR_H_BASE_
|