基于WINDOWS 32API封装的显示器类: (1) 头文件

本文介绍了一个用于管理和操作多显示器系统的类库设计。该类库包括CMonitor类,用于表示单个显示器及其属性;以及CMonitorManager类,用于管理所有显示器,并提供获取显示器信息的方法。支持获取显示器矩形区域、工作区、像素宽度等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 1/************************************************************************
 2  @file monitor.h
 3  * Author: qinqing
 4  * Date:   2009-12-2
 5************************************************************************/
 6
 7#ifndef _MONITOR_H
 8
 9#if WINVER < 0x0500
10#include <multimon.h>
11#endif
12#include "..\common\tstring.h"
13#include "..\common\macro.h"
14#include <map>
15
16/**
17  @brief 显示器类
18  @class CMonitor
19*/
20class CMonitor
21{
22    friend class CMonitorManager;
23public:
24    void   GetMonitorRect(RECT& rect) const;
25    void   GetWorkAreaRect(RECT& rect) const;
26    DWORD  GetPixelWidth() const;
27    DWORD  GetPixelHeight() const;
28    DWORD  GetBitsPerPixel() const;
29    DWORD  GetMonitorLeft() const;
30    DWORD  GetMonitorTop() const;
31    DWORD  GetDisplayFrequency() const;
32    bool   IsPrimaryMonitor() const;
33  tstring GetName() const { return m_strName; }
34  DWORD GetIndex() const { return m_dwIndex; }
35  operator HMONITOR() const { return m_hMonitor; }
36   
37protected:
38    void CenterRectToMonitor(LPRECT lprc, bool bWorkArea= false) const;
39
40private:
41    CMonitor(HMONITOR hMonitor, DWORD dwIndex);
42
43private:
44  HMONITOR m_hMonitor; /**////< 显示器句柄
45    DWORD    m_dwIndex;  ///< 显示器索引
46    tstring  m_strName;  ///< 显示器名称
47};
48
49/**
50  @brief 显示器管理类
51  @class CMonitorManager
52  * 仅支持多屏独立显示模式(每个显示器分辨率是独立的),其它模式(大水平,大垂直,复制)暂不考虑
53*/
54class CMonitorManager
55{
56    SINGLETON_DECLARE(CMonitorManager) ///< 单件声明宏
57
58public:
59    DWORD     GetCount();
60    CMonitor* GetMonitor(DWORD dwIndex);
61    CMonitor* GetPrimaryMonitor();
62    CMonitor* GetNearestMonitor(const RECT& rect);
63    CMonitor* GetNearestMonitor(const POINT& pt);
64    CMonitor* GetNearestMonitor(HWND hWnd);
65  
66public:
67    static void GetVirtualDesktopRect(RECT& rect);
68    bool FullScreenWindow(HWND hWnd, bool bFullScreen, int iMonitorIndex = 0);
69    bool FullScreenWindow(HWND hWndFirst, HWND hWndSecond);
70    void CenterWindow(HWND hWnd, int iMonitorIndex = 0, bool bUseWorkArea = false);
71
72protected:
73    static BOOL CALLBACK AddMonitorsCallBack(HMONITOR hMonitor,HDC hdcMonitor,LPRECT lprcMonitor,
74           LPARAM dwData);
75
76private:
77    void      CenterWindowToAll(RECT& rect, bool bUseWorkArea = false);
78    void      UpdateMonitors();
79    CMonitor* FindMonitor(HMONITOR hMonitor);
80    void      FreeMonitors();
81
82private:
83    struct WndInfo
84    {
85        WndInfo(long lStyle, long lExStyle, RECT rcWnd, bool bFull):
86        _lStyle(lStyle), _lExStyle(lExStyle), _rcWnd(rcWnd), _bFull(bFull){}
87        WndInfo(){};
88        long _lStyle;   /**////< 普通样式
89        long _lExStyle; ///< 扩展样式
90        RECT _rcWnd;    ///< 矩形
91        bool _bFull;    ///< 是否已全屏:true是,false否
92    };
93  std::vector<CMonitor*> m_vec_monitor;   ///< 保存当前系统所有的显示器
94    std::map<HWND, WndInfo> m_map_wnd;    ///< 保存恢复窗口时的状态
95};
96
97#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值