3 主要代码
// 获得显示器的数量
CMScreenInfoCtrl::CMScreenInfoCtrl()
{
InitializeIIDs(&IID_DMScreenInfo, &IID_DMScreenInfoEvents);
// 找出显示器的总数量
int i;
BOOL flag;
DISPLAY_DEVICE dd;
i = 0;
flag = true;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
do
{
flag = EnumDisplayDevices(NULL, i, &dd, 0);
if (flag) i += 1;
} while (flag);
m_monitorNum = i; // 总数量
}
// 获得显示区宽度
short CMScreenInfoCtrl::GetScreenWidth(short ScreenNo)
{
if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return 0;
BOOL flag;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
if (!flag) return 0;
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
if (!flag) return 0;
return (short) dm.dmPelsWidth;
}
// 设置显示区宽度
void CMScreenInfoCtrl::SetScreenWidth(short ScreenNo, short nNewValue)
{
SetModifiedFlag();
}
// 获得显示区宽度
short CMScreenInfoCtrl::GetScreenHeight(short ScreenNo)
{
if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return 0;
BOOL flag;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
if (!flag) return 0;
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
if (!flag) return 0;
return (short) dm.dmPelsHeight;
}
// 设置显示区高度
void CMScreenInfoCtrl::SetScreenHeight(short ScreenNo, short nNewValue)
{
SetModifiedFlag();
}
// 获得显示区Y坐标
short CMScreenInfoCtrl::GetScreenTop(short ScreenNo)
{
if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return -1;
BOOL flag;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
if (!flag) return -1;
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
if (!flag) return -1;
return (short) dm.dmPosition.y ;
}
// 设置显示区Y坐标
void CMScreenInfoCtrl::SetScreenTop(short ScreenNo, short nNewValue)
{
SetModifiedFlag();
}
// 获得显示区X坐标
short CMScreenInfoCtrl::GetScreenLeft(short ScreenNo)
{
if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return -1;
BOOL flag;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
if (!flag) return -1;
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
if (!flag) return -1;
return (short) dm.dmPosition.x ;
}
// 设置显示区X坐标
void CMScreenInfoCtrl::SetScreenLeft(short ScreenNo, short nNewValue)
{
SetModifiedFlag();
}
// 获得主显示区
short CMScreenInfoCtrl::GetPrimaryScreen()
{
// TODO: Add your property handler here
if (m_monitorNum <= 1) return 0;
// if the Screen Top = 0 and Left = 0, then, it's the Primary Screen
short i;
for (i=0; i<m_monitorNum; i++)
{
if (GetScreenTop(i)==0 && GetScreenLeft(i)==0) return i;
}
return 0;
}
// 设置主显示区
void CMScreenInfoCtrl::SetPrimaryScreen(short nNewValue)
{
SetModifiedFlag();
}
关键的代码基本就是这些了.
(3)组件发布
直接编译成为ocx组件,取名为MutlScreen.ocx
使用regsvr32.exe注册一下就可以使用了.
primaryScreen = frmCtl.MScreenInfo1.primaryScreen
wScreen1 = frmCtl.MScreenInfo1.screenWidth(0)
hScreen1 = frmCtl.MScreenInfo1.screenHeight(0)
topScreen1 = frmCtl.MScreenInfo1.ScreenTop(0)
leftScreen1 = frmCtl.MScreenInfo1.ScreenLeft(0)
wScreen2 = frmCtl.MScreenInfo1.screenWidth(1)
hScreen2 = frmCtl.MScreenInfo1.screenHeight(1)
topScreen2 = frmCtl.MScreenInfo1.ScreenTop(1)
leftScreen2 = frmCtl.MScreenInfo1.ScreenLeft(1)
End Function
frmOutScreen.Top = 8
frmOutScreen.WindowsMediaPlayer1.Left = 0
frmOutScreen.WindowsMediaPlayer1.Top = 0
frmOutScreen.WindowsMediaPlayer1.Width = frmMediaplay.Width
frmOutScreen.WindowsMediaPlayer1.Height = frmMediaplay.Height
frmOutScreen.Refresh