Merge branch 'dpi-stc' of https://github.com/MaartenBent/wxWidgets
Fix and improve DPI handling in wxStyledTextCtrl. Fix cursor size after DPI change. Enable handling DPI events in wxSTCPopupWindow and other popup windows (that do not inherit from wxTopLevelWindow). Some cleanup of STC example, and add option to select drawing technology. See https://github.com/wxWidgets/wxWidgets/pull/1885
This commit is contained in:
@@ -2392,6 +2392,17 @@
|
||||
# endif
|
||||
#endif /* wxUSE_RICHTEXT */
|
||||
|
||||
#if wxUSE_RICHTOOLTIP
|
||||
# if !wxUSE_POPUPWIN
|
||||
# ifdef wxABORT_ON_CONFIG_ERROR
|
||||
# error "wxRichToolTip requires wxUSE_POPUPWIN"
|
||||
# else
|
||||
# undef wxUSE_POPUPWIN
|
||||
# define wxUSE_POPUPWIN 1
|
||||
# endif
|
||||
# endif
|
||||
#endif /* wxUSE_RICHTOOLTIP */
|
||||
|
||||
#if wxUSE_PROPGRID
|
||||
# if !wxUSE_VARIANT
|
||||
# ifdef wxABORT_ON_CONFIG_ERROR
|
||||
|
@@ -27,11 +27,27 @@ protected:
|
||||
virtual bool DoSetRegionShape(const wxRegion& region) wxOVERRIDE;
|
||||
#if wxUSE_GRAPHICS_CONTEXT
|
||||
virtual bool DoSetPathShape(const wxGraphicsPath& path) wxOVERRIDE;
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
|
||||
virtual WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE;
|
||||
virtual void InheritAttributes() wxOVERRIDE;
|
||||
|
||||
private:
|
||||
bool HandleDPIChange(const wxSize& newDPI, const wxRect& newRect);
|
||||
|
||||
#if wxUSE_GRAPHICS_CONTEXT
|
||||
wxNonOwnedWindowShapeImpl* m_shapeImpl;
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
|
||||
// Keep track of the DPI used in this window. So when per-monitor dpi
|
||||
// awareness is enabled, both old and new DPI are known for
|
||||
// wxDPIChangedEvent and wxWindow::MSWUpdateOnDPIChange.
|
||||
wxSize m_activeDPI;
|
||||
|
||||
// This window supports handling per-monitor DPI awareness when the
|
||||
// application manifest contains <dpiAwareness>PerMonitorV2</dpiAwareness>.
|
||||
bool m_perMonitorDPIaware;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxNonOwnedWindow);
|
||||
};
|
||||
|
||||
|
@@ -115,7 +115,7 @@ public:
|
||||
virtual WXHWND MSWGetParent() const wxOVERRIDE;
|
||||
|
||||
// window proc for the frames
|
||||
WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE;
|
||||
virtual WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE;
|
||||
|
||||
// returns true if the platform should explicitly apply a theme border
|
||||
virtual bool CanApplyThemeBorder() const wxOVERRIDE { return false; }
|
||||
@@ -166,9 +166,6 @@ protected:
|
||||
int& x, int& y,
|
||||
int& w, int& h) const wxOVERRIDE;
|
||||
|
||||
// WM_DPICHANGED handler.
|
||||
bool HandleDPIChange(const wxSize& newDPI, const wxRect& newRect);
|
||||
|
||||
// This field contains the show command to use when showing the window the
|
||||
// next time and also indicates whether the window should be considered
|
||||
// being iconized or maximized (which may be different from whether it's
|
||||
@@ -195,15 +192,6 @@ protected:
|
||||
wxWindowRef m_winLastFocused;
|
||||
|
||||
private:
|
||||
// Keep track of the DPI used in this window. So when per-monitor dpi
|
||||
// awareness is enabled, both old and new DPI are known for
|
||||
// wxDPIChangedEvent and wxWindow::MSWUpdateOnDPIChange.
|
||||
wxSize m_activeDPI;
|
||||
|
||||
// This window supports handling per-monitor DPI awareness when the
|
||||
// application manifest contains <dpiAwareness>PerMonitorV2</dpiAwareness>.
|
||||
bool m_perMonitorDPIaware;
|
||||
|
||||
// The system menu: initially NULL but can be set (once) by
|
||||
// MSWGetSystemMenu(). Owned by this window.
|
||||
wxMenu *m_menuSystem;
|
||||
|
@@ -24,11 +24,6 @@
|
||||
//============================================================================
|
||||
|
||||
#define DEFAULT_LANGUAGE "<default>"
|
||||
|
||||
#define PAGE_COMMON _("Common")
|
||||
#define PAGE_LANGUAGES _("Languages")
|
||||
#define PAGE_STYLE_TYPES _("Style types")
|
||||
|
||||
#define STYLE_TYPES_COUNT 32
|
||||
|
||||
|
||||
@@ -47,7 +42,6 @@ enum {
|
||||
myID_REPLACENEXT,
|
||||
myID_BRACEMATCH,
|
||||
myID_GOTO,
|
||||
myID_PAGEACTIVE,
|
||||
myID_DISPLAYEOL,
|
||||
myID_INDENTGUIDE,
|
||||
myID_LINENUMBER,
|
||||
@@ -76,29 +70,18 @@ enum {
|
||||
myID_MULTIPLE_SELECTIONS,
|
||||
myID_MULTI_PASTE,
|
||||
myID_MULTIPLE_SELECTIONS_TYPING,
|
||||
myID_TECHNOLOGY_DEFAULT,
|
||||
myID_TECHNOLOGY_DIRECTWRITE,
|
||||
myID_CUSTOM_POPUP,
|
||||
myID_USECHARSET,
|
||||
myID_CHARSETANSI,
|
||||
myID_CHARSETMAC,
|
||||
myID_PAGEPREV,
|
||||
myID_PAGENEXT,
|
||||
myID_SELECTLINE,
|
||||
myID_EDIT_LAST = myID_SELECTLINE,
|
||||
myID_WINDOW_MINIMAL,
|
||||
|
||||
// other IDs
|
||||
myID_STATUSBAR,
|
||||
myID_TITLEBAR,
|
||||
myID_ABOUTTIMER,
|
||||
myID_UPDATETIMER,
|
||||
|
||||
// dialog find IDs
|
||||
myID_DLG_FIND_TEXT,
|
||||
|
||||
// preferences IDs
|
||||
myID_PREFS_LANGUAGE,
|
||||
myID_PREFS_STYLETYPE,
|
||||
myID_PREFS_KEYWORDS,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -128,6 +128,8 @@ wxBEGIN_EVENT_TABLE (Edit, wxStyledTextCtrl)
|
||||
EVT_MENU(myID_MULTI_PASTE, Edit::OnMultiPaste)
|
||||
EVT_MENU(myID_MULTIPLE_SELECTIONS_TYPING, Edit::OnMultipleSelectionsTyping)
|
||||
EVT_MENU(myID_CUSTOM_POPUP, Edit::OnCustomPopup)
|
||||
EVT_MENU(myID_TECHNOLOGY_DEFAULT, Edit::OnTechnology)
|
||||
EVT_MENU(myID_TECHNOLOGY_DIRECTWRITE, Edit::OnTechnology)
|
||||
// stc
|
||||
EVT_STC_MARGINCLICK (wxID_ANY, Edit::OnMarginClick)
|
||||
EVT_STC_CHARADDED (wxID_ANY, Edit::OnCharAdded)
|
||||
@@ -196,7 +198,7 @@ Edit::Edit (wxWindow *parent, wxWindowID id,
|
||||
|
||||
// miscellaneous
|
||||
m_LineNrMargin = TextWidth (wxSTC_STYLE_LINENUMBER, "_999999");
|
||||
m_FoldingMargin = 16;
|
||||
m_FoldingMargin = FromDIP(16);
|
||||
CmdKeyClear (wxSTC_KEY_TAB, 0); // this is done by the menu accelerator key
|
||||
SetLayoutCache (wxSTC_CACHE_PAGE);
|
||||
UsePopUp(wxSTC_POPUP_ALL);
|
||||
@@ -480,6 +482,11 @@ void Edit::OnCustomPopup(wxCommandEvent& evt)
|
||||
UsePopUp(evt.IsChecked() ? wxSTC_POPUP_NEVER : wxSTC_POPUP_ALL);
|
||||
}
|
||||
|
||||
void Edit::OnTechnology(wxCommandEvent& event)
|
||||
{
|
||||
SetTechnology(event.GetId() == myID_TECHNOLOGY_DIRECTWRITE ? wxSTC_TECHNOLOGY_DIRECTWRITE : wxSTC_TECHNOLOGY_DEFAULT);
|
||||
}
|
||||
|
||||
//! misc
|
||||
void Edit::OnMarginClick (wxStyledTextEvent &event) {
|
||||
if (event.GetMargin() == 2) {
|
||||
|
@@ -102,6 +102,7 @@ public:
|
||||
void OnMultiPaste(wxCommandEvent& event);
|
||||
void OnMultipleSelectionsTyping(wxCommandEvent& event);
|
||||
void OnCustomPopup(wxCommandEvent& evt);
|
||||
void OnTechnology(wxCommandEvent& event);
|
||||
// stc
|
||||
void OnMarginClick (wxStyledTextEvent &event);
|
||||
void OnCharAdded (wxStyledTextEvent &event);
|
||||
@@ -115,7 +116,6 @@ public:
|
||||
//! language/lexer
|
||||
wxString DeterminePrefs (const wxString &filename);
|
||||
bool InitializePrefs (const wxString &filename);
|
||||
bool UserSettings (const wxString &filename);
|
||||
LanguageInfo const* GetLanguageInfo () {return m_language;}
|
||||
|
||||
//! load/save file
|
||||
|
@@ -63,12 +63,6 @@
|
||||
#define APP_LICENCE "wxWidgets"
|
||||
|
||||
#define APP_VERSION "0.1.alpha"
|
||||
#define APP_BUILD __DATE__
|
||||
|
||||
#define APP_WEBSITE "http://www.wxWidgets.org"
|
||||
#define APP_MAIL "mailto://???"
|
||||
|
||||
#define NONAME _("<untitled>")
|
||||
|
||||
class AppBook;
|
||||
|
||||
@@ -132,12 +126,8 @@ public:
|
||||
void OnClose (wxCloseEvent &event);
|
||||
void OnAbout (wxCommandEvent &event);
|
||||
void OnExit (wxCommandEvent &event);
|
||||
void OnTimerEvent (wxTimerEvent &event);
|
||||
//! file
|
||||
void OnFileNew (wxCommandEvent &event);
|
||||
void OnFileNewFrame (wxCommandEvent &event);
|
||||
void OnFileOpen (wxCommandEvent &event);
|
||||
void OnFileOpenFrame (wxCommandEvent &event);
|
||||
void OnFileSave (wxCommandEvent &event);
|
||||
void OnFileSaveAs (wxCommandEvent &event);
|
||||
void OnFileClose (wxCommandEvent &event);
|
||||
@@ -582,12 +572,17 @@ void AppFrame::CreateMenu ()
|
||||
menuExtra->AppendCheckItem(myID_MULTI_PASTE, _("Toggle multi-&paste"));
|
||||
menuExtra->AppendCheckItem(myID_MULTIPLE_SELECTIONS_TYPING, _("Toggle t&yping on multiple selections"));
|
||||
menuExtra->AppendSeparator();
|
||||
menuExtra->AppendCheckItem (myID_CUSTOM_POPUP, _("C&ustom popup menu"));
|
||||
#if defined(__WXMSW__) && wxUSE_GRAPHICS_DIRECT2D
|
||||
wxMenu* menuTechnology = new wxMenu;
|
||||
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DEFAULT, _("&Default"));
|
||||
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DIRECTWRITE, _("Direct&Write"));
|
||||
menuExtra->AppendSubMenu(menuTechnology, _("&Technology"));
|
||||
menuExtra->AppendSeparator();
|
||||
#endif
|
||||
menuExtra->AppendCheckItem (myID_CUSTOM_POPUP, _("C&ustom context menu"));
|
||||
|
||||
// Window menu
|
||||
wxMenu *menuWindow = new wxMenu;
|
||||
menuWindow->Append (myID_PAGEPREV, _("&Previous\tCtrl+Shift+Tab"));
|
||||
menuWindow->Append (myID_PAGENEXT, _("&Next\tCtrl+Tab"));
|
||||
menuWindow->Append(myID_WINDOW_MINIMAL, _("&Minimal editor"));
|
||||
|
||||
// Help menu
|
||||
@@ -763,7 +758,7 @@ public:
|
||||
}
|
||||
virtual bool SetFont(const wxFont& font) wxOVERRIDE
|
||||
{
|
||||
StyleSetFont(wxSTC_STYLE_DEFAULT, (wxFont&)font);
|
||||
StyleSetFont(wxSTC_STYLE_DEFAULT, font);
|
||||
return wxStyledTextCtrl::SetFont(font);
|
||||
}
|
||||
void SetLexerXml()
|
||||
@@ -823,7 +818,7 @@ public:
|
||||
MinimalEditorFrame() : wxFrame(NULL, wxID_ANY, _("Minimal Editor"))
|
||||
{
|
||||
MinimalEditor* editor = new MinimalEditor(this);
|
||||
editor->SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_FIXED_FONT));
|
||||
editor->SetFont(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
|
||||
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer->Add(editor, 1, wxEXPAND);
|
||||
SetSizer(sizer);
|
||||
|
@@ -36,6 +36,8 @@
|
||||
#include "wx/module.h"
|
||||
#endif
|
||||
|
||||
#include "wx/display.h"
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
#include "wx/msw/missing.h" // IDC_HAND
|
||||
|
||||
@@ -263,12 +265,20 @@ wxPoint wxCursor::GetHotSpot() const
|
||||
namespace
|
||||
{
|
||||
|
||||
void ReverseBitmap(HBITMAP bitmap, int width, int height)
|
||||
wxSize ScaleAndReverseBitmap(HBITMAP& bitmap, float scale)
|
||||
{
|
||||
BITMAP bmp;
|
||||
if ( !::GetObject(bitmap, sizeof(bmp), &bmp) )
|
||||
return wxSize();
|
||||
wxSize cs(bmp.bmWidth * scale, bmp.bmHeight * scale);
|
||||
|
||||
MemoryHDC hdc;
|
||||
SelectInHDC selBitmap(hdc, bitmap);
|
||||
::StretchBlt(hdc, width - 1, 0, -width, height,
|
||||
hdc, 0, 0, width, height, SRCCOPY);
|
||||
if ( scale != 1 )
|
||||
::SetStretchBltMode(hdc, HALFTONE);
|
||||
::StretchBlt(hdc, cs.x - 1, 0, -cs.x, cs.y, hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
|
||||
|
||||
return cs;
|
||||
}
|
||||
|
||||
HCURSOR CreateReverseCursor(HCURSOR cursor)
|
||||
@@ -277,14 +287,15 @@ HCURSOR CreateReverseCursor(HCURSOR cursor)
|
||||
if ( !info.GetFrom(cursor) )
|
||||
return NULL;
|
||||
|
||||
BITMAP bmp;
|
||||
if ( !::GetObject(info.hbmMask, sizeof(bmp), &bmp) )
|
||||
return NULL;
|
||||
const unsigned displayID = (unsigned)wxDisplay::GetFromPoint(wxGetMousePosition());
|
||||
wxDisplay disp(displayID == 0u || displayID < wxDisplay::GetCount() ? displayID : 0u);
|
||||
const float scale = (float)disp.GetPPI().y / wxGetDisplayPPI().y;
|
||||
|
||||
ReverseBitmap(info.hbmMask, bmp.bmWidth, bmp.bmHeight);
|
||||
wxSize cursorSize = ScaleAndReverseBitmap(info.hbmMask, scale);
|
||||
if ( info.hbmColor )
|
||||
ReverseBitmap(info.hbmColor, bmp.bmWidth, bmp.bmHeight);
|
||||
info.xHotspot = (DWORD)bmp.bmWidth - 1 - info.xHotspot;
|
||||
ScaleAndReverseBitmap(info.hbmColor, scale);
|
||||
info.xHotspot = (DWORD)(cursorSize.x - 1 - info.xHotspot * scale);
|
||||
info.yHotspot = (DWORD)(info.yHotspot * scale);
|
||||
|
||||
return ::CreateIconIndirect(&info);
|
||||
}
|
||||
|
@@ -36,7 +36,9 @@
|
||||
#include "wx/graphics.h"
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
|
||||
#include "wx/dynlib.h"
|
||||
#include "wx/scopedptr.h"
|
||||
#include "wx/msw/missing.h"
|
||||
|
||||
// ============================================================================
|
||||
// wxNonOwnedWindow implementation
|
||||
@@ -128,16 +130,6 @@ private:
|
||||
wxDECLARE_NO_COPY_CLASS(wxNonOwnedWindowShapeImpl);
|
||||
};
|
||||
|
||||
wxNonOwnedWindow::wxNonOwnedWindow()
|
||||
{
|
||||
m_shapeImpl = NULL;
|
||||
}
|
||||
|
||||
wxNonOwnedWindow::~wxNonOwnedWindow()
|
||||
{
|
||||
delete m_shapeImpl;
|
||||
}
|
||||
|
||||
bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath& path)
|
||||
{
|
||||
delete m_shapeImpl;
|
||||
@@ -146,17 +138,115 @@ bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath& path)
|
||||
return true;
|
||||
}
|
||||
|
||||
#else // !wxUSE_GRAPHICS_CONTEXT
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
|
||||
// Trivial ctor and dtor as we don't have anything to do when wxGraphicsContext
|
||||
// is not used but still define them here to avoid adding even more #if checks
|
||||
// to the header, it it doesn't do any harm even though it's not needed.
|
||||
wxNonOwnedWindow::wxNonOwnedWindow()
|
||||
{
|
||||
#if wxUSE_GRAPHICS_CONTEXT
|
||||
m_shapeImpl = NULL;
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
|
||||
m_activeDPI = wxDefaultSize;
|
||||
m_perMonitorDPIaware = false;
|
||||
}
|
||||
|
||||
wxNonOwnedWindow::~wxNonOwnedWindow()
|
||||
{
|
||||
#if wxUSE_GRAPHICS_CONTEXT
|
||||
delete m_shapeImpl;
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||
}
|
||||
|
||||
#endif // wxUSE_GRAPHICS_CONTEXT/!wxUSE_GRAPHICS_CONTEXT
|
||||
namespace
|
||||
{
|
||||
|
||||
static bool IsPerMonitorDPIAware(HWND hwnd)
|
||||
{
|
||||
bool dpiAware = false;
|
||||
|
||||
// Determine if 'Per Monitor v2' DPI awareness is enabled in the
|
||||
// applications manifest.
|
||||
#if wxUSE_DYNLIB_CLASS
|
||||
#define WXDPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((WXDPI_AWARENESS_CONTEXT)-4)
|
||||
typedef WXDPI_AWARENESS_CONTEXT(WINAPI * GetWindowDpiAwarenessContext_t)(HWND hwnd);
|
||||
typedef BOOL(WINAPI * AreDpiAwarenessContextsEqual_t)(WXDPI_AWARENESS_CONTEXT dpiContextA, WXDPI_AWARENESS_CONTEXT dpiContextB);
|
||||
static GetWindowDpiAwarenessContext_t s_pfnGetWindowDpiAwarenessContext = NULL;
|
||||
static AreDpiAwarenessContextsEqual_t s_pfnAreDpiAwarenessContextsEqual = NULL;
|
||||
static bool s_initDone = false;
|
||||
|
||||
if ( !s_initDone )
|
||||
{
|
||||
wxLoadedDLL dllUser32("user32.dll");
|
||||
wxDL_INIT_FUNC(s_pfn, GetWindowDpiAwarenessContext, dllUser32);
|
||||
wxDL_INIT_FUNC(s_pfn, AreDpiAwarenessContextsEqual, dllUser32);
|
||||
s_initDone = true;
|
||||
}
|
||||
|
||||
if ( s_pfnGetWindowDpiAwarenessContext && s_pfnAreDpiAwarenessContextsEqual )
|
||||
{
|
||||
WXDPI_AWARENESS_CONTEXT dpiAwarenessContext = s_pfnGetWindowDpiAwarenessContext(hwnd);
|
||||
|
||||
if ( s_pfnAreDpiAwarenessContextsEqual(dpiAwarenessContext, WXDPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) == TRUE )
|
||||
{
|
||||
dpiAware = true;
|
||||
}
|
||||
}
|
||||
#endif // wxUSE_DYNLIB_CLASS
|
||||
|
||||
return dpiAware;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void wxNonOwnedWindow::InheritAttributes()
|
||||
{
|
||||
m_activeDPI = GetDPI();
|
||||
m_perMonitorDPIaware = IsPerMonitorDPIAware(GetHwnd());
|
||||
|
||||
wxNonOwnedWindowBase::InheritAttributes();
|
||||
}
|
||||
|
||||
WXLRESULT wxNonOwnedWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
|
||||
{
|
||||
WXLRESULT rc = 0;
|
||||
bool processed = false;
|
||||
|
||||
switch ( message )
|
||||
{
|
||||
case WM_DPICHANGED:
|
||||
{
|
||||
const RECT* const prcNewWindow =
|
||||
reinterpret_cast<const RECT*>(lParam);
|
||||
|
||||
processed = HandleDPIChange(wxSize(LOWORD(wParam),
|
||||
HIWORD(wParam)),
|
||||
wxRectFromRECT(*prcNewWindow));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!processed)
|
||||
rc = wxNonOwnedWindowBase::MSWWindowProc(message, wParam, lParam);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool wxNonOwnedWindow::HandleDPIChange(const wxSize& newDPI, const wxRect& newRect)
|
||||
{
|
||||
if ( !m_perMonitorDPIaware )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( newDPI != m_activeDPI )
|
||||
{
|
||||
MSWUpdateOnDPIChange(m_activeDPI, newDPI);
|
||||
m_activeDPI = newDPI;
|
||||
}
|
||||
|
||||
SetSize(newRect);
|
||||
|
||||
Refresh();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -37,7 +37,6 @@
|
||||
#include "wx/module.h"
|
||||
#endif //WX_PRECOMP
|
||||
|
||||
#include "wx/dynlib.h"
|
||||
#include "wx/scopeguard.h"
|
||||
#include "wx/tooltip.h"
|
||||
|
||||
@@ -104,9 +103,6 @@ void wxTopLevelWindowMSW::Init()
|
||||
m_fsIsShowing = false;
|
||||
|
||||
m_menuSystem = NULL;
|
||||
|
||||
m_activeDPI = wxDefaultSize;
|
||||
m_perMonitorDPIaware = false;
|
||||
}
|
||||
|
||||
WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const
|
||||
@@ -249,26 +245,6 @@ WXHWND wxTopLevelWindowMSW::MSWGetParent() const
|
||||
return (WXHWND)hwndParent;
|
||||
}
|
||||
|
||||
bool wxTopLevelWindowMSW::HandleDPIChange(const wxSize& newDPI, const wxRect& newRect)
|
||||
{
|
||||
if ( !m_perMonitorDPIaware )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( newDPI != m_activeDPI )
|
||||
{
|
||||
MSWUpdateOnDPIChange(m_activeDPI, newDPI);
|
||||
m_activeDPI = newDPI;
|
||||
}
|
||||
|
||||
SetSize(newRect);
|
||||
|
||||
Refresh();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
|
||||
{
|
||||
WXLRESULT rc = 0;
|
||||
@@ -329,17 +305,6 @@ WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WX
|
||||
#endif // #ifndef __WXUNIVERSAL__
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DPICHANGED:
|
||||
{
|
||||
const RECT* const prcNewWindow =
|
||||
reinterpret_cast<const RECT*>(lParam);
|
||||
|
||||
processed = HandleDPIChange(wxSize(LOWORD(wParam),
|
||||
HIWORD(wParam)),
|
||||
wxRectFromRECT(*prcNewWindow));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( !processed )
|
||||
@@ -348,47 +313,6 @@ WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WX
|
||||
return rc;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
static bool IsPerMonitorDPIAware(HWND hwnd)
|
||||
{
|
||||
bool dpiAware = false;
|
||||
|
||||
// Determine if 'Per Monitor v2' DPI awareness is enabled in the
|
||||
// applications manifest.
|
||||
#if wxUSE_DYNLIB_CLASS
|
||||
#define WXDPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((WXDPI_AWARENESS_CONTEXT)-4)
|
||||
typedef WXDPI_AWARENESS_CONTEXT(WINAPI * GetWindowDpiAwarenessContext_t)(HWND hwnd);
|
||||
typedef BOOL(WINAPI * AreDpiAwarenessContextsEqual_t)(WXDPI_AWARENESS_CONTEXT dpiContextA, WXDPI_AWARENESS_CONTEXT dpiContextB);
|
||||
static GetWindowDpiAwarenessContext_t s_pfnGetWindowDpiAwarenessContext = NULL;
|
||||
static AreDpiAwarenessContextsEqual_t s_pfnAreDpiAwarenessContextsEqual = NULL;
|
||||
static bool s_initDone = false;
|
||||
|
||||
if ( !s_initDone )
|
||||
{
|
||||
wxLoadedDLL dllUser32("user32.dll");
|
||||
wxDL_INIT_FUNC(s_pfn, GetWindowDpiAwarenessContext, dllUser32);
|
||||
wxDL_INIT_FUNC(s_pfn, AreDpiAwarenessContextsEqual, dllUser32);
|
||||
s_initDone = true;
|
||||
}
|
||||
|
||||
if ( s_pfnGetWindowDpiAwarenessContext && s_pfnAreDpiAwarenessContextsEqual )
|
||||
{
|
||||
WXDPI_AWARENESS_CONTEXT dpiAwarenessContext = s_pfnGetWindowDpiAwarenessContext(hwnd);
|
||||
|
||||
if ( s_pfnAreDpiAwarenessContextsEqual(dpiAwarenessContext, WXDPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) == TRUE )
|
||||
{
|
||||
dpiAware = true;
|
||||
}
|
||||
}
|
||||
#endif // wxUSE_DYNLIB_CLASS
|
||||
|
||||
return dpiAware;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
|
||||
const wxString& title,
|
||||
const wxPoint& pos,
|
||||
@@ -559,9 +483,7 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent,
|
||||
EnableCloseButton(false);
|
||||
}
|
||||
|
||||
m_activeDPI = GetDPI();
|
||||
|
||||
m_perMonitorDPIaware = IsPerMonitorDPIAware(GetHwnd());
|
||||
InheritAttributes();
|
||||
|
||||
// for standard dialogs the dialog manager generates WM_CHANGEUISTATE
|
||||
// itself but for custom windows we have to do it ourselves in order to
|
||||
|
@@ -3696,6 +3696,7 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result,
|
||||
}
|
||||
break;
|
||||
|
||||
#if wxUSE_POPUPWIN
|
||||
case WM_NCACTIVATE:
|
||||
// When we're losing activation to our own popup window, we want to
|
||||
// retain the "active" appearance of the title bar, as dropping
|
||||
@@ -3712,6 +3713,7 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result,
|
||||
processed = true;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if wxUSE_UXTHEME
|
||||
// If we want the default themed border then we need to draw it ourselves
|
||||
|
@@ -103,6 +103,8 @@ wxColour wxColourFromCDandAlpha(ColourDesired& cd, int alpha) {
|
||||
namespace
|
||||
{
|
||||
|
||||
inline wxWindow* GETWIN(WindowID id) { return (wxWindow*)id; }
|
||||
|
||||
// wxFont with ascent cached, a pointer to this type is stored in Font::fid.
|
||||
class wxFontWithAscent : public wxFont
|
||||
{
|
||||
@@ -291,21 +293,21 @@ void SurfaceImpl::Init(SurfaceID hdc_, WindowID) {
|
||||
|
||||
void SurfaceImpl::InitPixMap(int width, int height, Surface *surface, WindowID winid) {
|
||||
Release();
|
||||
if (surface)
|
||||
hdc = new wxMemoryDC(static_cast<SurfaceImpl*>(surface)->hdc);
|
||||
else
|
||||
hdc = new wxMemoryDC();
|
||||
wxMemoryDC* mdc = surface
|
||||
? new wxMemoryDC(static_cast<SurfaceImpl*>(surface)->hdc)
|
||||
: new wxMemoryDC();
|
||||
mdc->GetImpl()->SetWindow(GETWIN(winid));
|
||||
hdc = mdc;
|
||||
hdcOwned = true;
|
||||
if (width < 1) width = 1;
|
||||
if (height < 1) height = 1;
|
||||
#ifdef __WXMSW__
|
||||
bitmap = new wxBitmap(width, height);
|
||||
wxUnusedVar(winid);
|
||||
#else
|
||||
bitmap = new wxBitmap();
|
||||
bitmap->CreateScaled(width, height,wxBITMAP_SCREEN_DEPTH,((wxWindow*)winid)->GetContentScaleFactor());
|
||||
bitmap->CreateScaled(width, height,wxBITMAP_SCREEN_DEPTH,(GETWIN(winid))->GetContentScaleFactor());
|
||||
#endif
|
||||
((wxMemoryDC*)hdc)->SelectObject(*bitmap);
|
||||
mdc->SelectObject(*bitmap);
|
||||
}
|
||||
|
||||
|
||||
@@ -999,7 +1001,6 @@ public:
|
||||
|
||||
// helpers
|
||||
void SetFont(Font &font_);
|
||||
void SetScale(wxDC* dc);
|
||||
HRESULT FlushDrawing();
|
||||
void D2DPenColour(ColourDesired fore, int alpha=255);
|
||||
void DrawTextCommon(PRectangle rc, Font &font_, XYPOSITION ybase,
|
||||
@@ -1057,19 +1058,18 @@ SurfaceD2D::~SurfaceD2D()
|
||||
Release();
|
||||
}
|
||||
|
||||
void SurfaceD2D::Init(WindowID WXUNUSED(wid))
|
||||
void SurfaceD2D::Init(WindowID wid)
|
||||
{
|
||||
Release();
|
||||
|
||||
wxScreenDC sdc;
|
||||
SetScale(&sdc);
|
||||
m_logPixelsY = GETWIN(wid)->GetDPI().GetY();
|
||||
}
|
||||
|
||||
void SurfaceD2D::Init(SurfaceID sid, WindowID wid)
|
||||
{
|
||||
Release();
|
||||
|
||||
wxWindow* win = wxDynamicCast(wid,wxWindow);
|
||||
wxWindow* win = GETWIN(wid);
|
||||
if ( win && win->GetName() == "wxSTCCallTip" )
|
||||
win = win->GetParent();
|
||||
|
||||
@@ -1078,7 +1078,7 @@ void SurfaceD2D::Init(SurfaceID sid, WindowID wid)
|
||||
{
|
||||
wxDC* const dc = static_cast<wxDC*>(sid);
|
||||
const wxSize sz = dc->GetSize();
|
||||
SetScale(dc);
|
||||
m_logPixelsY = win->GetDPI().GetY();
|
||||
ScintillaWX* const
|
||||
sciwx = reinterpret_cast<ScintillaWX*>(stc->GetDirectPointer());
|
||||
m_surfaceData = static_cast<SurfaceDataD2D*>(sciwx->GetSurfaceData());
|
||||
@@ -1773,12 +1773,6 @@ void SurfaceD2D::SetFont(Font &font_)
|
||||
}
|
||||
}
|
||||
|
||||
void SurfaceD2D::SetScale(wxDC* dc)
|
||||
{
|
||||
wxSize sz = dc->GetPPI();
|
||||
m_logPixelsY = sz.GetY();
|
||||
}
|
||||
|
||||
HRESULT SurfaceD2D::FlushDrawing()
|
||||
{
|
||||
return m_pRenderTarget->Flush();
|
||||
@@ -1861,8 +1855,6 @@ Surface *Surface::Allocate(int technology) {
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
|
||||
inline wxWindow* GETWIN(WindowID id) { return (wxWindow*)id; }
|
||||
|
||||
Window::~Window() {
|
||||
}
|
||||
|
||||
@@ -1914,7 +1906,6 @@ void Window::SetPositionRelative(PRectangle rc, Window relativeTo) {
|
||||
if (position.y + height > displayRect.GetBottom())
|
||||
position.y = displayRect.GetBottom() - height;
|
||||
|
||||
position = relativeWin->ScreenToClient(position);
|
||||
wxWindow *window = GETWIN(wid);
|
||||
window->SetSize(position.x, position.y, width, height);
|
||||
}
|
||||
@@ -1975,9 +1966,9 @@ void Window::SetCursor(Cursor curs) {
|
||||
break;
|
||||
}
|
||||
|
||||
wxCursor wc = wxCursor(cursorId);
|
||||
if(curs != cursorLast)
|
||||
{
|
||||
wxCursor wc = wxCursor(cursorId);
|
||||
GETWIN(wid)->SetCursor(wc);
|
||||
cursorLast = curs;
|
||||
}
|
||||
@@ -2170,7 +2161,7 @@ PRectangle Window::GetMonitorRect(Point pt) {
|
||||
#ifdef __WXMSW__
|
||||
|
||||
// Use ShowWithoutActivating instead of show.
|
||||
bool wxSTCPopupBase::Show(bool show) wxOVERRIDE
|
||||
bool wxSTCPopupBase::Show(bool show)
|
||||
{
|
||||
if ( show )
|
||||
{
|
||||
@@ -2188,7 +2179,7 @@ PRectangle Window::GetMonitorRect(Point pt) {
|
||||
|
||||
// Do not activate in response to mouse clicks on this window.
|
||||
bool wxSTCPopupBase::MSWHandleMessage(WXLRESULT *res, WXUINT msg,
|
||||
WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE
|
||||
WXWPARAM wParam, WXLPARAM lParam)
|
||||
{
|
||||
if ( msg == WM_MOUSEACTIVATE )
|
||||
{
|
||||
@@ -2227,7 +2218,9 @@ PRectangle Window::GetMonitorRect(Point pt) {
|
||||
#endif // __WXOSX_COCOA__
|
||||
|
||||
wxSTCPopupWindow::wxSTCPopupWindow(wxWindow* parent)
|
||||
:wxSTCPopupBase(parent), m_lastKnownPosition(wxDefaultPosition)
|
||||
: wxSTCPopupBase(parent)
|
||||
, m_relPos(wxDefaultPosition)
|
||||
, m_absPos(wxDefaultPosition)
|
||||
{
|
||||
#if !wxSTC_POPUP_IS_CUSTOM
|
||||
Bind(wxEVT_SET_FOCUS, &wxSTCPopupWindow::OnFocus, this);
|
||||
@@ -2278,22 +2271,20 @@ bool wxSTCPopupWindow::AcceptsFocus() const
|
||||
|
||||
void wxSTCPopupWindow::DoSetSize(int x, int y, int width, int height, int flags)
|
||||
{
|
||||
m_lastKnownPosition = wxPoint(x, y);
|
||||
wxPoint pos(x, y);
|
||||
if ( pos.IsFullySpecified() && !m_relPos.IsFullySpecified() )
|
||||
{
|
||||
m_relPos = GetParent()->ScreenToClient(pos);
|
||||
}
|
||||
|
||||
// convert coords to screen coords since we're a top-level window
|
||||
if (x != wxDefaultCoord)
|
||||
GetParent()->ClientToScreen(&x, NULL);
|
||||
m_absPos = GetParent()->ClientToScreen(m_relPos);
|
||||
|
||||
if (y != wxDefaultCoord)
|
||||
GetParent()->ClientToScreen(NULL, &y);
|
||||
|
||||
wxSTCPopupBase::DoSetSize(x, y, width, height, flags);
|
||||
wxSTCPopupBase::DoSetSize(m_absPos.x, m_absPos.y, width, height, flags);
|
||||
}
|
||||
|
||||
void wxSTCPopupWindow::OnParentMove(wxMoveEvent& event)
|
||||
{
|
||||
if ( m_lastKnownPosition.IsFullySpecified() )
|
||||
SetPosition(m_lastKnownPosition);
|
||||
SetPosition(m_absPos);
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
@@ -2657,6 +2648,7 @@ protected:
|
||||
void OnSelection(wxCommandEvent&);
|
||||
void OnDClick(wxCommandEvent&);
|
||||
void OnSysColourChanged(wxSysColourChangedEvent& event);
|
||||
void OnDPIChanged(wxDPIChangedEvent& event);
|
||||
void OnMouseMotion(wxMouseEvent& event);
|
||||
void OnMouseLeaveWindow(wxMouseEvent& event);
|
||||
|
||||
@@ -2712,6 +2704,7 @@ wxSTCListBox::wxSTCListBox(wxWindow* parent, wxSTCListBoxVisualData* v, int ht)
|
||||
Bind(wxEVT_LISTBOX, &wxSTCListBox::OnSelection, this);
|
||||
Bind(wxEVT_LISTBOX_DCLICK, &wxSTCListBox::OnDClick, this);
|
||||
Bind(wxEVT_SYS_COLOUR_CHANGED, &wxSTCListBox::OnSysColourChanged, this);
|
||||
Bind(wxEVT_DPI_CHANGED, &wxSTCListBox::OnDPIChanged, this);
|
||||
|
||||
if ( m_visualData->HasListCtrlAppearance() )
|
||||
{
|
||||
@@ -2951,6 +2944,18 @@ void wxSTCListBox::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event))
|
||||
GetParent()->Refresh();
|
||||
}
|
||||
|
||||
void wxSTCListBox::OnDPIChanged(wxDPIChangedEvent& WXUNUSED(event))
|
||||
{
|
||||
m_imagePadding = FromDIP(1);
|
||||
m_textBoxToTextGap = FromDIP(3);
|
||||
m_textExtraVerticalPadding = FromDIP(1);
|
||||
|
||||
int w;
|
||||
GetTextExtent(EXTENT_TEST, &w, &m_textHeight);
|
||||
|
||||
RecalculateItemHeight();
|
||||
}
|
||||
|
||||
void wxSTCListBox::OnMouseLeaveWindow(wxMouseEvent& event)
|
||||
{
|
||||
const int old = m_currentRow;
|
||||
|
@@ -150,7 +150,8 @@ protected:
|
||||
#endif
|
||||
|
||||
private:
|
||||
wxPoint m_lastKnownPosition;
|
||||
wxPoint m_relPos;
|
||||
wxPoint m_absPos;
|
||||
wxWindow* m_tlw;
|
||||
};
|
||||
|
||||
|
@@ -1039,7 +1039,7 @@ void ScintillaWX::DoGainFocus(){
|
||||
CreateSystemCaret();
|
||||
}
|
||||
|
||||
void ScintillaWX::DoSysColourChange() {
|
||||
void ScintillaWX::DoInvalidateStyleData() {
|
||||
InvalidateStyleData();
|
||||
}
|
||||
|
||||
|
@@ -161,7 +161,7 @@ public:
|
||||
void DoSize(int width, int height);
|
||||
void DoLoseFocus();
|
||||
void DoGainFocus();
|
||||
void DoSysColourChange();
|
||||
void DoInvalidateStyleData();
|
||||
void DoLeftButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
|
||||
void DoRightButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
|
||||
void DoLeftButtonUp(Point pt, unsigned int curTime, bool ctrl);
|
||||
|
@@ -240,18 +240,6 @@ bool wxStyledTextCtrl::Create(wxWindow *parent,
|
||||
SetFontQuality(wxSTC_EFF_QUALITY_DEFAULT);
|
||||
#endif
|
||||
|
||||
#ifdef __WXMSW__
|
||||
// Set initial zoom for active DPI
|
||||
const HDC hdc = ::GetDC(parent->GetHWND());
|
||||
const int baseDPI = ::GetDeviceCaps(hdc, LOGPIXELSY);
|
||||
const int activeDPI = parent->GetDPI().y;
|
||||
::ReleaseDC(parent->GetHWND(), hdc);
|
||||
|
||||
const int ptSizeOld = StyleGetSize(wxSTC_STYLE_DEFAULT);
|
||||
const int ptSizeNew = (int)wxMulDivInt32(ptSizeOld, activeDPI, baseDPI);
|
||||
SetZoom(GetZoom() + (ptSizeNew - ptSizeOld));
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -5445,21 +5433,31 @@ void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) {
|
||||
}
|
||||
|
||||
|
||||
void wxStyledTextCtrl::OnDPIChanged(wxDPIChangedEvent& evt)
|
||||
{
|
||||
int ptSizeOld = StyleGetSize(wxSTC_STYLE_DEFAULT);
|
||||
int ptSizeNew = (int)wxMulDivInt32(ptSizeOld, evt.GetNewDPI().y, evt.GetOldDPI().y);
|
||||
SetZoom(GetZoom() + (ptSizeNew - ptSizeOld));
|
||||
void wxStyledTextCtrl::OnDPIChanged(wxDPIChangedEvent& evt) {
|
||||
m_swx->DoInvalidateStyleData();
|
||||
|
||||
// trigger a cursor change, so any cursors created by wxWidgets (like reverse arrow) will be recreated
|
||||
const int oldCursor = GetSTCCursor();
|
||||
SetSTCCursor(-1);
|
||||
SetSTCCursor(oldCursor);
|
||||
|
||||
// adjust the margins to the new DPI
|
||||
for ( int i = 0; i < SC_MAX_MARGIN; ++i )
|
||||
{
|
||||
SetMarginWidth(i, (int)wxMulDivInt32(GetMarginWidth(i), evt.GetNewDPI().y, evt.GetOldDPI().y));
|
||||
}
|
||||
|
||||
// Hide auto-complete popup, there is no (easy) way to set it to the correct size
|
||||
// and position
|
||||
if ( AutoCompActive() )
|
||||
{
|
||||
AutoCompCancel();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(evt)) {
|
||||
m_swx->DoSysColourChange();
|
||||
m_swx->DoInvalidateStyleData();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -240,18 +240,6 @@ bool wxStyledTextCtrl::Create(wxWindow *parent,
|
||||
SetFontQuality(wxSTC_EFF_QUALITY_DEFAULT);
|
||||
#endif
|
||||
|
||||
#ifdef __WXMSW__
|
||||
// Set initial zoom for active DPI
|
||||
const HDC hdc = ::GetDC(parent->GetHWND());
|
||||
const int baseDPI = ::GetDeviceCaps(hdc, LOGPIXELSY);
|
||||
const int activeDPI = parent->GetDPI().y;
|
||||
::ReleaseDC(parent->GetHWND(), hdc);
|
||||
|
||||
const int ptSizeOld = StyleGetSize(wxSTC_STYLE_DEFAULT);
|
||||
const int ptSizeNew = (int)wxMulDivInt32(ptSizeOld, activeDPI, baseDPI);
|
||||
SetZoom(GetZoom() + (ptSizeNew - ptSizeOld));
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -972,21 +960,31 @@ void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) {
|
||||
}
|
||||
|
||||
|
||||
void wxStyledTextCtrl::OnDPIChanged(wxDPIChangedEvent& evt)
|
||||
{
|
||||
int ptSizeOld = StyleGetSize(wxSTC_STYLE_DEFAULT);
|
||||
int ptSizeNew = (int)wxMulDivInt32(ptSizeOld, evt.GetNewDPI().y, evt.GetOldDPI().y);
|
||||
SetZoom(GetZoom() + (ptSizeNew - ptSizeOld));
|
||||
void wxStyledTextCtrl::OnDPIChanged(wxDPIChangedEvent& evt) {
|
||||
m_swx->DoInvalidateStyleData();
|
||||
|
||||
// trigger a cursor change, so any cursors created by wxWidgets (like reverse arrow) will be recreated
|
||||
const int oldCursor = GetSTCCursor();
|
||||
SetSTCCursor(-1);
|
||||
SetSTCCursor(oldCursor);
|
||||
|
||||
// adjust the margins to the new DPI
|
||||
for ( int i = 0; i < SC_MAX_MARGIN; ++i )
|
||||
{
|
||||
SetMarginWidth(i, (int)wxMulDivInt32(GetMarginWidth(i), evt.GetNewDPI().y, evt.GetOldDPI().y));
|
||||
}
|
||||
|
||||
// Hide auto-complete popup, there is no (easy) way to set it to the correct size
|
||||
// and position
|
||||
if ( AutoCompActive() )
|
||||
{
|
||||
AutoCompCancel();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(evt)) {
|
||||
m_swx->DoSysColourChange();
|
||||
m_swx->DoInvalidateStyleData();
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user