mirror of
https://github.com/ZDoom/zdoom-macos-deps.git
synced 2025-02-15 16:11:03 +00:00
134 lines
3.6 KiB
C++
134 lines
3.6 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/msw/private/winstyle.h
|
|
// Purpose: Small helper class for updating MSW windows style
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2017-12-09
|
|
// Copyright: (c) 2017 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_MSW_PRIVATE_WINSTYLE_H_
|
|
#define _WX_MSW_PRIVATE_WINSTYLE_H_
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxMSWWinLongUpdater
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/*
|
|
This class is not used directly, but either as wxMSWWinStyleUpdater or
|
|
wxMSWWinExStyleUpdater, both of which inherit from it and can be used like
|
|
this:
|
|
|
|
void SomeFunction()
|
|
{
|
|
wxMSWWinStyleUpdater updateStyle(GetHwndOf(m_win));
|
|
if ( some-condition )
|
|
updateStyle.TurnOn(XX_YYY);
|
|
|
|
// Style update happens here implicitly -- or call Apply().
|
|
}
|
|
*/
|
|
class wxMSWWinLongUpdater
|
|
{
|
|
public:
|
|
// Get the current style.
|
|
LONG_PTR Get() const
|
|
{
|
|
return m_styleCurrent;
|
|
}
|
|
|
|
// Check if the given style bit(s) is (are all) currently turned on.
|
|
bool IsOn(LONG_PTR style) const
|
|
{
|
|
return (m_styleCurrent & style) == style;
|
|
}
|
|
|
|
// Turn on some bit(s) in the style.
|
|
wxMSWWinLongUpdater& TurnOn(LONG_PTR on)
|
|
{
|
|
m_style |= on;
|
|
return *this;
|
|
}
|
|
|
|
// Turn off some bit(s) in the style.
|
|
wxMSWWinLongUpdater& TurnOff(LONG_PTR off)
|
|
{
|
|
m_style &= ~off;
|
|
return *this;
|
|
}
|
|
|
|
// Turn some bit(s) on or off depending on the condition.
|
|
wxMSWWinLongUpdater& TurnOnOrOff(bool cond, LONG_PTR style)
|
|
{
|
|
return cond ? TurnOn(style) : TurnOff(style);
|
|
}
|
|
|
|
// Perform the style update (only if necessary, i.e. if the style really
|
|
// changed).
|
|
//
|
|
// Notice that if this method is not called, it's still done from the dtor,
|
|
// so it's just a convenient way to do it sooner and avoid having to create
|
|
// a new scope for ensuring that the dtor runs at the right place, but
|
|
// otherwise is equivalent to do this.
|
|
bool Apply()
|
|
{
|
|
if ( m_style == m_styleCurrent )
|
|
return false;
|
|
|
|
::SetWindowLongPtr(m_hwnd, m_gwlSlot, m_style);
|
|
|
|
m_styleCurrent = m_style;
|
|
|
|
return true;
|
|
}
|
|
|
|
~wxMSWWinLongUpdater()
|
|
{
|
|
Apply();
|
|
}
|
|
|
|
protected:
|
|
// Create the object for updating the style or extended style of the given
|
|
// window.
|
|
//
|
|
// Ctor is protected, this class can only be used as wxMSWWinStyleUpdater
|
|
// or wxMSWWinExStyleUpdater.
|
|
wxMSWWinLongUpdater(HWND hwnd, int gwlSlot)
|
|
: m_hwnd(hwnd),
|
|
m_gwlSlot(gwlSlot),
|
|
m_styleCurrent(::GetWindowLongPtr(hwnd, gwlSlot)),
|
|
m_style(m_styleCurrent)
|
|
{
|
|
}
|
|
|
|
private:
|
|
const HWND m_hwnd;
|
|
const int m_gwlSlot;
|
|
|
|
LONG_PTR m_styleCurrent;
|
|
LONG_PTR m_style;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxMSWWinLongUpdater);
|
|
};
|
|
|
|
// A variant of wxMSWWinLongUpdater which updates the extended style.
|
|
class wxMSWWinStyleUpdater : public wxMSWWinLongUpdater
|
|
{
|
|
public:
|
|
explicit wxMSWWinStyleUpdater(HWND hwnd)
|
|
: wxMSWWinLongUpdater(hwnd, GWL_STYLE)
|
|
{
|
|
}
|
|
};
|
|
|
|
// A variant of wxMSWWinLongUpdater which updates the extended style.
|
|
class wxMSWWinExStyleUpdater : public wxMSWWinLongUpdater
|
|
{
|
|
public:
|
|
explicit wxMSWWinExStyleUpdater(HWND hwnd)
|
|
: wxMSWWinLongUpdater(hwnd, GWL_EXSTYLE)
|
|
{
|
|
}
|
|
};
|
|
|
|
#endif // _WX_MSW_PRIVATE_WINSTYLE_H_
|