Add wxIconEx

This simplifies loading DPI-aware icons.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman
2025-11-04 15:48:19 +01:00
parent 79ec083650
commit fd16ef2909
6 changed files with 197 additions and 116 deletions

View File

@@ -1,83 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<wxExtendVersion>15</wxExtendVersion>
</PropertyGroup>
<PropertyGroup>
<OutDir>..\..\..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<POCompile>
<OutputFile>$(OutDir)..\locale\%(Filename)\$(ProjectName)$(wxExtendVersion).mo</OutputFile>
</POCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\appbar.cpp" />
<ClCompile Include="..\src\comutils.cpp" />
<ClCompile Include="..\src\crypto.cpp" />
<ClCompile Include="..\src\framemanager.cpp" />
<ClCompile Include="..\src\hex.cpp" />
<ClCompile Include="..\src\pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\src\tlwgeom.cpp" />
<ClCompile Include="..\src\url.cpp" />
<ClCompile Include="..\src\valhex.cpp" />
<ClCompile Include="..\src\valnet.cpp" />
<ClCompile Include="..\src\xml.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\include\wxex\appbar.h" />
<ClInclude Include="..\include\wxex\aui\framemanager.h" />
<ClInclude Include="..\include\wxex\common.h" />
<ClInclude Include="..\include\wxex\comutils.h" />
<ClInclude Include="..\include\wxex\crypto.h" />
<ClInclude Include="..\include\wxex\hex.h" />
<ClInclude Include="..\include\wxex\object.h" />
<ClInclude Include="..\include\wxex\persist\auimanager.h" />
<ClInclude Include="..\include\wxex\persist\toplevel.h" />
<ClInclude Include="..\include\wxex\private\tlwgeom.h" />
<ClInclude Include="..\include\wxex\url.h" />
<ClInclude Include="..\include\wxex\valhex.h" />
<ClInclude Include="..\include\wxex\valnet.h" />
<ClInclude Include="..\include\wxex\xml.h" />
<ClInclude Include="..\src\pch.h" />
</ItemGroup>
<ItemGroup>
<POCompile Include="..\locale\bg_BG.po" />
<POCompile Include="..\locale\ca_ES.po" />
<POCompile Include="..\locale\cs_CZ.po" />
<POCompile Include="..\locale\cy_UK.po" />
<POCompile Include="..\locale\de_DE.po" />
<POCompile Include="..\locale\el_GR.po" />
<POCompile Include="..\locale\es_ES.po" />
<POCompile Include="..\locale\et_EE.po" />
<POCompile Include="..\locale\eu_ES.po" />
<POCompile Include="..\locale\fi_FI.po" />
<POCompile Include="..\locale\fr_CA.po" />
<POCompile Include="..\locale\fr_FR.po" />
<POCompile Include="..\locale\gl_ES.po" />
<POCompile Include="..\locale\hr_HR.po" />
<POCompile Include="..\locale\hu_HU.po" />
<POCompile Include="..\locale\is_IS.po" />
<POCompile Include="..\locale\it_IT.po" />
<POCompile Include="..\locale\ko_KR.po" />
<POCompile Include="..\locale\lt_LT.po" />
<POCompile Include="..\locale\nb_NO.po" />
<POCompile Include="..\locale\nl_NL.po" />
<POCompile Include="..\locale\pl_PL.po" />
<POCompile Include="..\locale\pt_PT.po" />
<POCompile Include="..\locale\ru_RU.po" />
<POCompile Include="..\locale\sk_SK.po" />
<POCompile Include="..\locale\ro_RO.po" />
<POCompile Include="..\locale\sl_SI.po" />
<POCompile Include="..\locale\sr_RS.po" />
<POCompile Include="..\locale\sv_SE.po" />
<POCompile Include="..\locale\tr_TR.po" />
<POCompile Include="..\locale\vi_VN.po" />
</ItemGroup>
<ItemGroup>
<None Include="..\locale\wxExtend.pot" />
</ItemGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<wxExtendVersion>15</wxExtendVersion>
</PropertyGroup>
<PropertyGroup>
<OutDir>..\..\..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<POCompile>
<OutputFile>$(OutDir)..\locale\%(Filename)\$(ProjectName)$(wxExtendVersion).mo</OutputFile>
</POCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\appbar.cpp" />
<ClCompile Include="..\src\comutils.cpp" />
<ClCompile Include="..\src\crypto.cpp" />
<ClCompile Include="..\src\framemanager.cpp" />
<ClCompile Include="..\src\hex.cpp" />
<ClCompile Include="..\src\icon.cpp" />
<ClCompile Include="..\src\pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\src\tlwgeom.cpp" />
<ClCompile Include="..\src\url.cpp" />
<ClCompile Include="..\src\valhex.cpp" />
<ClCompile Include="..\src\valnet.cpp" />
<ClCompile Include="..\src\xml.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\include\wxex\appbar.h" />
<ClInclude Include="..\include\wxex\aui\framemanager.h" />
<ClInclude Include="..\include\wxex\common.h" />
<ClInclude Include="..\include\wxex\comutils.h" />
<ClInclude Include="..\include\wxex\crypto.h" />
<ClInclude Include="..\include\wxex\hex.h" />
<ClInclude Include="..\include\wxex\icon.h" />
<ClInclude Include="..\include\wxex\object.h" />
<ClInclude Include="..\include\wxex\persist\auimanager.h" />
<ClInclude Include="..\include\wxex\persist\toplevel.h" />
<ClInclude Include="..\include\wxex\private\tlwgeom.h" />
<ClInclude Include="..\include\wxex\url.h" />
<ClInclude Include="..\include\wxex\valhex.h" />
<ClInclude Include="..\include\wxex\valnet.h" />
<ClInclude Include="..\include\wxex\xml.h" />
<ClInclude Include="..\src\pch.h" />
</ItemGroup>
<ItemGroup>
<POCompile Include="..\locale\bg_BG.po" />
<POCompile Include="..\locale\ca_ES.po" />
<POCompile Include="..\locale\cs_CZ.po" />
<POCompile Include="..\locale\cy_UK.po" />
<POCompile Include="..\locale\de_DE.po" />
<POCompile Include="..\locale\el_GR.po" />
<POCompile Include="..\locale\es_ES.po" />
<POCompile Include="..\locale\et_EE.po" />
<POCompile Include="..\locale\eu_ES.po" />
<POCompile Include="..\locale\fi_FI.po" />
<POCompile Include="..\locale\fr_CA.po" />
<POCompile Include="..\locale\fr_FR.po" />
<POCompile Include="..\locale\gl_ES.po" />
<POCompile Include="..\locale\hr_HR.po" />
<POCompile Include="..\locale\hu_HU.po" />
<POCompile Include="..\locale\is_IS.po" />
<POCompile Include="..\locale\it_IT.po" />
<POCompile Include="..\locale\ko_KR.po" />
<POCompile Include="..\locale\lt_LT.po" />
<POCompile Include="..\locale\nb_NO.po" />
<POCompile Include="..\locale\nl_NL.po" />
<POCompile Include="..\locale\pl_PL.po" />
<POCompile Include="..\locale\pt_PT.po" />
<POCompile Include="..\locale\ru_RU.po" />
<POCompile Include="..\locale\sk_SK.po" />
<POCompile Include="..\locale\ro_RO.po" />
<POCompile Include="..\locale\sl_SI.po" />
<POCompile Include="..\locale\sr_RS.po" />
<POCompile Include="..\locale\sv_SE.po" />
<POCompile Include="..\locale\tr_TR.po" />
<POCompile Include="..\locale\vi_VN.po" />
</ItemGroup>
<ItemGroup>
<None Include="..\locale\wxExtend.pot" />
</ItemGroup>
</Project>

View File

@@ -61,6 +61,9 @@
<ClCompile Include="..\src\tlwgeom.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\icon.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\pch.h">
@@ -111,6 +114,9 @@
<ClInclude Include="..\include\wxex\persist\toplevel.h">
<Filter>Header Files\persist</Filter>
</ClInclude>
<ClInclude Include="..\include\wxex\icon.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\locale\wxExtend.pot">

View File

@@ -61,6 +61,9 @@
<ClCompile Include="..\src\tlwgeom.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\icon.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\pch.h">
@@ -111,6 +114,9 @@
<ClInclude Include="..\include\wxex\persist\toplevel.h">
<Filter>Header Files\persist</Filter>
</ClInclude>
<ClInclude Include="..\include\wxex\icon.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\locale\wxExtend.pot">

27
include/wxex/icon.h Normal file
View File

@@ -0,0 +1,27 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2025 Amebis
*/
#pragma once
#include "common.h"
#include <codeanalysis\warnings.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/msw/icon.h>
#pragma warning(pop)
///
/// Icon for DPI aware applications
///
class wxIconEx : public wxIcon
{
public:
wxIconEx(const wxString& name,
wxBitmapType type = wxICON_DEFAULT_TYPE,
int desiredWidth = -1, int desiredHeight = -1,
wxWindowBase *window = nullptr);
};

39
src/icon.cpp Normal file
View File

@@ -0,0 +1,39 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2025 Amebis
*/
#include "pch.h"
static wxSize GetDPIHelper(const wxWindowBase* w)
{
wxSize dpi;
if ( w )
dpi = w->GetDPI();
if ( !dpi.x || !dpi.y )
dpi = wxDisplay().GetPPI();
if ( !dpi.x || !dpi.y )
dpi = wxDisplay::GetStdPPI();
return dpi;
}
wxIconEx::wxIconEx(const wxString& name,
wxBitmapType type,
int desiredWidth, int desiredHeight,
wxWindowBase *window)
{
wxSize dpi = GetDPIHelper(window);
wxSize baseline = wxDisplay::GetStdPPI();
if (desiredWidth != wxDefaultCoord)
desiredWidth = wxMulDivInt32(desiredWidth, dpi.x, baseline.x);
if (desiredHeight != wxDefaultCoord)
desiredHeight = wxMulDivInt32(desiredHeight, dpi.y, baseline.y);
LoadFile(name, type, desiredWidth, desiredHeight);
SetScaleFactor((double)dpi.y / (double)baseline.y);
}

View File

@@ -1,34 +1,35 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
Copyright © 2016 GÉANT
*/
#pragma once
// Since including <wx/app.h> introduces wrong include order in 3.0.2,
// include the grand <wx/wx.h> at a cost of longer pre-compilation phase.
#include <codeanalysis\warnings.h>
#pragma warning(push)
#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS 26812 26814)
#include <wx/wx.h>
#pragma warning(pop)
#include "../include/wxex/aui/framemanager.h"
#include "../include/wxex/persist/auimanager.h"
#include "../include/wxex/persist/toplevel.h"
#include "../include/wxex/appbar.h"
#include "../include/wxex/comutils.h"
#include "../include/wxex/crypto.h"
#include "../include/wxex/hex.h"
#include "../include/wxex/object.h"
#include "../include/wxex/url.h"
#include "../include/wxex/valhex.h"
#include "../include/wxex/valnet.h"
#include "../include/wxex/xml.h"
#include "../include/wxex/common.h"
#include "../include/wxex/private/tlwgeom.h"
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
Copyright © 2016 GÉANT
*/
#pragma once
// Since including <wx/app.h> introduces wrong include order in 3.0.2,
// include the grand <wx/wx.h> at a cost of longer pre-compilation phase.
#include <codeanalysis\warnings.h>
#pragma warning(push)
#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS 26812 26814)
#include <wx/wx.h>
#pragma warning(pop)
#include "../include/wxex/aui/framemanager.h"
#include "../include/wxex/persist/auimanager.h"
#include "../include/wxex/persist/toplevel.h"
#include "../include/wxex/appbar.h"
#include "../include/wxex/comutils.h"
#include "../include/wxex/crypto.h"
#include "../include/wxex/hex.h"
#include "../include/wxex/icon.h"
#include "../include/wxex/object.h"
#include "../include/wxex/url.h"
#include "../include/wxex/valhex.h"
#include "../include/wxex/valnet.h"
#include "../include/wxex/xml.h"
#include "../include/wxex/common.h"
#include "../include/wxex/private/tlwgeom.h"