• GetSystemMetrics()函数的用法 转


    转自 http://www.cnblogs.com/lidabo/archive/2012/07/10/2584725.html

    可以用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的值则鼠标左右键交换,否则没有。

  • 相关阅读:
    VC实现开机自启动
    用Shell扩展实现源代码统计程序
    在(CListView)列表视图中添加右键菜单的方法
    关于打开外部程序并且发送一个按键消息 (转
    vc中运行外部程序的方法
    如何在 XCode 4.2 設定部分程式碼不使用 ARC 方式分享(转)
    Xcode调试断点不停止解决方案!(转)
    NSString+NSMutableString+NSValue+NSAraay用法汇总 (转)
    对于Retain和Assign属性的理解(转)
    基于Xcode4开发第一个iPhone程序:“Hello World”(转)
  • 原文地址:https://www.cnblogs.com/wolfplan/p/6365789.html
Copyright © 2020-2023  润新知