(五)组件开发的实现和主要代码
1 开发环境
操作系统: WindowsXP
编程环境: VC 6.0
2 组件接口如下

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注册一下就可以使用了.
加载中,请稍候......