书籍:《Visual C++ 2017从入门到精通》的2.5键盘
环境:visual studio 2022
内容:【例2.43】通过字符消息显示用户按键的字符
说明:以下内容大部分来自腾讯元宝。
GetSystemMetrics()
是 Windows API 中用于获取系统度量或配置设置的函数,其核心功能是通过索引值 nIndex
检索系统参数,所有返回值均以像素为单位。以下是详细说明:
1. 函数功能与参数
- 功能:
检索系统显示元素(如窗口边框、光标尺寸、屏幕分辨率等)或系统配置(如启动模式、多显示器支持等)的参数。 - 参数:
nIndex
(整型):指定要检索的系统参数,分为两类:- SM_CX* 系列:表示宽度(如
SM_CXSCREEN
表示屏幕宽度)。 - SM_CY* 系列:表示高度(如
SM_CYSCREEN
表示屏幕高度)。 - 布尔型参数:返回非零值表示
TRUE
,零表示FALSE
(如SM_DBCSENABLED
表示是否启用双字节字符支持)。
- SM_CX* 系列:表示宽度(如
2. 常用系统参数说明
以下是部分常用参数及其含义:
参数名称 | 含义 | 示例值(Windows 10) |
---|---|---|
SM_CXSCREEN | 屏幕宽度(像素) | 1920 |
SM_CYSCREEN | 屏幕高度(像素) | 1080 |
SM_CXMAXIMIZED | 最大化窗口的默认宽度(像素) | 1600 |
SM_CYMAXIMIZED | 最大化窗口的默认高度(像素) | 900 |
SM_CXBORDER | 窗口边框宽度(3D 窗口时等同于 SM_CXEDGE ) | 4 |
SM_CXCURSOR | 光标宽度(像素,标准箭头为 32x32) | 32 |
SM_CONVERTIBLESLATEMODE | 平板模式状态(0 表示 Slate 模式,非零表示桌面模式) | 0 |
SM_CLEANBOOT | 系统启动方式(0:正常启动,1:安全模式,2:网络安全模式) | 0 |
3. 典型应用场景
-
获取屏幕分辨率:
int cxScreen = GetSystemMetrics(SM_CXSCREEN); int cyScreen = GetSystemMetrics(SM_CYSCREEN);
此方法适用于跨平台兼容性要求不高的场景。
-
计算窗口布局:
通过SM_CXDLGFRAME
(对话框边框厚度)和SM_CYCAPTION
(标题栏高度)动态调整控件位置。 -
检测系统配置:
判断是否支持触摸屏(SM_MAXIMUMTOUCHES
)或双字节字符(SM_DBCSENABLED
)。
4. 注意事项
- 分辨率适配:
SM_CXSCREEN
和SM_CYSCREEN
返回的是物理分辨率,若需逻辑分辨率(如 DPI 缩放),需结合GetDpiForWindow
函数。 - 多显示器支持:
SM_CMONITORS
返回显示器数量,结合EnumDisplayMonitors
可遍历所有显示器。 - 动态参数变化:
若系统配置(如电源模式、多显示器布局)改变,需通过WM_SETTINGCHANGE
消息重新获取参数。
5. 示例代码
#include <windows.h>
#include <iostream>
int main() {
int cxScreen = GetSystemMetrics(SM_CXSCREEN);
int cyScreen = GetSystemMetrics(SM_CYSCREEN);
std::cout << "Screen Resolution: " << cxScreen << "x" << cyScreen << std::endl;
int cxBorder = GetSystemMetrics(SM_CXBORDER);
std::cout << "Window Border Width: " << cxBorder << " pixels" << std::endl;
return 0;
}
通过合理使用 GetSystemMetrics()
,开发者可以实现更灵活的界面适配和系统信息获取。如需完整参数列表,可参考微软官方网页或 CSDN 博客。