//************************************ // 函数名称: GetMonitorDisplayDevice // 返回类型: DISPLAY_DEVICE& // 参数信息: DWORD _MonitorIndex // 函数说明: //************************************ DISPLAY_DEVICE& DuiMonitor::GetMonitorDisplayDevice( DWORD _MonitorIndex /*= 1*/ ) { static DISPLAY_DEVICE mDisplayDevice; memset(&mDisplayDevice,0, sizeof(mDisplayDevice)); if(_MonitorIndex <= 0 || _MonitorIndex > GetMonitorCount()) return mDisplayDevice; DEVMODE mDevMode; memset(&mDevMode,0, sizeof(mDevMode)); DWORD mCheckCount = 0,mMonitorCount = 0; while(mMonitorCount != _MonitorIndex) { mDisplayDevice.cb = sizeof(DISPLAY_DEVICE); if(EnumDisplayDevices(NULL, mCheckCount, &mDisplayDevice,0) == FALSE) break; if(EnumDisplaySettings(mDisplayDevice.DeviceName,ENUM_CURRENT_SETTINGS,&mDevMode)) mMonitorCount++; mCheckCount++; } return mDisplayDevice; }
int CMonitor::GetWorkArea(CRect *rc) { int nWinVersion; char chOsName[128]; nWinVersion = GetOSVersionInfo(chOsName); CPoint pt; GetCursorPos(&pt); if (nWinVersion == OS_WIN2000 || nWinVersion == OS_WINXP || nWinVersion >= OS_VISTA) { int nCount = GetMonitorCount(); if (nCount > 1)//bIsMultiMax) { CRect rcMon; rc->SetRectEmpty(); for(int i = 0; i < nCount; i++) { rcMon = GetMonitorRect(i); rc->left = __min(rc->left, rcMon.left); rc->top = __min(rc->top, rcMon.top); rc->right = __max(rc->right, rcMon.right); rc->bottom = __min(rc->bottom, rcMon.bottom); if(rc->bottom <= 100) rc->bottom = __max(rc->bottom, rcMon.bottom); } } else { MONITORINFO mtCursor, mtMenu; mtCursor.cbSize = sizeof(mtCursor); mtMenu.cbSize = sizeof(mtMenu); HMONITOR hmtCursor = ::MonitorFromPoint (pt, MONITOR_DEFAULTTOPRIMARY); if (GetMonitorInfo (hmtCursor, &mtCursor)) { *rc = mtCursor.rcWork; } else { SystemParametersInfo (SPI_GETWORKAREA, 0, rc, 0); } } } else { SystemParametersInfo (SPI_GETWORKAREA, 0, rc, 0); } return 1; }
CMonitors::CMonitors() { m_MonitorArray.SetSize( GetMonitorCount() ); ADDMONITOR addMonitor; addMonitor.pMonitors = &m_MonitorArray; addMonitor.currentIndex = 0; ::EnumDisplayMonitors( NULL, NULL, AddMonitorsCallBack, (LPARAM)&addMonitor ); }
//************************************ // 函数名称: GetMonitorXY // 返回类型: POINTL // 参数信息: DWORD _MonitorIndex // 函数说明: //************************************ POINTL DuiMonitor::GetMonitorXY( DWORD _MonitorIndex /*= 1*/ ) { if(_MonitorIndex <= 0 || _MonitorIndex > GetMonitorCount()) return POINTL(); DEVMODE& mDevMode = GetMonitorDevMode(_MonitorIndex); if(!mDevMode.dmDriverVersion) return POINTL(); return mDevMode.dmPosition; }
//************************************ // 函数名称: GetMainMonitorIndex // 返回类型: DWORD // 函数说明: //************************************ DWORD DuiMonitor::GetMainMonitorIndex() { DWORD nMonitorCount = GetMonitorCount(); for(DWORD nMonitorIndex = 1;nMonitorIndex <= nMonitorCount;nMonitorIndex++) { POINTL nPoint = GetMonitorXY(nMonitorIndex); if(0 == nPoint.x && 0 == nPoint.y) return nMonitorIndex; } return 1; }
//************************************ // 函数名称: GetMonitorSize // 返回类型: SIZE // 参数信息: DWORD _MonitorIndex // 函数说明: //************************************ SIZE DuiMonitor::GetMonitorSize( DWORD _MonitorIndex /*= 1*/ ) { if(_MonitorIndex <= 0 || _MonitorIndex > GetMonitorCount()) return SIZE(); DEVMODE& mDevMode = GetMonitorDevMode(_MonitorIndex); if(!mDevMode.dmDriverVersion) return SIZE(); SIZE mSize = { mDevMode.dmPelsWidth, mDevMode.dmPelsHeight}; return mSize; }
//************************************ // 函数名称: GetMonitorDevMode // 返回类型: DEVMODE& // 参数信息: DWORD _MonitorIndex // 函数说明: //************************************ DEVMODE& DuiMonitor::GetMonitorDevMode( DWORD _MonitorIndex /*= 1*/ ) { static DEVMODE mDevMode; memset(&mDevMode,0, sizeof(mDevMode)); if(_MonitorIndex <= 0 || _MonitorIndex > GetMonitorCount()) return mDevMode; mDevMode.dmSize = sizeof(mDevMode); DISPLAY_DEVICE& mDisplayDevice = GetMonitorDisplayDevice(_MonitorIndex); mDisplayDevice.cb = sizeof(DISPLAY_DEVICE); if(EnumDisplaySettings(mDisplayDevice.DeviceName,ENUM_CURRENT_SETTINGS,&mDevMode)) return mDevMode; memset(&mDevMode,0, sizeof(mDevMode)); return mDevMode; }