《Windows API每日一练》7.4 状态报告上使用计时器

news2024/11/17 7:32:08

这一节我们使用计时器,每隔一秒获取当前鼠标坐标位置的像素值,并显示在窗口,这就相当于是一个简单的取色器了。

本节必须掌握的知识点:

        第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消息结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商家团购app微信小程序模板

手机微信商家团购小程序页面&#xff0c;商家订餐外卖小程序前端模板下载。包含&#xff1a;团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板

昇思25天学习打卡营第13天|ResNet50图像分类

1. 学习内容复盘 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。 ResNet网络介绍 ResNet50网络是2015年由微软…

使用Git从Github上克隆仓库,修改并提交修改

前言 本次任务主要是进行github提交修改的操作练习实践&#xff0c;本文章是对实践过程以及遇到的问题进行的一个记录。 在此之前&#xff0c;我已经简单使用过github&#xff0c;Git之前已经下好了&#xff0c;所以就省略一些步骤。 步骤记录 注册github账号&#xff0c;gi…

PS系统教程31

调色之色阶 调色与通道最基本的关系通道是记录颜色最基本的信息有些图片可以用通道去改变颜色信息的说明这些图像是比较高级的PS是一款图像合成软件&#xff0c;在合成过程中需要处理大量素材&#xff0c;比如要用这些素材进行抠背景&#xff0c;就要用到图层蒙版以及Alpha通道…

Go语言--格式化输出输入、类型转换

格式说明 %T操作变量所属类型自动匹配格式的不一定很正确&#xff0c;尤其是字符类型&#xff0c;本应该是整型&#xff0c;实际上他会输出数字 输入 阻塞等待用户的输入 fmt.Scanf("%d", &a)fmt.Scan(&b)不需要写格式&#xff0c;自动匹配 类型转换 类…

深入学习 Kafka(1)- 核心组件

组件概述 1. Producer&#xff08;消息生产者&#xff09; 核心作用&#xff1a;生成数据源&#xff0c;将消息发送至指定Topic。关键特性&#xff1a;支持批量发送、分区策略选择&#xff0c;以及可配置的重试逻辑&#xff0c;提高了数据传输效率和可靠性。 2. Topic&#x…

iptable精讲

SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换&#xff0c;Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名&#xff1a;gw 主机名&#xff1…

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

云服务出现故障这样处理

无法连接云服务器 服务器远程无法连接时&#xff0c;可通过7ECloud控制台进行连接。 常见故障现象 1、ping不通 2、ping丢包 3、部分端口telnet不通 4、全部端口telnet不通 5、广告、弹窗植入 6、域名无法访问IP访问正常 常见故障原因 1、云服务器过期、关机或者EIP被…

【技巧】ArcgisPro 字段计算器内置函数方法的调用

在arcgisPro中&#xff0c;内置了常用的几种函数方法&#xff0c;如顺序编号&#xff0c;重分类等&#xff1b;调用方法如下&#xff1a;

YOLOv3分析

参考链接&#xff1a;霹雳吧啦b站 主要参考了b站霹雳吧啦的视频《深度学习目标检测篇》。 目录 前言YOLOv3网络结构 YOLOv3 SPP 前言 YOLOv3的精度虽然已经过时&#xff0c;但思想仍旧值得学习&#xff0c;本帖记录所需所想的一些内容。 YOLOv3 网络结构 一共53层&#xff0…

软件著作权申请:保障开发者权益,促进软件创新

一、引言 在数字化时代&#xff0c;软件作为信息技术的核心&#xff0c;已成为推动社会进步和经济发展的重要力量。然而&#xff0c;随着软件产业的蓬勃发展&#xff0c;软件侵权和抄袭现象也日益严重。为了保护软件开发者的合法权益&#xff0c;促进软件产业的健康发展&#…

一维信号短时傅里叶变换域邻域降噪方法(MATLAB)

噪声在人类日常生活中无处不在,其会降低语音信号的质量和可懂度。在低信噪比的恶劣环境中,这种负面影响愈发严重。为了解决这个问题,众多研究人员在过去的几十年里提出了许多降噪算法。 根据原理的不同,降噪算法可大致分为五类:谱减法、最优滤波法、基于统计模型的方法、子空间…

【Java EE】Spring IOCDI

Spring IOC & DI 文章目录 Spring IOC & DI一、Spring是什么&#xff1f;二、IOC(控制反转)2.1 通俗理解2.2 造汽车的例子理解IOC2.3 IOC详解1. 获取Bean2. 方法注解——Bean1. 应用场景&#xff1a;2. 应用方法&#xff1a;3. 注意要点&#xff1a; 特别注意: 四、DI4…

基于springboot+vue+uniapp的超市售货管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

工具网源码|计算某一天是当年的第几周,第几天,黄历工具

源码简介&#xff1a; 工具网源码|计算某一天是当年的第几周&#xff0c;第几天&#xff0c;黄历工具&#xff0c;无文章系统&#xff0c;全站同过算法实现&#xff0c;并在前台展示&#xff0c;页面多&#xff0c;很适合seo。 演示站&#xff1a; https://dijizhou.wengu8.com…

从项目中学习Bus-Off的快慢恢复

0 前言 说到Bus-Off&#xff0c;大家应该都不陌生&#xff0c;使用VH6501干扰仪进行测试的文章在网上数不胜数&#xff0c;但是一般大家都是教怎么去干扰&#xff0c;但是说如何去看快慢恢复以及对快慢恢复做出解释比较少&#xff0c;因此本文以实践的视角来讲解Bus-Off的快慢恢…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤&#xff1a; 1. 爬取数据&#xff1a;使用爬虫工具或库&#xff0c;如requests、BeautifulSoup等&#xff0c;可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…

走进开源企业 | 湖南大学OpenHarmony技术实训活动在开鸿智谷顺利举办!

6月24日-6月26日&#xff0c;2024开放原子校源行之湖南大学信息科学与工程学院师生走进开源企业实训交流活动顺利落下帷幕。湖南大学信息科学与工程学院的师生代表团一行90人参与了湖南开鸿智谷数字产业有限公司&#xff08;以下简称“开鸿智谷”&#xff09;与母公司拓维信息系…