当前位置: 首页 > news >正文

《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 状态报告上使用计时器

这一节我们使用计时器&#xff0c;每隔一秒获取当前鼠标坐标位置的像素值&#xff0c;并显示在窗口&#xff0c;这就相当于是一个简单的取色器了。 本节必须掌握的知识点&#xff1a; 第47练&#xff1a;取色器 7.4.1 第47练&#xff1a;取色器 /*----------------------------…...

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大功率发射模块

无线音频应用中&#xff0c;远距离音频传输在许多领域具有广泛的应用需求&#xff0c;例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求&#xff0c;音频传输模块需要具备一些关键特性&#xff0c;包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…...

前端css性能优化

前端css性能优化 1. 减少样式表数量和压缩文件大小&#xff1a; 通过合并多个样式表、删除未使用的样式、压缩样式表等方式来减少样式表数量和大小&#xff0c;从而减少网络请求和提高加载速度。 通常来说&#xff0c;样式文件会被浏览器缓存&#xff0c;进入到其他页面样式文件…...

如何在Windows上使用Docker搭建PHP开发环境

前言 在本地搭建开发环境我好像没几年就要折腾一次&#xff0c;因为本地开发电脑使用的是windows&#xff0c;早些年的时候&#xff0c;用过很多类似WAMP之类的东西&#xff0c;但最终都有或多或少不满意的地方&#xff0c;前两年的时候&#xff0c;还折腾过WSL&#xff0c;但…...

java 单例模式

Java中实现单例模式的常见方式有两种&#xff1a;懒汉式和饿汉式。以下是这两种方式的简单示例&#xff1a; 饿汉式 饿汉式单例模式在类加载时就完成了实例的初始化&#xff0c;以空间换时间&#xff0c;确保了实例的唯一性。 public class Singleton {// 在自己内部定义自己…...

爬虫 属性 方法

在Python中&#xff0c;爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库&#xff0c;用于从HTML或XML文件中提取数据。它创建了一个解析树&#xff0c;方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先&#xff0c;你需要安装BeautifulSoup和lxml&…...

HEX文件

什么是hex文件 以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准&#xff0c;hex的全称是Intel HEX&#xff0c;此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。HEX的英语原始意思是16进制…...

人机融合的智能操作系统

操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。它的职责常包括对硬件的直接监管、对各种计算资源&#xff08;如内存、处理器时间等&#xff09;的管理、以及提供诸如…...

数据结构之二叉树概念

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

Linux源码阅读笔记08-进程调度API系统调用案例分析

kthread_create_on_node kthread_create_on_node函数功能&#xff1a;指定存储节点创建新内核线程。源码如下&#xff1a; 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…...

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…...

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容量越做越大&#xff0c;企业级SSD容量已达30TB、60TB的、甚至120TB。但SSD寿命一直是“致命伤”&#xff0c;越大容量的盘&#xff0c;出现故障后&#xff0c;丢失的数据就越多。 近日&#xff0c; 华为数据存储发文&#xff0c;揭开华为全闪分布式存储让SSD大盘更“…...

登录验证码高扩展性设计方案

登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案&#xff0c;通过工厂模式策略模式&#xff0c;增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性&#xff0c;实现了服务组件的多样化&#xff0c;降低了维护成本 登录验证码高…...

Spring MVC数据绑定和响应——数据回写(一)普通字符串的回写

接下来通过HttpServletResponse输出数据的案例&#xff0c;演示普通字符串的回写&#xff0c;案例具体实现步骤如下。 1、创建一个数据回写类DataController&#xff0c;在DataController类中定义showDataByResponse()方法&#xff0c;用于测试在Spring MVC中普通字符串的回写…...

怎样才能更好地保护个人账号的安全

怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分&#xff0c;以下是一些有效的措施来增强账号的安全性&#xff1a; 1. 使用强密码 复杂性&#xff1a;创建包含大小写字母、数字和特殊字符的密码。长度&#xff1a;密码至少应有12个字符长。唯一…...

react native优质开源项目

React Native 是一个非常流行的用于构建跨平台移动应用程序的框架&#xff0c;开源社区贡献了许多优质的项目和库。以下是一些备受认可的 React Native 开源项目&#xff0c;适合用来学习和参考&#xff1a; ### 1. **React Native Elements** [React Native Elements](https:…...

速盾:海外cdn有哪些优缺点呢?

海外 CDN&#xff08;内容分发网络&#xff09;是一种通过在全球多个节点上分布内容来加速网站访问速度的服务。它通过将网站的静态内容缓存到全球各地的服务器上&#xff0c;使用户可以从最近的服务器获取内容&#xff0c;从而提高网站的响应速度和用户体验。然而&#xff0c;…...

Unity Shader 软粒子

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

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...