我正在编写一个应该显示有关系统信息的程序。
任务是这样的:
编写程序以使用 Win32 API 函数获取系统信息:GetSystemInfo()、GetSysColor()、GetSystemMetrics()。提供从键盘输入命令。
使用GetSysColor()函数的颜色输出(在程序中的“系统颜色”部分)存在问题,因为程序应显示与指定显示元素的颜色相对应的数字。但是在编译时,总是使用 , 参数输出零,但它输出相同的一组数字。COLOR_DESKTOP (= 1)
COLOR_WINDOWTEXT (= 8)
COLOR_WINDOW (= 5)
16777215
为了检查,我尝试在 PC 个性化中更改背景颜色,但程序继续显示相同的值。在阅读了此处的文档后,我发现了这个细微差别:
该函数返回给定元素的红、绿、蓝 (RGB) 颜色值。
如果 nIndex 参数超出范围,则返回值为零。因为零也是一个有效的 RGB 值,所以您不能使用 GetSysColor 来确定当前平台是否支持系统颜色。相反,请使用 GetSysColorBrush 函数,如果不支持该颜色,该函数将返回 NULL。
为了检查是否支持颜色,我决定在其他 PC 上进行检查,但结果保持不变。
为什么函数GetSysColor
对不同的颜色返回相同的值?
代码本身:
#include "stdafx.h"
#include <stdlib.h>
#include "iostream"
#include <windows.h>
#include <string>
#include <VersionHelpers.h>
#include <stdio.h>
#include <conio.h>
#pragma comment(lib, "user32.lib")
int main() {
setlocale(LC_ALL, "rus");
int count = 0;
SYSTEM_INFO siSysInfo; // Скопировать информацию об оборудовании в структуру SYSTEM_INFO.
GetSystemInfo(&siSysInfo); // Отображение содержимого структуры SYSTEM_INFO.
printf("1.Информация о системе \n");
printf("2.Системные метрики \n");
printf("3.Системные цвета \n");
printf("\n");
printf("Введите число: ");
scanf_s("%d", &count);
printf("\n");
system("cls");
switch (count) {
case 1:
printf("Aппаратная информация: \n");
printf("......................\n");
printf("OEM-идентификатор: %u\n", siSysInfo.dwOemId);
printf("Количество процессоров: %u\n",
siSysInfo.dwNumberOfProcessors);
printf("Размер страницы: %u\n", siSysInfo.dwPageSize);
printf("Тип процессора: %u\n", siSysInfo.dwProcessorType);
printf("Минимальный адрес приложения: %p\n",
siSysInfo.lpMinimumApplicationAddress);
printf("Максимальный адрес приложения: %p\n",
siSysInfo.lpMaximumApplicationAddress);
printf("Маска активного процессора: %u\n",
siSysInfo.dwActiveProcessorMask);
break;
case 2:
printf("Системные метрики: \n");
printf("..................\n");
printf("Разрешение экрана: %dx%d\n",
GetSystemMetrics(0), GetSystemMetrics(1));
printf("Ширина курсора в пикселях: %d\n",
GetSystemMetrics(13));
printf("Минимальная ширина окна в пикселях: %d\n",
GetSystemMetrics(28));
printf("Минимальная ширина окна в пикселях: %d\n",
GetSystemMetrics(47));
printf("Количество мониторов на рабочем столе: %d\n",
GetSystemMetrics(80));
break;
case 3:
printf("Системные цвета: \n");
printf("................\n");
printf("Цвет рабочего стола: %u\n",
GetSysColor(1));
printf("Текст в окнах: %u\n",
GetSysColor(8));
printf("Фон окна: %u\n",
GetSysColor(5));
printf("\n");
printf("\n");
printf("Значение цифр: \n");
printf("0 — черный\n");
printf("1 — синий\n");
printf("2 — зеленый\n");
printf("3 — голубой\n");
printf("4 — красный\n");
printf("5 — лиловый\n");
printf("6 — желтый\n");
printf("7 — белый\n");
printf("8 — серый\n");
printf("9 — свело-синий\n");
printf("A — светло-зеленый\n");
printf("B — светло-голубой\n");
printf("С — светло-красный\n");
printf("E — светло-желтый\n");
printf("F — ярко-белый\n");
break;
default: {
printf("Error");
}
}
_getch();
}
你对这个函数返回的值有点误解。这不是“1 是蓝色,2 是绿色......”。此输出采用 RGB 字节的形式,即 一个以十六进制表示的数字,其形式为
bbggrr
,其中rr
是颜色的红色分量,gg
是绿色,bb
是蓝色。所以灰色很重要7f7f7f
。而且颜色不是控制台窗口的颜色,而是常规应用程序窗口的颜色。如果您像这样编辑代码
然后,例如,我得到
那些。白色背景上的黑色文本,好吧,桌面的颜色是
添加这样的东西来破译颜色
会更清楚。
颜色可以通过getsolidbruh()创建,但是在收到画笔上下文后,必须删除,而当接收到系统颜色,或者更确切地说是通过GetSysColor()函数接收到系统颜色上下文时,是不能删除的。