VC获取多个屏幕的分辨率(坐标大小)

  1. 使用 ::EnumDisplayMonitors
//  用一个全局函数(回调函数)获得第二个屏幕的大小 //
//  在OnInitDialog()中调用 //
CRect g_ScreenRect2;//第二块屏幕的大小
BOOL CALLBACK MonitorProc(HMONITOR hMonitor, HDC hdc, LPRECT lprc, LPARAM dwData)
{
	CPacsCEFDlg* pThis = (CPacsCEFDlg*)dwData;
	if (!(lprc->left == 0 && lprc->top == 0))
	{
		g_ScreenRect2 = *lprc;//获得第二个屏幕的大小
	}
	return 1;
}


在OnInitDialog中
	//  获取第二个屏幕(扩展屏)的大小  //
	HDC hdc = ::GetDC(NULL);
	::EnumDisplayMonitors(hdc, NULL, MonitorProc, (LPARAM)this);
	::ReleaseDC(NULL, hdc);
	///
	m_ScreenRect2 = g_ScreenRect2;
	m_ScreenRect1.right = ::GetSystemMetrics(SM_CXSCREEN);
	m_ScreenRect1.bottom = ::GetSystemMetrics(SM_CYSCREEN);
	

封装的类

// GetMonitorInfo 文件
#ifndef MONITORINFO_H_H_0001
#define MONITORINFO_H_H_0001

#include <vector>
#include <Windows.h>
using namespace std;

class MonitorInfo
{
private:
	MonitorInfo(){ resetData(); }
	~MonitorInfo() { }
	MonitorInfo(const MonitorInfo&);
	MonitorInfo& operator=(const MonitorInfo&);
public:
	static MonitorInfo& getInstance()
	{
		static MonitorInfo instance;
		return instance;
	}

	const MONITORINFO* getMonitorInfo(unsigned int nIndex)
	{
		if (nIndex<0 || nIndex >= s_vMonitorInfo.size())
			return NULL;
		return &s_vMonitorInfo[nIndex];
	}
	const vector<MONITORINFO>& getAllMonitorInfo()
	{
		return s_vMonitorInfo;
	}
	unsigned int getMonitorCount() { return s_vMonitorInfo.size(); }


private:
	static std::vector<MONITORINFO> s_vMonitorInfo; // 保存多显示器信息
	void resetData()
	{
		s_vMonitorInfo.clear();
		::EnumDisplayMonitors(NULL, NULL, monitorEnumProc, 0);
	}
	static BOOL CALLBACK monitorEnumProc(
		HMONITOR hMonitor,  // handle to display monitor
		HDC hdcMonitor,     // handle to monitor DC
		LPRECT lprcMonitor, // monitor intersection rectangle
		LPARAM dwData       // data
		)
	{
		MONITORINFO mi;
		mi.cbSize = sizeof(MONITORINFO);
		::GetMonitorInfo(hMonitor, &mi);
		s_vMonitorInfo.push_back(mi);
		return TRUE;
	}
};

std::vector<MONITORINFO> MonitorInfo::s_vMonitorInfo; // 保存多显示器信息

#endif

/*
使用方法:
const vector<MONITORINFO>& vMonitor = MonitorInfo::getInstance().getAllMonitorInfo();
size_t nCount = vMonitor.size();
*/
  1. 使用 EnumDisplayDevices() 和 EnumDisplaySettings()
// 多个屏幕的大小
vector<CRect> g_vMonitorsRect;
// 获取多个屏幕的大小
vector<CRect> GetMonitorsRect()
{
	vector<CRect> vRet;
	int n = GetSystemMetrics(SM_CMONITORS);//获取屏幕个数
	DISPLAY_DEVICE dd;
	ZeroMemory(&dd, sizeof(dd));
	dd.cb = sizeof(dd);
	DEVMODE devMode;
	ZeroMemory(&devMode, sizeof(devMode));
	devMode.dmSize = sizeof(devMode);

	for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); ++i)
	{
		if (EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &devMode))
		{
			CRect rc;
			int left = devMode.dmPosition.x;
			int top = devMode.dmPosition.y;
			int right = devMode.dmPosition.x + devMode.dmPelsWidth;
			int bottom = devMode.dmPosition.y + devMode.dmPelsHeight;
			rc.SetRect(left, top, right, bottom);
			vRet.push_back(rc);
		}
	}
	//g_vMonitorsRect = vRet;
	return vRet;
}
// 获取当前鼠标所在屏幕的大小
CRect GetCurrentMonitorRect()
{
	CRect rcRet;
	CPoint point;
	::GetCursorPos(&point);
	static vector<CRect> vMonitorsRect = GetMonitorsRect();
	for (const CRect& rc : vMonitorsRect)
	{
		if (::PtInRect(rc, point))
		{
			rcRet = rc;
			break;
		}
	}
	return rcRet;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值