加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Windows系统下的多显示器模式开发日记(五)

(2006-05-20 22:31:06)
分类: IPTV和多媒体技术
(五)组件开发的实现和主要代码
 
1 开发环境
 
操作系统: WindowsXP   编程环境: VC 6.0
 
2 组件接口如下
 

Windows系统下的多显示器模式开发日记(五)

 

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注册一下就可以使用了.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有