zoukankan      html  css  js  c++  java
  • GetSystemMetrics()

    GetSystemMetrics()函数的用法

     

    可以用GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。

    为了使使GetSystemMetrics的功能,我们以获取系统分辨率为例,并将其中的两个值用TextOut输出到窗体中。

    第一步:用GetSystemMetrics获取屏幕的宽度和高度

    1. int x, y;
    2. x = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度
    3. y = GetSystemMetrics(SM_CYSCREEN); //屏幕高度

    第二步:用TextOut输出分辨率

    因为x和y的值是int类型,所以无法用TextOut直接输出,需要借助wsprintf函数,在C中,可以用printf函数直接将字符串输出到屏幕上,但wsprintf是将字符串输出到一个char字符数组中,而且wsprintf会返回输出字符串的长度。

    1. TCHAR szBuffer[10];
    2. int x = 1024;
    3. int y = 768;
    4. int iLength;
    5. iLength = wsprintf(szBuffer, TEXT("%5d"), x);

    小提示:szBuffer数组的长度一定要大于x的长度,否则不能输出。

    以上这段代码,是用wsprintf将x的值存入szBuffer中,然后在iLength中存放x的长度。这一步实际上解决了两个问题,将int类型的屏幕宽度转为了TCHAR类型,TextOut函数可以直接输出TCHAR类型字符串,而且获取了字符串的长度,那么我们就可以用TextOut函数在窗体中输出屏幕的宽度:

    1. TextOut(hdc, 0, 0, szBuffer, iLength);

    本文的重点是GetSystemMetrics函数,该函数的75个索引标识符我没一个一个的试,反正只要知道这个函数的作用就行了。在本文中wsprintf函数是解决int转string的问题,本来想直接在TextOut中使用IntToStr函数来输出int类型的值,但没弄清IntToStr函数在哪个头文件中,总用不上。IntToStr函数我以前用过,在C++中应该有这个函数的。

     

    获取窗体显示区域大小

    已我现在的了解,获取窗体显示区域大小有三种方法。

    第一种方法:使用GetSystemMetrics函数

    1. GetSystemMetrics(SM_CXFULLSCREEN); //获取最大化窗体的显示区域宽度
    2. GetSystemMetrics(SM_CYFULLSCREEN); //获取最大化窗体的显示区域高度

    第二种方法:使用GetClientRect函数

    该函数的原型如下:

    1. BOOL GetClientRect(
    2.   HWND hWnd,      // handle to window
    3.    LPRECT lpRect   // client coordinates
    4. );

    书上没介绍该函数的使用方法,看MSDN的示例代码,经过测试,其使用方法如下:

    1. RECT rect;
    2. hdc = BeginPaint (hwnd, &ps) ;
    3. GetClientRect(hwnd, &rect);
    4. x = rect.right;
    5. y = rect.bottom;
    6. SetTextAlign(hdc, TA_RIGHT | TA_TOP);
    7. TextOut(hdc, 100, 0, szBuffer, wsprintf(szBuffer,TEXT("%5d"), x));
    8. TextOut(hdc, 100, cyChar,szBuffer, wsprintf(szBuffer, TEXT("%5d"), y));
    9. EndPaint (hwnd, &ps) ;

     

    第三种方法:LOWORD和HIWORD宏

    1. case WM_SIZE:
    2.      x = LOWORD(lParam);
    3.      y = HIWORD(lParam);

     

    下面是GetSystemMetrics函数参数nIndex的定义:

     

    SM_ARRANGE 返回是否预备最小化.
    SM_CLEANBOOT 返回系统启动方式:
        0 正常启动
        1 安全模式启动
        2 网络安全模式启动
    SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。
    SM_CXBORDER,
    SM_CYBORDER 返回以相素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则
    等同于SM_CXEDGE参数
    SM_CXCURSOR,
    SM_CYCURSOR 返回以相素值为单位的标准光标的宽度和高度
    SM_CXDLGFRAME,
    SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
    SM_CXDOUBLECLK,
    SM_CYDOUBLECLK 以相素值为单位的双击有效的矩形区域
    SM_CXEDGE,SM_CYEDGE 以相素值为单位的3D边框的宽度和高度
    SM_CXFIXEDFRAME,
    SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
    SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
    SM_CXFULLSCREEN,
    SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
    SM_CXHSCROLL,
    SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
    SM_CXHTHUMB 以相素为单位的水平滚动条上的滑动块宽度
    SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
    SM_CXICONSPACING,
    SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
    SM_CXICON and SM_CYICON.
    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_CXMINTRACK,
    SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
    SM_CXSCREEN,
    SM_CYSCREEN 以相素为单位计算的屏幕尺寸。
    SM_CXSIZE,SM_CYSIZE 以相素计算的标题栏按钮的尺寸
    SM_CXSIZEFRAME,
    SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
    SM_CXSMICON,
    SM_CYSMICON 以相素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
    M_CXVSCROLL,
    SM_CYVSCROLL 以相素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
    SM_CYCAPTION 以相素计算的普通窗口标题的高度
    SM_CYMENU 以相素计算的单个菜单条的高度
    SM_CYSMCAPTION 以相素计算的窗口小标题栏的高度
    SM_CYVTHUMB 以相素计算的垂直滚动条中滚动块的高度
    SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
    SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
    SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
    SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
    SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
    SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。

  • 相关阅读:
    VS 2008潜在强大的功能:提取EXE文件中的ICO等资源
    园友们注意:淘宝网上QQ会员 4钻 3元 等都为骗子行为
    Comet Async Process Request Handler
    WCF(Sender) to MSMQ to WCF(Receiver)
    ASP.NET Web Form GridView DetailsView Query Edit
    WCF NetTcp AsyncQueue Service
    Xml CDATA 序列化
    Sync Invoke Remoting Async Invoke
    .Net 4.0 Remoting ConcurrentQueue
    Socket Async Receive Data to LinkedList Buffer (telnet proxy server)
  • 原文地址:https://www.cnblogs.com/suanec/p/3895239.html
Copyright © 2011-2022 走看看