Last active
July 8, 2019 09:26
-
-
Save APodlinny/179b90b9e0d45ea9576d33dca2273dce to your computer and use it in GitHub Desktop.
MinimalDpiTest
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#undef _WIN32_WINNT | |
#define _WIN32_WINNT 0x0603 | |
#define WM_DPICHANGED 0x02E0 | |
#include <shellscalingapi.h> | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
HINSTANCE hInst; | |
float dpiScale = 1.f; | |
int wndPos = 100; | |
int wndSize = 500; | |
ATOM MyRegisterClass(HINSTANCE hInstance); | |
BOOL InitInstance(HINSTANCE, int); | |
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPTSTR, _In_ int nCmdShow); | |
int main() { | |
return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW); | |
} | |
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPTSTR, _In_ int nCmdShow) | |
{ | |
::SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); | |
MyRegisterClass(hInstance); | |
InitInstance(hInstance, nCmdShow); | |
MSG msg; | |
while (::GetMessage(&msg, NULL, 0, 0)) | |
{ | |
::TranslateMessage(&msg); | |
::DispatchMessage(&msg); | |
} | |
return (int) msg.wParam; | |
} | |
ATOM MyRegisterClass(HINSTANCE hInstance) | |
{ | |
WNDCLASSEX wcex; | |
wcex.cbSize = sizeof(WNDCLASSEX); | |
wcex.style = CS_HREDRAW | CS_VREDRAW; | |
wcex.lpfnWndProc = WndProc; | |
wcex.cbClsExtra = 0; | |
wcex.cbWndExtra = 0; | |
wcex.hInstance = hInstance; | |
wcex.hIcon = NULL; | |
wcex.hCursor = NULL; | |
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); | |
wcex.lpszMenuName = NULL; | |
wcex.lpszClassName = L"DpiTest"; | |
wcex.hIconSm = NULL; | |
return RegisterClassEx(&wcex); | |
} | |
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) | |
{ | |
HWND hWnd; | |
hInst = hInstance; | |
RECT r; | |
r.left = wndPos; | |
r.top = wndPos; | |
r.right = r.left + wndSize; | |
r.bottom = r.top + wndSize; | |
const auto mon = ::MonitorFromRect(&r, MONITOR_DEFAULTTOPRIMARY); | |
UINT dpi_x = 0; | |
UINT dpi_y = 0; | |
::GetDpiForMonitor(mon, MDT_DEFAULT, &dpi_x, &dpi_y); | |
dpiScale = dpi_x / 96.f; | |
hWnd = ::CreateWindow( | |
L"DpiTest", | |
L"", | |
WS_OVERLAPPEDWINDOW, | |
wndPos, | |
wndPos, | |
wndSize * dpiScale, | |
wndSize * dpiScale, | |
NULL, | |
NULL, | |
hInstance, | |
NULL | |
); | |
ShowWindow(hWnd, nCmdShow); | |
UpdateWindow(hWnd); | |
return TRUE; | |
} | |
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | |
{ | |
switch (message) | |
{ | |
case WM_DPICHANGED: | |
{ | |
int dpi_x = LOWORD(wParam); | |
int dpi_y = HIWORD(wParam); | |
dpiScale = dpi_x / 96.f; | |
RECT rect = *(RECT *)lParam; | |
::SetWindowPos(hWnd, 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); | |
break; | |
} | |
case WM_GETMINMAXINFO: | |
{ | |
MINMAXINFO* info = (MINMAXINFO*)lParam; | |
info->ptMinTrackSize.x = wndSize * dpiScale; | |
info->ptMinTrackSize.y = wndSize * dpiScale; | |
break; | |
} | |
case WM_SIZE: | |
{ | |
RECT r; | |
::GetWindowRect(hWnd, &r); | |
int width = (r.right - r.left); | |
int height = (r.bottom - r.top); | |
std::cout << "WM_SIZE " << width << " " << height << " scale factor: " << (1.f * width / wndSize) << std::endl; | |
break; | |
} | |
case WM_WINDOWPOSCHANGED: | |
{ | |
WINDOWPOS* pos = (WINDOWPOS*)lParam; | |
std::cout << "WM_WINDOWPOSCHANGED " << pos->x << " " << pos->y << " " << pos->cx << " " << pos->cy << std::endl; | |
return DefWindowProc(hWnd, message, wParam, lParam); | |
} | |
case WM_DESTROY: | |
PostQuitMessage(0); | |
break; | |
default: | |
return DefWindowProc(hWnd, message, wParam, lParam); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Microsoft Visual Studio Solution File, Format Version 12.00 | |
# Visual Studio 2012 | |
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinimalDpiTest", "MinimalDpiTest\MinimalDpiTest.vcxproj", "{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}" | |
EndProject | |
Global | |
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |
Debug|Win32 = Debug|Win32 | |
Release|Win32 = Release|Win32 | |
EndGlobalSection | |
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |
{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}.Debug|Win32.ActiveCfg = Debug|Win32 | |
{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}.Debug|Win32.Build.0 = Debug|Win32 | |
{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}.Release|Win32.ActiveCfg = Release|Win32 | |
{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}.Release|Win32.Build.0 = Release|Win32 | |
EndGlobalSection | |
GlobalSection(SolutionProperties) = preSolution | |
HideSolutionNode = FALSE | |
EndGlobalSection | |
EndGlobal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |
<ItemGroup Label="ProjectConfigurations"> | |
<ProjectConfiguration Include="Debug|Win32"> | |
<Configuration>Debug</Configuration> | |
<Platform>Win32</Platform> | |
</ProjectConfiguration> | |
<ProjectConfiguration Include="Release|Win32"> | |
<Configuration>Release</Configuration> | |
<Platform>Win32</Platform> | |
</ProjectConfiguration> | |
</ItemGroup> | |
<PropertyGroup Label="Globals"> | |
<ProjectGuid>{BFC3A0A7-3FF0-4056-B46E-BF9418C7278D}</ProjectGuid> | |
<Keyword>Win32Proj</Keyword> | |
<RootNamespace>MinimalDpiTest</RootNamespace> | |
</PropertyGroup> | |
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | |
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | |
<ConfigurationType>Application</ConfigurationType> | |
<UseDebugLibraries>true</UseDebugLibraries> | |
<PlatformToolset>v110</PlatformToolset> | |
<CharacterSet>Unicode</CharacterSet> | |
</PropertyGroup> | |
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | |
<ConfigurationType>Application</ConfigurationType> | |
<UseDebugLibraries>false</UseDebugLibraries> | |
<PlatformToolset>v110</PlatformToolset> | |
<WholeProgramOptimization>true</WholeProgramOptimization> | |
<CharacterSet>Unicode</CharacterSet> | |
</PropertyGroup> | |
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | |
<ImportGroup Label="ExtensionSettings"> | |
</ImportGroup> | |
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |
</ImportGroup> | |
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |
</ImportGroup> | |
<PropertyGroup Label="UserMacros" /> | |
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |
<LinkIncremental>true</LinkIncremental> | |
<IncludePath>C:\Program Files (x86)\Windows Kits\8.1\Include\um;$(IncludePath)</IncludePath> | |
<LibraryPath>C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86;$(LibraryPath)</LibraryPath> | |
</PropertyGroup> | |
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |
<LinkIncremental>false</LinkIncremental> | |
</PropertyGroup> | |
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |
<ClCompile> | |
<PrecompiledHeader> | |
</PrecompiledHeader> | |
<WarningLevel>Level3</WarningLevel> | |
<Optimization>Disabled</Optimization> | |
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |
<AdditionalIncludeDirectories>C:\Program Files (x86)\Windows Kits\8.1\Include\shared</AdditionalIncludeDirectories> | |
</ClCompile> | |
<Link> | |
<SubSystem>Console</SubSystem> | |
<GenerateDebugInformation>true</GenerateDebugInformation> | |
<AdditionalDependencies>shcore.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> | |
</Link> | |
</ItemDefinitionGroup> | |
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |
<ClCompile> | |
<WarningLevel>Level3</WarningLevel> | |
<PrecompiledHeader> | |
</PrecompiledHeader> | |
<Optimization>MaxSpeed</Optimization> | |
<FunctionLevelLinking>true</FunctionLevelLinking> | |
<IntrinsicFunctions>true</IntrinsicFunctions> | |
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |
</ClCompile> | |
<Link> | |
<SubSystem>Windows</SubSystem> | |
<GenerateDebugInformation>true</GenerateDebugInformation> | |
<EnableCOMDATFolding>true</EnableCOMDATFolding> | |
<OptimizeReferences>true</OptimizeReferences> | |
</Link> | |
</ItemDefinitionGroup> | |
<ItemGroup> | |
<ClCompile Include="main.cpp" /> | |
</ItemGroup> | |
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |
<ImportGroup Label="ExtensionTargets"> | |
</ImportGroup> | |
</Project> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment