查看: 57|回复: 0

    [经验]VC中获取屏幕分辨率及大小相关

    [复制链接]

    65

    主题

    65

    帖子

    109

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    109
    发表于 2020-3-27 16:57:15 | 显示全部楼层 |阅读模式

    vc得到屏幕的当前分辨率方法:


    1.Windows API调用
    int width = GetSystemMetrics ( SM_CXSCREEN );
    int height= GetSystemMetrics ( SM_CYSCREEN );
    如果想动态自适应分辨率的变化,处理WM_DISPLAYCHANGE消息.
    2.获得分辨率
    BOOL EnumDisplaySettings(
    LPCTSTR lpszDeviceName, // display device
    DWORD iModeNum, // graphics mode
    LPDEVMODE lpDevMode // graphics mode settings
    );

    改变分辨率
    LONG ChangeDisplaySettings(
    LPDEVMODE lpDevMode, // graphics mode
    DWORD dwflags // graphics mode options
    );
    3.用GetDeviceCaps

    int GetDeviceCaps(
    HDC hdc, // handle to the device context
    int nIndex // index of capability to query
    );

    4.用GetDeviceCaps
    HDC hdcScreen = GetDC( NULL );
    int cx = GetDeviceCaps( hdcScreen, HORZRES );
    int cy = GetDeviceCaps( hdcScreen, VERTRES );
    DeleteObject( hdcScreen );
    其中nIndex可以取:
    HORZRES VERTRES 或
    分别表示:
    HORZRES :Width, in pixels, of the screen.
    VERTRES :Height, in raster lines, of the screen.

    也就是设备的分辨率了
    5.得到桌面客户区的大小
    (1) 最简单,使用API
    RECT rc;
    SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID) &rc, 0);
    str.Format("%d*%d",rc.right-rc.left,rc.bottom-rc.top);
    (2)间接计算得到:先用上面的3种方法得到这个屏幕的大小,再减去任务栏的大小(注意:要考虑任务栏是否隐藏的情况)
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);

    HDC hdcScreen = GetDC( NULL );
    int cx = GetDeviceCaps( hdcScreen, HORZRES );
    int cy = GetDeviceCaps( hdcScreen, VERTRES );
    DeleteObject( hdcScreen );

    任务栏:
    CWnd* pTaskWnd = FindWindow( _T("Shell_TrayWnd"), NULL );
    if( pTaskWnd ) pTaskWnd->ShowWindow( FALSE );
    任务栏是否隐藏:
    LONG lStyle = GetWindowLong( pTaskWnd->GetSafeHwnd(), GWL_STYLE );
    if( lStyle & WS_VISIBLE )
    {
    //可见
    }
    else
    {
    //隐藏
    }

    /////////////////////////////////
    VC获取屏幕大小
    int with= GetSystemMetrics(SM_CXFULLSCREEN);

    int heigh= GetSystemMetrics(SM_CYFULLSCREEN);

    通过上边两个函数获取的是显示屏幕的大小,及不包括任务栏等区域。


    int cx = GetSystemMetrics( SM_CXSCREEN );
    int cy = GetSystemMetrics( SM_CYSCREEN );

    这两个函数获取的是真正屏幕的大小。

    用前两个函数获取的大小可能是1024*687 而用下边两个获取的就是1024*768
    说明
    返回与windows环境有关的信息
    返回值
    Long,取决于具体的常数索引
    参数表
    参数 类型及说明
    nIndex Long,常数,指定欲获取的信息;如下表所示
    nIndex常数设置
    常数定义 取得信息
    SM_ARRANGE 设置windows如何排列最小化窗口的一个标志。参考api32.txt中的ARW常数
    SM_CLEANBOOT 指定启动模式。0=普通模式;1=带网络支持的安全模式
    SM_CMETRICS 可用系统环境的数量
    SM_CMOUSEBUTTON 鼠标按钮(按键)的数量。如没有鼠标,就为零
    SM_CXBORDER, SM_CYBORDER 尺寸不可变边框的大小
    SM_CXCURSOR, SM_CYCURSOR 标准指针大小
    SM_CXDLGFRAME, SM_CYDLGFRAME 对话框边框的大小
    SM_CXDOUBLECLK, SM_CYDOUBLECLK 双击区域的大小(参考注解)
    SM_CXFRAME, SM_CYFRAME 尺寸可变边框的大小(在win95和nt 4.0中使用SM_C?FIXEDFRAME)
    SM_CXFULLSCREEN, SM_CYFULLSCREEN 最大化窗口客户区的大小
    SM_CXHSCROLL, SM_CYHSCROLL 水平滚动条上的箭头大小
    SM_CXHTHUMB, SM_CYHTHUMB 滚动块在水平滚动条上的大小
    SM_CXICON, SM_CYICON 标准图标的大小
    SM_CXICONSPACING, SM_CYICONSPACING 桌面图标之间的间隔距离。在win95和nt 4.0中是指大图标的间距
    SM_CXMAXIMIZED, SM_CYMAXIMIZED 最大化窗口的默认尺寸
    SM_CXMAXTRACK, SM_CYMAXTRACK 改变窗口大小时,最大的轨迹宽度
    SM_CXMENUCHECK, SM_CYMENUCHECK 菜单复选号位图的大小
    SM_CXMENUSIZE, SM_CYMENUSIZE 菜单栏上的按钮大小
    SM_CXMIN, SM_CYMIN 窗口的最小尺寸
    SM_CXMINIMIZED, SM_CYMINIMIZED 最小化的窗口必须填充进去的一个矩形小于或等于SM_C?ICONSPACING
    SM_CXMINTRACK, SM_CYMINTRACK 窗口的最小轨迹宽度
    SM_CXSCREEN, SM_CYSCREEN 屏幕大小
    SM_CXSIZE, SM_CYSIZE 标题栏位图的大小
    SM_CXSIZEFRAME, SM_CYSIZEFRAME 具有WS_THICKFRAME样式的窗口的大小
    SM_CXSMICON, SM_CYSMICON 小图标的大小
    SM_CXSMSIZE, SM_CYSMSIZE 小标题按钮的大小
    SM_CXVSCROLL, SM_CYVSCROLL 垂直滚动条中的箭头按钮的大小
    SM_CYCAPTION 窗口标题的高度
    SM_CYKANJIWINDOW Kanji窗口的大小(Height of Kanji window)
    SM_CYMENU 菜单高度
    SM_CYSMCAPTION 小标题的高度
    SM_CYVTHUMB 垂直滚动条上滚动块的高度
    SM_DBCSENABLED 如支持双字节则为TRUE
    SM_DEBUG 如windows的调试版正在运行,则为TRUE
    SM_MENUDropALIGNMENT 如弹出式菜单对齐菜单栏项目的左侧,则为零
    SM_MIDEASTENABLED 允许了希伯来和阿拉伯语
    SM_MOUSEPRESENT 如安装了鼠标则为TRUE
    SM_MOUSEWHEELPRESENT 如安装了带轮鼠标则为TRUE;只适用于nt 4.0
    SM_NETWORK 如安装了网络,则设置位0。其他位保留未用
    SM_PENWINDOWS 如装载了支持笔窗口的DLL,则表示笔窗口的句柄
    SM_SECURE 如安装了安全(保密)机制,则为TRUE
    SM_SHOWSOUNDS 强制视觉提示播放声音
    SM_SLOWMACHINE 系统速度太慢,但仍在运行中(System is too slow for effective use but is being run anyway)
    SM_SWAPBUTTON 如左右鼠标键已经交换,则为TRUE '注意这里
    注解
    双击区域指定屏幕上一个特定的显示区域,只有在这个区域内连续进行两次鼠标单击,才有可能被当作双击事件处理
    其他
    常数 SM_ARRANGE, SM_CLEANBOOT, SM_CMETRICS, SM_C?MAXIMIZED, SM_C?MAXTRACK, SM_C?SIZEFRAME, SM_C?SMICON, SM_C?SMSIZE, SM_CYSMCAPTION,
    SM_SECURE, SM_SHOWSOUNDS, and SM_SLOWMACHINE 未获 NT 3.51 及更早版本的支持


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    免责声明:
    1、转载或引用本网站内容须注明原网址,并标明本网站网址“源码资源网”
    2、转载或引用本网站中的署名文章,请按规定向原作者支付稿酬
    3、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任
    4、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利
    5、资源部分来自网络,不保证资源的完整性,仅供学习研究,如需运营请购买正版,如有侵权请联系客服删除
    6、本站所有资源不带技术支持,下载资源请24小时内删除,如用于违法用途,或者商业用途,一律用于者承担

    QQ|手机版|小黑屋|源码资源网 ( 鲁ICP备19041243号-1 )

    GMT+8, 2020-6-2 21:46

    邮箱:312337667@qq.com 客服QQ:312337667(工作时间:7:00~23:00)

    © Powered by Net188.com X3.4

    快速回复 返回顶部 返回列表