WINDOWS API -- GetSystemMetrics()函数

测试当前程序SystemMetrics的代码--

#include <vector>
#include <fstream>

using namespace std;

class CParam
{
public:
	CParam(){index=0;val=0;name=_T("");};
	~CParam(){};
	int index;
	int val;
	CString name;
};

class CVecParam
{
public:
	CVecParam(){AddParamDefault();};
	~CVecParam(){RemoveAll();};

	void AddParamDefault()
	{
		InsertParam(SM_ARRANGE, _T("SM_ARRANGE "));
		InsertParam(SM_CLEANBOOT, _T("SM_CLEANBOOT "));
//		InsertParam(SM_CMONITORS, _T("SM_CMONITORS "));
		InsertParam(SM_CMOUSEBUTTONS, _T("SM_CMOUSEBUTTONS "));
		InsertParam(SM_CXBORDER, _T("SM_CXBORDER "));
		InsertParam(SM_CYBORDER, _T("SM_CYBORDER "));
		InsertParam(SM_CXCURSOR, _T("SM_CXCURSOR "));
		InsertParam(SM_CYCURSOR, _T("SM_CYCURSOR "));
		InsertParam(SM_CXDLGFRAME, _T("SM_CXDLGFRAME "));
		InsertParam(SM_CYDLGFRAME, _T("SM_CYDLGFRAME "));
		InsertParam(SM_CXDOUBLECLK, _T("SM_CXDOUBLECLK "));
		InsertParam(SM_CYDOUBLECLK, _T("SM_CYDOUBLECLK "));
		InsertParam(SM_CXDRAG, _T("SM_CXDRAG "));
		InsertParam(SM_CYDRAG, _T("SM_CYDRAG "));
		InsertParam(SM_CXEDGE, _T("SM_CXEDGE "));
		InsertParam(SM_CYEDGE, _T("SM_CYEDGE "));
		InsertParam(SM_CXFIXEDFRAME, _T("SM_CXFIXEDFRAME "));
		InsertParam(SM_CYFIXEDFRAME, _T("SM_CYFIXEDFRAME "));
		InsertParam(SM_CXFRAME, _T("SM_CXFRAME "));
		InsertParam(SM_CYFRAME, _T("SM_CYFRAME "));
		InsertParam(SM_CXFULLSCREEN, _T("SM_CXFULLSCREEN "));
		InsertParam(SM_CXHSCROLL, _T("SM_CXHSCROLL "));
		InsertParam(SM_CXHTHUMB, _T("SM_CXHTHUMB "));
		InsertParam(SM_CXICON, _T("SM_CXICON "));
		InsertParam(SM_CYICON, _T("SM_CYICON "));
		InsertParam(SM_CXICONSPACING, _T("SM_CXICONSPACING "));
		InsertParam(SM_CXMAXIMIZED, _T("SM_CXMAXIMIZED"));
		InsertParam(SM_CYMAXIMIZED, _T("SM_CYMAXIMIZED"));
		InsertParam(SM_CXMAXTRACK, _T("SM_CXMAXTRACK"));
		InsertParam(SM_CYMAXTRACK, _T("SM_CYMAXTRACK"));
		InsertParam(SM_CXMENUCHECK, _T("SM_CXMENUCHECK"));
		InsertParam(SM_CYMENUCHECK, _T("SM_CYMENUCHECK"));
		InsertParam(SM_CXMENUSIZE, _T("SM_CXMENUSIZE"));
		InsertParam(SM_CYMENUSIZE, _T("SM_CYMENUSIZE"));
		InsertParam(SM_CXMIN, _T("SM_CXMIN"));
		InsertParam(SM_CYMIN, _T("SM_CYMIN"));
		InsertParam(SM_CXMINIMIZED, _T("SM_CXMINIMIZED"));
		InsertParam(SM_CYMINIMIZED, _T("SM_CYMINIMIZED"));
		InsertParam(SM_CXMINSPACING, _T("SM_CXMINSPACING"));
		InsertParam(SM_CYMINSPACING, _T("SM_CYMINSPACING"));
		InsertParam(SM_CXMINTRACK, _T("SM_CXMINTRACK"));
		InsertParam(SM_CXSCREEN, _T("SM_CXSCREEN"));
		InsertParam(SM_CYSCREEN, _T("SM_CYSCREEN"));
		InsertParam(SM_CXSIZE, _T("SM_CXSIZE"));
		InsertParam(SM_CYSIZE, _T("SM_CYSIZE"));
		InsertParam(SM_CXSIZEFRAME, _T("SM_CXSIZEFRAME"));
		InsertParam(SM_CYSIZEFRAME, _T("SM_CYSIZEFRAME"));
		InsertParam(SM_CXSIZEFRAME, _T("SM_CXSIZEFRAME"));
		InsertParam(SM_CXSMICON, _T("SM_CXSMICON"));
		InsertParam(SM_CYSMICON, _T("SM_CYSMICON"));
		InsertParam(SM_CXSMSIZE, _T("SM_CXSMSIZE"));
		InsertParam(SM_CYSMSIZE, _T("SM_CYSMSIZE"));
//		InsertParam(SM_CXVIRTUALSCREEN, _T("SM_CXVIRTUALSCREEN"));
//		InsertParam(SM_YVIRTUALSCREEN, _T("SM_YVIRTUALSCREEN"));
		InsertParam(SM_CXVSCROLL, _T("SM_CXVSCROLL"));
		InsertParam(SM_CYCAPTION, _T("SM_CYCAPTION"));
		InsertParam(SM_CYKANJIWINDOW, _T("SM_CYKANJIWINDOW"));
		InsertParam(SM_CYMENU, _T("SM_CYMENU"));
		InsertParam(SM_CYSMCAPTION, _T("SM_CYSMCAPTION"));
		InsertParam(SM_CYVTHUMB, _T("SM_CYVTHUMB"));
		InsertParam(SM_DBCSENABLED, _T("SM_DBCSENABLED"));
		InsertParam(SM_DEBUG, _T("SM_DEBUG"));
		InsertParam(SM_MENUDROPALIGNMENT, _T("SM_MENUDROPALIGNMENT"));
		InsertParam(SM_MIDEASTENABLED, _T("SM_MIDEASTENABLED"));
		InsertParam(SM_MOUSEPRESENT, _T("SM_MOUSEPRESENT"));
//		InsertParam(SM_MOUSEWHEELPRESENT, _T("SM_MOUSEWHEELPRESENT"));
		InsertParam(SM_NETWORK, _T("SM_NETWORK"));
		InsertParam(SM_PENWINDOWS, _T("SM_PENWINDOWS"));
		InsertParam(SM_SECURE, _T("SM_SECURE"));
//		InsertParam(SM_SAMEDISPLAYFORMAT, _T("SM_SAMEDISPLAYFORMAT"));
		InsertParam(SM_SHOWSOUNDS, _T("SM_SHOWSOUNDS"));
		InsertParam(SM_SLOWMACHINE, _T("SM_SLOWMACHINE"));
		InsertParam(SM_SWAPBUTTON, _T("SM_SWAPBUTTON"));
//		InsertParam(SM_XVIRTUALSCREEN, _T("SM_XVIRTUALSCREEN"));
	}
	void InsertParam(int i, CString n)
	{
		CParam *pParam = new CParam();

		if (NULL != pParam)
		{
			pParam->index = i;
			pParam->name  = n;
			vecParam.push_back(pParam);
		}
	}
	void GetMetrics()
	{
		vector<CParam *>::iterator it;
		for (it = vecParam.begin(); it!=vecParam.end(); ++it)
		{
			CParam *pParam = *it;
			
			pParam->val = GetSystemMetrics(pParam->index);
		}
	}
	CString FormatMetrics()
	{
		CString strMetrics = _T("");
		vector<CParam *>::iterator it;
		for (it = vecParam.begin(); it!=vecParam.end(); ++it)
		{
			CParam *pParam = *it;
			CString str = _T("");
			str.Format(_T("参数名 : %s , 参数索引 : %d, 参数值 : %d .\r\n"), pParam->name, pParam->index, pParam->val);
			strMetrics += str;
		}
		
		return strMetrics;
	}
	void OutputFile()
	{
		fstream outfile;
		outfile.open("d:\\metrics.txt", ios::out);

		CString str = FormatMetrics();
		outfile<<str.GetBuffer(str.GetLength());
		outfile<<endl;

		outfile.close();

	}
	void RemoveAll()
	{
		vector<CParam *>::iterator it;
		for (it = vecParam.begin(); it!=vecParam.end(); ++it)
		{
			CParam *pParam = *it;
			delete pParam;
			pParam=NULL;
		}
		vecParam.clear();
	};
private:
	vector<CParam *> vecParam;
};



以上测试代码使用方法--

	CVecParam vecParam;
	vecParam.GetMetrics();			//所有的metrics 参数
	vecParam.OutputFile();			//输出到文件 : d:\\xx.txt
	CString strMetrics = vecParam.FormatMetrics();
	CRect   rcClient = CRect(0,0,0,0);	//绘图到视图 -- 可以注释掉该行
	GetClientRect( &rcClient);		//绘图到视图 -- 可以注释掉该行

	pDC->DrawText(strMetrics, rcClient, 0);	//绘图到视图 -- 可以注释掉该行



以下链接转载地址: 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的值则鼠标左右键交换,否则没有。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值