MScreenInfoCtl.cpp
上传用户:zqemid3000
上传日期:2007-01-04
资源大小:158k
文件大小:10k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. // MScreenInfoCtl.cpp : Implementation of the CMScreenInfoCtrl ActiveX Control class.
  2. #include "stdafx.h"
  3. #include "MScreenInfo.h"
  4. #include "MScreenInfoCtl.h"
  5. #include "MScreenInfoPpg.h"
  6. #define COMPILE_MULTIMON_STUBS
  7. #include "multimon.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. IMPLEMENT_DYNCREATE(CMScreenInfoCtrl, COleControl)
  14. /////////////////////////////////////////////////////////////////////////////
  15. // Message map
  16. BEGIN_MESSAGE_MAP(CMScreenInfoCtrl, COleControl)
  17. //{{AFX_MSG_MAP(CMScreenInfoCtrl)
  18. // NOTE - ClassWizard will add and remove message map entries
  19. //    DO NOT EDIT what you see in these blocks of generated code !
  20. //}}AFX_MSG_MAP
  21. ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  22. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // Dispatch map
  26. BEGIN_DISPATCH_MAP(CMScreenInfoCtrl, COleControl)
  27. //{{AFX_DISPATCH_MAP(CMScreenInfoCtrl)
  28. DISP_PROPERTY_NOTIFY(CMScreenInfoCtrl, "MonitorNum", m_monitorNum, OnMonitorNumChanged, VT_I2)
  29. DISP_PROPERTY_EX(CMScreenInfoCtrl, "PrimaryScreen", GetPrimaryScreen, SetPrimaryScreen, VT_I2)
  30. DISP_PROPERTY_PARAM(CMScreenInfoCtrl, "ScreenWidth", GetScreenWidth, SetScreenWidth, VT_I2, VTS_I2)
  31. DISP_PROPERTY_PARAM(CMScreenInfoCtrl, "ScreenHeight", GetScreenHeight, SetScreenHeight, VT_I2, VTS_I2)
  32. DISP_PROPERTY_PARAM(CMScreenInfoCtrl, "ScreenTop", GetScreenTop, SetScreenTop, VT_I2, VTS_I2)
  33. DISP_PROPERTY_PARAM(CMScreenInfoCtrl, "ScreenLeft", GetScreenLeft, SetScreenLeft, VT_I2, VTS_I2)
  34. //}}AFX_DISPATCH_MAP
  35. END_DISPATCH_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // Event map
  38. BEGIN_EVENT_MAP(CMScreenInfoCtrl, COleControl)
  39. //{{AFX_EVENT_MAP(CMScreenInfoCtrl)
  40. // NOTE - ClassWizard will add and remove event map entries
  41. //    DO NOT EDIT what you see in these blocks of generated code !
  42. //}}AFX_EVENT_MAP
  43. END_EVENT_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // Property pages
  46. // TODO: Add more property pages as needed.  Remember to increase the count!
  47. BEGIN_PROPPAGEIDS(CMScreenInfoCtrl, 1)
  48. PROPPAGEID(CMScreenInfoPropPage::guid)
  49. END_PROPPAGEIDS(CMScreenInfoCtrl)
  50. /////////////////////////////////////////////////////////////////////////////
  51. // Initialize class factory and guid
  52. IMPLEMENT_OLECREATE_EX(CMScreenInfoCtrl, "MSCREENINFO.MScreenInfoCtrl.1",
  53. 0x223de668, 0xe7d7, 0x11d2, 0x85, 0x72, 0, 0, 0x1a, 0x1, 0x69, 0xac)
  54. /////////////////////////////////////////////////////////////////////////////
  55. // Type library ID and version
  56. IMPLEMENT_OLETYPELIB(CMScreenInfoCtrl, _tlid, _wVerMajor, _wVerMinor)
  57. /////////////////////////////////////////////////////////////////////////////
  58. // Interface IDs
  59. const IID BASED_CODE IID_DMScreenInfo =
  60. { 0x223de666, 0xe7d7, 0x11d2, { 0x85, 0x72, 0, 0, 0x1a, 0x1, 0x69, 0xac } };
  61. const IID BASED_CODE IID_DMScreenInfoEvents =
  62. { 0x223de667, 0xe7d7, 0x11d2, { 0x85, 0x72, 0, 0, 0x1a, 0x1, 0x69, 0xac } };
  63. /////////////////////////////////////////////////////////////////////////////
  64. // Control type information
  65. static const DWORD BASED_CODE _dwMScreenInfoOleMisc =
  66. OLEMISC_INVISIBLEATRUNTIME |
  67. OLEMISC_ACTIVATEWHENVISIBLE |
  68. OLEMISC_SETCLIENTSITEFIRST |
  69. OLEMISC_INSIDEOUT |
  70. OLEMISC_CANTLINKINSIDE |
  71. OLEMISC_RECOMPOSEONRESIZE;
  72. IMPLEMENT_OLECTLTYPE(CMScreenInfoCtrl, IDS_MSCREENINFO, _dwMScreenInfoOleMisc)
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CMScreenInfoCtrl::CMScreenInfoCtrlFactory::UpdateRegistry -
  75. // Adds or removes system registry entries for CMScreenInfoCtrl
  76. BOOL CMScreenInfoCtrl::CMScreenInfoCtrlFactory::UpdateRegistry(BOOL bRegister)
  77. {
  78. // TODO: Verify that your control follows apartment-model threading rules.
  79. // Refer to MFC TechNote 64 for more information.
  80. // If your control does not conform to the apartment-model rules, then
  81. // you must modify the code below, changing the 6th parameter from
  82. // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
  83. if (bRegister)
  84. return AfxOleRegisterControlClass(
  85. AfxGetInstanceHandle(),
  86. m_clsid,
  87. m_lpszProgID,
  88. IDS_MSCREENINFO,
  89. IDB_MSCREENINFO,
  90. afxRegInsertable | afxRegApartmentThreading,
  91. _dwMScreenInfoOleMisc,
  92. _tlid,
  93. _wVerMajor,
  94. _wVerMinor);
  95. else
  96. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  97. }
  98. /////////////////////////////////////////////////////////////////////////////
  99. // CMScreenInfoCtrl::CMScreenInfoCtrl - Constructor
  100. CMScreenInfoCtrl::CMScreenInfoCtrl()
  101. {
  102. InitializeIIDs(&IID_DMScreenInfo, &IID_DMScreenInfoEvents);
  103. // TODO: Initialize your control's instance data here.
  104. // Find out the Moniter number
  105. int i;
  106. BOOL flag;
  107. DISPLAY_DEVICE dd;
  108. i = 0;
  109. flag = true;
  110.     ZeroMemory(&dd, sizeof(dd));
  111.     dd.cb = sizeof(dd);
  112. do
  113. {
  114. flag = EnumDisplayDevices(NULL, i, &dd, 0);
  115. if (flag) i += 1;
  116. } while (flag);
  117. m_monitorNum = i;
  118. }
  119. /////////////////////////////////////////////////////////////////////////////
  120. // CMScreenInfoCtrl::~CMScreenInfoCtrl - Destructor
  121. CMScreenInfoCtrl::~CMScreenInfoCtrl()
  122. {
  123. // TODO: Cleanup your control's instance data here.
  124. }
  125. /////////////////////////////////////////////////////////////////////////////
  126. // CMScreenInfoCtrl::OnDraw - Drawing function
  127. void CMScreenInfoCtrl::OnDraw(
  128. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  129. {
  130. // TODO: Replace the following code with your own drawing code.
  131. pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
  132. pdc->Ellipse(rcBounds);
  133. }
  134. /////////////////////////////////////////////////////////////////////////////
  135. // CMScreenInfoCtrl::DoPropExchange - Persistence support
  136. void CMScreenInfoCtrl::DoPropExchange(CPropExchange* pPX)
  137. {
  138. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  139. COleControl::DoPropExchange(pPX);
  140. // TODO: Call PX_ functions for each persistent custom property.
  141. }
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CMScreenInfoCtrl::OnResetState - Reset control to default state
  144. void CMScreenInfoCtrl::OnResetState()
  145. {
  146. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  147. // TODO: Reset any other control state here.
  148. }
  149. /////////////////////////////////////////////////////////////////////////////
  150. // CMScreenInfoCtrl message handlers
  151. void CMScreenInfoCtrl::OnMonitorNumChanged() 
  152. {
  153. // TODO: Add notification handler code
  154. SetModifiedFlag();
  155. }
  156. short CMScreenInfoCtrl::GetScreenWidth(short ScreenNo) 
  157. {
  158. // TODO: Add your property handler here
  159. // Make sure the ScreenNo is validable
  160. if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return 0;
  161. // Get the Display device name
  162. BOOL flag;
  163. DISPLAY_DEVICE dd;
  164.     ZeroMemory(&dd, sizeof(dd));
  165.     dd.cb = sizeof(dd);
  166. flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
  167. // Make sure it's successful 
  168. if (!flag) return 0;
  169. // Get the Display setting
  170. DEVMODE dm;
  171. ZeroMemory(&dm, sizeof(dm));
  172. dm.dmSize = sizeof(dm);
  173. flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
  174. // Make sure it's successful
  175. if (!flag) return 0;
  176. return (short) dm.dmPelsWidth;
  177. }
  178. void CMScreenInfoCtrl::SetScreenWidth(short ScreenNo, short nNewValue) 
  179. {
  180. // TODO: Add your property handler here
  181. SetModifiedFlag();
  182. }
  183. short CMScreenInfoCtrl::GetScreenHeight(short ScreenNo) 
  184. {
  185. // TODO: Add your property handler here
  186. // Make sure the ScreenNo is validable
  187. if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return 0;
  188. // Get the Display device name
  189. BOOL flag;
  190. DISPLAY_DEVICE dd;
  191.     ZeroMemory(&dd, sizeof(dd));
  192.     dd.cb = sizeof(dd);
  193. flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
  194. // Make sure it's successful 
  195. if (!flag) return 0;
  196. // Get the Display setting
  197. DEVMODE dm;
  198. ZeroMemory(&dm, sizeof(dm));
  199. dm.dmSize = sizeof(dm);
  200. flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
  201. // Make sure it's successful
  202. if (!flag) return 0;
  203. return (short) dm.dmPelsHeight;
  204. }
  205. void CMScreenInfoCtrl::SetScreenHeight(short ScreenNo, short nNewValue) 
  206. {
  207. // TODO: Add your property handler here
  208. SetModifiedFlag();
  209. }
  210. short CMScreenInfoCtrl::GetScreenTop(short ScreenNo) 
  211. {
  212. // TODO: Add your property handler here
  213. if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return -1;
  214. // Get the Display device name
  215. BOOL flag;
  216. DISPLAY_DEVICE dd;
  217.     ZeroMemory(&dd, sizeof(dd));
  218.     dd.cb = sizeof(dd);
  219. flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
  220. // Make sure it's successful 
  221. if (!flag) return -1;
  222. // Get the Display setting
  223. DEVMODE dm;
  224. ZeroMemory(&dm, sizeof(dm));
  225. dm.dmSize = sizeof(dm);
  226. flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
  227. // Make sure it's successful
  228. if (!flag) return -1;
  229. return (short) dm.dmPosition.y ;
  230. }
  231. void CMScreenInfoCtrl::SetScreenTop(short ScreenNo, short nNewValue) 
  232. {
  233. // TODO: Add your property handler here
  234. SetModifiedFlag();
  235. }
  236. short CMScreenInfoCtrl::GetScreenLeft(short ScreenNo) 
  237. {
  238. // TODO: Add your property handler here
  239. if (ScreenNo < 0 || ScreenNo >= m_monitorNum) return -1;
  240. // Get the Display device name
  241. BOOL flag;
  242. DISPLAY_DEVICE dd;
  243.     ZeroMemory(&dd, sizeof(dd));
  244.     dd.cb = sizeof(dd);
  245. flag = EnumDisplayDevices(NULL, ScreenNo, &dd, 0);
  246. // Make sure it's successful 
  247. if (!flag) return -1;
  248. // Get the Display setting
  249. DEVMODE dm;
  250. ZeroMemory(&dm, sizeof(dm));
  251. dm.dmSize = sizeof(dm);
  252. flag = EnumDisplaySettings((char*)dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
  253. // Make sure it's successful
  254. if (!flag) return -1;
  255. return (short) dm.dmPosition.x ;
  256. }
  257. void CMScreenInfoCtrl::SetScreenLeft(short ScreenNo, short nNewValue) 
  258. {
  259. // TODO: Add your property handler here
  260. SetModifiedFlag();
  261. }
  262. short CMScreenInfoCtrl::GetPrimaryScreen() 
  263. {
  264. // TODO: Add your property handler here
  265. if (m_monitorNum <= 1) return 0;
  266. // if the Screen Top = 0 and Left = 0, then, it's the Primary Screen
  267. short i;
  268. for (i=0; i<m_monitorNum; i++)
  269. {
  270. if (GetScreenTop(i)==0 && GetScreenLeft(i)==0) return i;
  271. }
  272. return 0;
  273. }
  274. void CMScreenInfoCtrl::SetPrimaryScreen(short nNewValue) 
  275. {
  276. // TODO: Add your property handler here
  277. SetModifiedFlag();
  278. }