Dip 缩放比例

double DipToZoom(_In_ int dip)
{
	double dRet = 1.0;

	switch (dip)
	{
	case 96:
		dRet = 1.00;
		break;
	case 120:
		dRet = 1.25;
		break;
	case 144:
		dRet = 1.50;
		break;
	case 192:
		dRet = 2.0;
		break;
	default:
		dRet = 1.00;
	}

	return dRet;
}

VOID GetProcessZoom(_Out_ double& xZoom, _Out_ double& yZoom)
{
	HDC desktopDc = ::GetDC(NULL);

	xZoom = yZoom = 1.00;

	do 
	{
		if (NULL == desktopDc) break;

		xZoom = DipToZoom(::GetDeviceCaps(desktopDc, LOGPIXELSX));
		yZoom = DipToZoom(::GetDeviceCaps(desktopDc, LOGPIXELSY));

		::ReleaseDC(NULL, desktopDc);

	} while (0);
}


#pragma once

#ifndef __SHCORE_H__
#define __SHCORE_H__

#include <wtypes.h>

#define SHCORE_NAME_A					"Shcore.dll"
#define SHCORE_NAME_W					L"Shcore.dll"

#define SetProcessDpiAwareness_NAME_A	"SetProcessDpiAwareness"
#define GetProcessDpiAwareness_NAME_A	"GetProcessDpiAwareness"

typedef enum {
	PROCESS_DPI_UNAWARE				= 0,
	PROCESS_SYSTEM_DPI_AWARE		= 1,
	PROCESS_PER_MONITOR_DPI_AWARE	= 2,
}E_PROCESS_DPI_AWARENESS;

typedef
HRESULT 
(WINAPI* SetProcessDpiAwareness_T)(
	_In_ E_PROCESS_DPI_AWARENESS value);

typedef
HRESULT
(WINAPI* GetProcessDpiAwareness_T)(
_In_opt_ HANDLE hprocess,
_Out_ E_PROCESS_DPI_AWARENESS *value);

class Shcore
{
public:
	static HMODULE GetModuleHandle();

	static SetProcessDpiAwareness_T SetProcessDpiAwareness();

	static GetProcessDpiAwareness_T GetProcessDpiAwareness();
};

#endif


#include "Shcore.h"

HMODULE Shcore::GetModuleHandle()
{
	static HMODULE s_hShcore = NULL;

	if (NULL == s_hShcore)
	{
		s_hShcore = ::GetModuleHandleW(SHCORE_NAME_W);
	}

	return s_hShcore;
}

SetProcessDpiAwareness_T Shcore::SetProcessDpiAwareness()
{
	return (SetProcessDpiAwareness_T)::GetProcAddress(GetModuleHandle(), SetProcessDpiAwareness_NAME_A);
}

GetProcessDpiAwareness_T Shcore::GetProcessDpiAwareness()
{
	return (GetProcessDpiAwareness_T)::GetProcAddress(GetModuleHandle(), GetProcessDpiAwareness_NAME_A);
}

HRESULT SetCurProDipAwareness(_In_ E_PROCESS_DPI_AWARENESS value)
{
	HRESULT hr = S_OK;

	static SetProcessDpiAwareness_T s_SetProcessDpiAwareness = NULL;

	if (NULL == s_SetProcessDpiAwareness)
	{
		s_SetProcessDpiAwareness = Shcore::SetProcessDpiAwareness();
	}

	if (NULL != s_SetProcessDpiAwareness)
	{
		hr = s_SetProcessDpiAwareness(value);
	}

	return hr;
}

HRESULT GetCurProDpiAwareness(_Out_ E_PROCESS_DPI_AWARENESS& value)
{
	HRESULT hr = S_OK;

	static GetProcessDpiAwareness_T s_GetProcessDpiAwareness = NULL;

	if (NULL == s_GetProcessDpiAwareness)
	{
		s_GetProcessDpiAwareness = Shcore::GetProcessDpiAwareness();
	}

	if (NULL != s_GetProcessDpiAwareness)
	{
		hr = s_GetProcessDpiAwareness(::GetCurrentProcess(),&value);
	}

	return hr;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值