《Windows API每日一练》7.4 状态报告上使用计时器
这一节我们使用计时器,每隔一秒获取当前鼠标坐标位置的像素值,并显示在窗口,这就相当于是一个简单的取色器了。
本节必须掌握的知识点:
第47练:取色器
7.4.1 第47练:取色器
/*------------------------------------------------------------------
047 WIN32 API 每日一练
第47个例子WHATCLR.C:使用计时器---显示了鼠标指针当前所指的热点的RGB颜色
FindWindowSize 函数---设置窗口宽和高
CreateIC函数
GetPixel函数
SetPixel函数
GetRValue宏
(c) www.bcdaren.com, 2020
----------------------------------------------------------------*/
#include <windows.h>
#define ID_TIMER 1
void FindWindowSize (int *, int *) ;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("WhatClr") ;
…(略)
//获取窗口宽和高
FindWindowSize (&cxWindow, &cyWindow) ;
hwnd = CreateWindow (szAppName, TEXT ("What Color"), //创建窗口
//重叠、标题、菜单、细框
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER,
CW_USEDEFAULT, CW_USEDEFAULT,
cxWindow, cyWindow,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
//设置窗口宽和高
void FindWindowSize (int * pcxWindow, int * pcyWindow)
{
HDC hdcScreen ;
TEXTMETRIC tm ;
//创建一个设备环境,返回句柄仅限用于获取系统信息
hdcScreen = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
//获取字体信息
GetTextMetrics (hdcScreen, &tm) ;
DeleteDC (hdcScreen) ; //删除设备对象
//窗口宽=2个边框+12个字符平均宽度
* pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER) + 12 * tm.tmAveCharWidth ;
//窗口高(2个边框+1个标题+2个字高)
* pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER) + GetSystemMetrics (SM_CYCAPTION) +
2 * tm.tmHeight ;
}
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
static COLORREF cr, crLast ;
static HDC hdcScreen ;
HDC hdc ;
PAINTSTRUCT ps ;
POINT pt ;
RECT rc ;
TCHAR szBuffer [16] ;
switch (message)
{
case WM_CREATE:
//创建一个信息上下文设备环境--使用显示器设备环境
hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
SetTimer (hwnd, ID_TIMER, 1000, NULL) ; //设置计时器
return 0 ;
case WM_TIMER:
GetCursorPos (&pt) ; //获取鼠标位置信息
cr = GetPixel (hdcScreen, pt.x, pt.y) ; //获取指定位置的GRB颜色
SetPixel (hdcScreen, pt.x, pt.y, 0) ; //指定位置设置一个黑色像素
if (cr != crLast) //如果和上次获取的颜色不同
{
crLast = cr ;
InvalidateRect (hwnd, NULL, FALSE) ; //重绘窗口
}
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rc) ;
//获取颜色值-十六进制
wsprintf (szBuffer, TEXT (" %02X %02X %02X "),
GetRValue (cr), GetGValue (cr), GetBValue (cr)) ;
DrawText (hdc, szBuffer, -1, &rc,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //显示颜色值
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
DeleteDC (hdcScreen) ; //删除设备
KillTimer (hwnd, ID_TIMER) ; //删除计时器
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/******************************************************************************
CreateIC函数:创建指定装置的信息的上下文。
信息上下文提供了一种无需创建设备上下文(DC)即可快速获取有关设备信息的方法。
但是,GDI绘图功能不能接受信息上下文的句柄。
HDC CreateICA(
LPCSTR pszDriver,//指向以空字符结尾的字符串的指针,该字符串指定设备驱动程序的名称(例如,Epson)。
LPCSTR pszDevice,//指向以空字符结尾的字符串的指针,该字符串指定正在使用的特定输出设备的名称,如打印管理器
LPCSTR pszPort,//该参数将被忽略,应设置为NULL。
const DEVMODEA *pdm //指向DEVMODE结构的指针,该结构包含设备驱动程序的设备特定的初始化数据。
);
*******************************************************************************
GetPixel函数:检索在指定坐标的红,绿,蓝(RGB)颜色的像素值。
COLORREF GetPixel(
HDC hdc, //设备上下文
int x, //要检查的像素的X坐标(以逻辑单位表示)。
int y //要检查的像素的y坐标(以逻辑单位表示)。
);
*******************************************************************************
SetPixel函数:设置指定坐标的指定颜色像素。
COLORREF SetPixel(
HDC hdc, //设备上下文
int x, //要检查的像素的X坐标(以逻辑单位表示)。
int y, //要检查的像素的y坐标(以逻辑单位表示)。
COLORREF color//用于绘制点的颜色。若要创建COLORREF颜色值,请使用RGB宏。
);
*******************************************************************************
GetRValue宏:检索用于红,绿,蓝(RGB)值的红色成分的强度值。
void GetRValue(
rgb //指定RGB颜色值。
);
*/
运行结果:
图7-5 取色器
总结
实例WHATCLR.C在WinMain主程序中创建一个cxWindow宽和cyWindow高的窗口。cxWindow宽和cyWindow高是由自定义函数FindWindowSize获取的。
●FindWindowSize函数
//创建一个设备环境,返回句柄仅限用于获取系统信息,"DISPLAY"表示显示器设备
hdcScreen = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
//获取字体信息
GetTextMetrics (hdcScreen, &tm) ;
DeleteDC (hdcScreen) ; //删除设备对象
//窗口宽=2个边框+12个字符平均宽度
* pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER) +
12 * tm.tmAveCharWidth ;
//窗口高(2个边框+1个标题+2个字高)
* pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER) +
GetSystemMetrics (SM_CYCAPTION) + 2 * tm.tmHeight ;
●窗口过程
处理WM_CREATE消息,调用CreateDC函数获取显示器设备"DISPLAY"的句柄。然后调用SetTimer创建一个间隔时间为1秒的计时器。
处理WM_TIMER消息,调用GetCursorPos函数获取当前鼠标位置坐标,然后调用GetPixel函数获取当前鼠标位置坐标处的像素值,并调用SetPixel函数绘制一个黑色像素点标识鼠标位置。如果当前鼠标坐标点的像素值与上次获取的像素值不同,则重绘窗口。
处理WM_PAINT消息,调用GetClientRect函数,获取当前窗口客户区矩形。然后调用DrawText函数在窗口绘制RGB颜色值。
【注意】GetPixel函数获取的像素值需要使用GetRValue宏将其分解为RGB颜色值。
处理WM_DESTROY消息时,删除屏幕设备环境句柄,销毁计时器后发送WM_QUIT消息结束。
相关文章:

《Windows API每日一练》7.4 状态报告上使用计时器
这一节我们使用计时器,每隔一秒获取当前鼠标坐标位置的像素值,并显示在窗口,这就相当于是一个简单的取色器了。 本节必须掌握的知识点: 第47练:取色器 7.4.1 第47练:取色器 /*----------------------------…...
python实现API调用缓存
python实现API调用缓存 1.代码2.输出3.保存的json数据 想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据 1.代码 import jsondef get_variable_name(var):变量转变量名local_varsglobals()return [name for name, value in local_vars.ite…...

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块
无线音频应用中,远距离音频传输在许多领域具有广泛的应用需求,例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求,音频传输模块需要具备一些关键特性,包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…...
前端css性能优化
前端css性能优化 1. 减少样式表数量和压缩文件大小: 通过合并多个样式表、删除未使用的样式、压缩样式表等方式来减少样式表数量和大小,从而减少网络请求和提高加载速度。 通常来说,样式文件会被浏览器缓存,进入到其他页面样式文件…...
如何在Windows上使用Docker搭建PHP开发环境
前言 在本地搭建开发环境我好像没几年就要折腾一次,因为本地开发电脑使用的是windows,早些年的时候,用过很多类似WAMP之类的东西,但最终都有或多或少不满意的地方,前两年的时候,还折腾过WSL,但…...
java 单例模式
Java中实现单例模式的常见方式有两种:懒汉式和饿汉式。以下是这两种方式的简单示例: 饿汉式 饿汉式单例模式在类加载时就完成了实例的初始化,以空间换时间,确保了实例的唯一性。 public class Singleton {// 在自己内部定义自己…...
爬虫 属性 方法
在Python中,爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库,用于从HTML或XML文件中提取数据。它创建了一个解析树,方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先,你需要安装BeautifulSoup和lxml&…...

HEX文件
什么是hex文件 以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准,hex的全称是Intel HEX,此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。HEX的英语原始意思是16进制…...
人机融合的智能操作系统
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。它的职责常包括对硬件的直接监管、对各种计算资源(如内存、处理器时间等)的管理、以及提供诸如…...

数据结构之二叉树概念
数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树(二叉排序树、二叉查找树),平衡二叉树红黑树 B树类型B树(B-树、B_树)B树B*树 二叉树 简介 二叉树(Binary Tree) :是一种非常重要…...

Linux源码阅读笔记08-进程调度API系统调用案例分析
kthread_create_on_node kthread_create_on_node函数功能:指定存储节点创建新内核线程。源码如下: 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…...

短视频抓取:成都柏煜文化传媒有限公司
短视频抓取:技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展,短视频平台如雨后春笋般涌现,成为现代人生活娱乐的重要组成部分。然而,在海量短视频内容中,如何高效、准确地抓取目标视频,成为了一个…...
proto的前后端使用
首先定义一个input.proto文件 内容如下 syntax "proto3";message InputData {int32 UserId 1; // 将 number 改为 int32 或 int64string UserInput 2;string DrunkState 3; }message ResponseData {string AIResponse 1;string prompt 2;string emoti…...

华为解决固态硬盘致命弱点:延长30~50%的SSD寿命
如今的SSD容量越做越大,企业级SSD容量已达30TB、60TB的、甚至120TB。但SSD寿命一直是“致命伤”,越大容量的盘,出现故障后,丢失的数据就越多。 近日, 华为数据存储发文,揭开华为全闪分布式存储让SSD大盘更“…...
登录验证码高扩展性设计方案
登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案,通过工厂模式策略模式,增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性,实现了服务组件的多样化,降低了维护成本 登录验证码高…...
Spring MVC数据绑定和响应——数据回写(一)普通字符串的回写
接下来通过HttpServletResponse输出数据的案例,演示普通字符串的回写,案例具体实现步骤如下。 1、创建一个数据回写类DataController,在DataController类中定义showDataByResponse()方法,用于测试在Spring MVC中普通字符串的回写…...
怎样才能更好地保护个人账号的安全
怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分,以下是一些有效的措施来增强账号的安全性: 1. 使用强密码 复杂性:创建包含大小写字母、数字和特殊字符的密码。长度:密码至少应有12个字符长。唯一…...
react native优质开源项目
React Native 是一个非常流行的用于构建跨平台移动应用程序的框架,开源社区贡献了许多优质的项目和库。以下是一些备受认可的 React Native 开源项目,适合用来学习和参考: ### 1. **React Native Elements** [React Native Elements](https:…...
速盾:海外cdn有哪些优缺点呢?
海外 CDN(内容分发网络)是一种通过在全球多个节点上分布内容来加速网站访问速度的服务。它通过将网站的静态内容缓存到全球各地的服务器上,使用户可以从最近的服务器获取内容,从而提高网站的响应速度和用户体验。然而,…...

Unity Shader 软粒子
Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候,就需要一些粒子点缀,此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点,可以用Vertex Color与…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...