zoukankan      html  css  js  c++  java
  • 【转】获取屏幕分辨率及大小相关

    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 及更早版本的支持

    当显示器分辨率改时时,发送这个消息 WM_DISPLAYCHANGED

    源地址

  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/pavkoo/p/3332675.html
Copyright © 2011-2022 走看看