mfc-MFC的GetSystemMetrics()函数的问题

问题描述

MFC的GetSystemMetrics()函数的问题

菜鸟一枚。
看这个函数的时候没搞懂。。。
问题如下:
我看到函数的参数有这两个
SM_CXSIZEFRAME,

SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度

这俩用时有啥区别吗。。还是说一个是计算边框水平部分的厚度,另一个是边框竖直部分的厚度的?

另:SM_CXSIZE,SM_CYSIZE 以像素计算的标题栏按钮的尺寸
对于这个参数值。。如果标题栏按钮有多个,怎么知道此“按钮的尺寸”指的是哪个呢。。
本人新手。。理解能力不好。。望大家赐教

解决方案

标题栏按钮就是最大化,最小化,关闭这几个按钮,
这几个按钮的大小,和标题栏的文字大小相关
每个按钮一样大,不会有不同大小的按钮
这是系统设置,基本上程序都是遵守的,所以平时编码也可以不必关心
偶尔用用,也不用考虑太复杂

解决方案二:

int WINAPI GetSystemMetrics( __in int nIndex);
  下面是GetSystemMetrics函数参数nIndex的定义:
  SM_ARRANGE 标志用于说明系统如何安排最小化窗口..详细请参看下方备注.:
  根据显示器显示的不同,系统数据可能有所不同.
  该SM_ARRANGE设置指定系统如何安排最小化窗口,并包含一个起始位置和方向。起始位置可为下列值之一.
  
Value Meaning
ARW_BOTTOMLEFT 开始在左下角的屏幕(默认位置) 。
ARW_BOTTOMRIGHT 开始在右下角的屏幕上。相当于ARW_STARTRIGHT.
ARW_HIDE 在屏幕可见区域,隐藏并最小化窗口。.
ARW_TOPLEFT 从左上角的屏幕上。相当于ARV_STARTTOP.
ARW_TOPRIGHT 相当于ARW_STARTTOP | SRW_STARTRIGHT 。 方向的安排可以为下列值之一。
  
Value Meaning
ARW_DOWN 纵向排列,从上到下。
ARW_LEFT 水平排列,从左到右。
ARW_RIGHT 水平排列,从右到左。
ARW_UP 纵向排列,从下到上。 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 以像素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
  SM_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的值则鼠标左右键交换,否则没有。
GetSystemMetrics - index值
  SM_CXSCREEN = 0 'X Size of screen
  SM_CYSCREEN = 1 'Y Size of Screen
  SM_CXVSCROLL = 2 'X Size of arrow in vertical scroll bar.
  SM_CYHSCROLL = 3 'Y Size of arrow in horizontal scroll bar
  SM_CYCAPTION = 4 'Height of windows caption
  SM_CXBORDER = 5 'Width of no-sizable borders
  SM_CYBORDER = 6 'Height of non-sizable borders
  SM_CXDLGFRAME = 7 'Width of dialog box borders
  SM_CYDLGFRAME = 8 'Height of dialog box borders
  SM_CYHTHUMB = 9 'Height of scroll box on horizontal scroll bar
  SM_CXHTHUMB = 10 ' Width of scroll box on horizontal scroll bar
  SM_CXICON = 11 'Width of standard icon
  SM_CYICON = 12 'Height of standard icon
  SM_CXCURSOR = 13 'Width of standard cursor
  SM_CYCURSOR = 14 'Height of standard cursor
  SM_CYMENU = 15 'Height of menu
  SM_CXFULLSCREEN = 16 'Width of client area of maximized window
  SM_CYFULLSCREEN = 17 'Height of client area of maximized window
  SM_CYKANJIWINDOW = 18 'Height of Kanji window
  SM_MOUSEPRESENT = 19 'True is a mouse is present
  SM_CYVSCROLL = 20 'Height of arrow in vertical scroll bar
  SM_CXHSCROLL = 21 'Width of arrow in vertical scroll bar
  SM_DEBUG = 22 'True if deugging version of windows is running
  SM_SWAPBUTTON = 23 'True if left and right buttons are swapped.
  SM_CXMIN = 28 'Minimum width of window
  SM_CYMIN = 29 'Minimum height of window
  SM_CXSIZE = 30 'Width of title bar bitmaps
  SM_CYSIZE = 31 'height of title bar bitmaps
  SM_CXMINTRACK = 34 'Minimum tracking width of window
  SM_CYMINTRACK = 35 'Minimum tracking height of window
  SM_CXDOUBLECLK = 36 'double click width
  SM_CYDOUBLECLK = 37 'double click height
  SM_CXICONSPACING = 38 'width between desktop icons
  SM_CYICONSPACING = 39 'height between desktop icons
  SM_MENUDROPALIGNMENT = 40 'Zero if popup menus are aligned to the left of the memu bar item. True if it is aligned to the right.
  SM_PENWINDOWS = 41 'The handle of the pen windows DLL if loaded.
  SM_DBCSENABLED = 42 'True if double byte characteds are enabled
  SM_CMOUSEBUTTONS = 43 'Number of mouse buttons.
  SM_CMETRICS = 44 'Number of system metrics
  SM_CLEANBOOT = 67 'Windows 95 boot mode. 0 = normal, 1 = safe, 2 = safe with network
  SM_CXMAXIMIZED = 61 'default width of win95 maximised window
  SM_CXMAXTRACK = 59 'maximum width when resizing win95 windows
  SM_CXMENUCHECK = 71 'width of menu checkmark bitmap
  SM_CXMENUSIZE = 54 'width of button on menu bar
  SM_CXMINIMIZED = 57 'width of rectangle into which minimised windows must fit.
  SM_CYMAXIMIZED = 62 'default height of win95 maximised window
  SM_CYMAXTRACK = 60 'maximum width when resizing win95 windows
  SM_CYMENUCHECK = 72 'height of menu checkmark bitmap
  SM_CYMENUSIZE = 55 'height of button on menu bar
  SM_CYMINIMIZED = 58 'height of rectangle into which minimised windows must fit.
  SM_CYSMCAPTION = 51 'height of windows 95 small caption
  SM_MIDEASTENABLED = 74 'Hebrw and Arabic enabled for windows 95
  SM_NETWORK = 63 'bit o is set if a network is present.
  SM_SECURE = 44 'True if security is present on windows 95 system
  SM_SLOWMACHINE = 73 'true if machine is too slow to run win95.
GetSystemMetrics - 用法
  GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个索引有75个 标识符,通过设置不同的标识符就可以获取系统分辨率、 窗体显示区域的宽度和高度、滚动条的宽度和高度。
  为了使使GetSystemMetrics的功能,我们以获取系统分辨率为例,并将其中的两个值用TextOut输出到窗体中。
  第一步:用GetSystemMetrics获取屏幕的宽度和高度
  1.intx, y;
  2.x = GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
  3.y = GetSystemMetrics(SM_CYSCREEN);//屏幕高度
  第二步:用TextOut输出分辨率
  因为x和y的值是int类型,所以无法用TextOut直接输出,需要借助wsprintf函数,在C中,可以用printf函数直接将字符串输出到屏幕上,但wsprintf是将字符串输出到一个char字符 数组中,而且wsprintf会返回输出字符串的长度。
  1.TCHARszBuffer[10];
  2.intx =1024;
  3.inty =768;
  4.intiLength;
  5.iLength = wsprintf(szBuffer, TEXT("%5d"),x);
  小提示:szBuffer数组的长度一定要大于x的长度,否则不能输出。
  以上这段代码,是用wsprintf将x的值存入szBuffer中,然后在iLength中存放x的长度。这一步实际上解决了两个问题,将int类型的屏幕宽度转为了TCHAR类型,TextOut函数可以直接输出TCHAR类型字符串,而且获取了字符串的长度,那么我们就可以用TextOut函数在窗体中输出屏幕的宽度:
  TextOut(hdc, 0, 0, szBuffer, iLength);

解决方案三:

 GetSystemMetrics()函数的功能很多,当传递的参数为SM_CYSCREEN、SM_CXSCREEN时,可以得到屏幕高和宽的像素值。例子 如下:

 CRect    rect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

 这样,rect中存储的就是整个电脑屏幕的大小,如果再MoveWindow(&rect),你就可以自己实现对话框的全屏功能。

解决方案四:

一个是 X 方向,一个是 Y 方向
SM_CXSIZE,SM_CYSIZE 以像素计算的标题栏按钮的尺寸,应该是指整体的尺寸,而不是一个按钮的。
建议你自己编写代码试试,看看实际返回的数值就能知道它的含义。

时间: 2025-01-02 23:45:53

mfc-MFC的GetSystemMetrics()函数的问题的相关文章

关联-mfc 如何捕获UpdateData函数的异常

问题描述 mfc 如何捕获UpdateData函数的异常 UpdateData(true)后如果编辑框关联的变量与用户输入的变量类型不符,例如要求输入数字用户输入的是字母,调用UpdateData(true)可以弹出提示,说明用户输入有误,那么我怎么能从UpdateData(true)函数中获取用户的错误类型呢? 解决方案 重写ddv函数http://www.cnblogs.com/mavaL/articles/1860413.htmlhttp://blog.csdn.net/laogaoav/

c++-MFC怎么在普通的函数中操作窗口类的成员变量

问题描述 MFC怎么在普通的函数中操作窗口类的成员变量 例如我想在函数f中操作CtestDlg类的变量e.该怎么做? 解决方案 定义一个全局变量 CtestDlg dlg 创建对话框给它赋值 e定义成public的 用dlg.e 得到变量. 解决方案二: 类的普通成员函数的指针类普通成员函数与函数的区别类成员函数与普通函数的区别 解决方案三: 给函数传入形参,用引用&实现

GetSystemMetrics()函数的用法

可以用GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率.窗体显示区域的宽度和高度.滚动条的宽度和高度. 为了使使GetSystemMetrics的功能,我们以获取系统分辨率为例,并将其中的两个值用TextOut输出到窗体中. 第一步:用GetSystemMetrics获取屏幕的宽度和高度 int x, y; x = GetSystemMet

mfc控件位置调整和坐标确定 .

http://my.oschina.net/u/131904/blog/39804 在mfc工程中控件或者窗口位置的调整是经常遇到的,特别是基于对话框的工程.位置的调整包括坐标.长度和宽度的变化,一般在窗口类的OnSize函数中实现.控件位置的调整涉及的函数有:GetWindowRect().ScreenToClient().GetClientRect().MoveWindow()或SetWindowPos(),功能意义如下: GetWindowRect():获得窗口在屏幕上的矩形坐标,调整控件

VC MFC专题

MFC程序如何实现给对话框添加背景图片 MFC游戏开发笔记十 游戏中的碰撞检测进阶:地图类型&障碍物 MFC游戏开发笔记九 游戏中的碰撞判定初步&怪物运动简单AI MFC游戏开发笔记八 游戏特效的实现(二):粒子系统 MFC游戏开发笔记七 游戏特效的实现(一):背景滚动 MFC游戏开发笔记六 图像双缓冲技术:实现一个流畅的动画 MFC游戏开发笔记五 定时器和简单动画 MFC游戏开发笔记四 键盘响应和鼠标响应:让人物动起来 MFC游戏开发笔记三 游戏贴图与透明特效的实现 MFC游戏开发笔记二

MFC教程(13)-MFC工具条和状态栏(1)

Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口(ToolTip). Windows在一个DLL加载时注册个控制窗口的"窗口类".例如,工具条的"窗口类"是"ToolbarWindow32",状态栏的"窗口类"是"msctls_statusbar32",工具条提示窗口的"

接触VC之三:MFC基于对话框程序

最近,本人赶时髦,装上了一套Visual Studio.net,安装要2213M呢,硬盘上三个盘符总共剩下不足2G的地方了.不过,界面相当的漂亮,且功能强大,值得心慰.我终于可以在类视图上,尽情去看类的基类,以及基类的实现代码了.不仅如此,最好的是那附带的MSDN上所有的VC基础文章都是中文,翻译的比希望出版社的好得没的说.什么文档啊,框加窗口啊,多视图啊,应有尽有.所以建议大家都来用.net的吧,注意是要那七张盘的,三张的是beta版,VC功能不全的. 这部分该说一说MFC的具体程序了.因为我

使用MFC编写打印程序

摘要 本文首先介绍了利用MFC提供的文档视图框架来实现一个打印程序,实现打印预览,在此基础上,同时通过对MFC源代码的深入探讨,提出了利用该方法在对话框上用MFC实现打印功能,结果表明,利用MFC实现打印不仅方便,而且功能很强大,能够根据不同的需求很方便的打印出所需要的格式.本文还实现了一个在对话框中利用MFC实现打印功能的一个框架结构,对于使用者只要使用该结构就可以按照自己的要求打印任何内容. 关键词:Visual C++ ,MFC,对话框, 打印 ,打印预览 引言 打印程序的编写在windo

MFC教程(2)-- MFC和Win32

MFC Object和Windows Object的关系 MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一.所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象:所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows O