RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 796372
Accepted
invzbl3
invzbl3
Asked:2020-03-11 08:50:59 +0000 UTC2020-03-11 08:50:59 +0000 UTC 2020-03-11 08:50:59 +0000 UTC

关于GetSysColor函数的问题

  • 772

我正在编写一个应该显示有关系统信息的程序。

任务是这样的:

编写程序以使用 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();
}
c
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Harry
    2020-03-11T13:18:31Z2020-03-11T13:18:31Z

    你对这个函数返回的值有点误解。这不是“1 是蓝色,2 是绿色......”。此输出采用 RGB 字节的形式,即 一个以十六进制表示的数字,其形式为bbggrr,其中rr是颜色的红色分量,gg是绿色,bb是蓝色。所以灰色很重要7f7f7f。而且颜色不是控制台窗口的颜色,而是常规应用程序窗口的颜色。

    如果您像这样编辑代码

    printf("Цвет рабочего стола: %06X\n", GetSysColor(1));
    printf("Текст в окнах: %06X\n",       GetSysColor(8));
    printf("Фон окна: %06X\n",            GetSysColor(5));
    

    然后,例如,我得到

    Цвет рабочего стола: A56E3A
    Текст в окнах: 000000
    Фон окна: FFFFFF
    

    那些。白色背景上的黑色文本,好吧,桌面的颜色是在此处输入图像描述

    添加这样的东西来破译颜色

    printf("Красный - %02X, зеленый - %02X, синий - %02x\n",
           GetRValue(GetSysColor(1)),
           GetGValue(GetSysColor(1)),
           GetBValue(GetSysColor(1)));
    

    会更清楚。

    • 3
  2. user496245
    2022-06-20T06:04:04Z2022-06-20T06:04:04Z

    颜色可以通过getsolidbruh()创建,但是在收到画笔上下文后,必须删除,而当接收到系统颜色,或者更确切地说是通过GetSysColor()函数接收到系统颜色上下文时,是不能删除的。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5