Windows 程序设计 第四章 sysmets2

windows程序设计 例题解析 SYSMETS4.C /*----------------------------------------------------    SYSMETS4.C -- System Metrics Display Program No. 4                  (c) Charles Petzold, 1998   ------------------------------------------- 阅读详情

 




/*----------------------------------------------------
   SYSMETS2.C -- System Metrics Display Program No. 2
                 (c) Charles Petzold, 1998
  ----------------------------------------------------*/

/*
第一次编译的时候出现下面的提示,后来就没有出现了

--------------------Configuration: chap04sysmets2 - Win32 Debug--------------------
Compiling...
sysmets2.c
NOTE: WINVER has been defined as 0x0500 or greater which enables
Windows NT 5.0 and Windows 98 features. When these headers were released,
Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.
For this release when WINVER is defined as 0x0500 or greater, you can only
build beta or test applications.  To build a retail application,
set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk
to see if retail Windows NT 5.0 or Windows 98 headers are available.
See the SDK release notes for more information.

sysmets2.obj - 0 error(s), 0 warning(s)

  */

// #define WINVER 0x0500  
#define WINVER 0x0501   
#include <windows.h>
#include "sysmets.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("SysMets2") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ; //包括了垂直滚动条
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }

     hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
                          WS_OVERLAPPEDWINDOW | WS_VSCROLL,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int  cxChar, cxCaps, cyChar, cyClient, iVscrollPos /*=1 */ ;
     HDC         hdc ;
     int         i, y ;
     PAINTSTRUCT ps ;
     TCHAR       szBuffer[10] ;
     TEXTMETRIC  tm ;

     switch (message)
     {
     case WM_CREATE:
          hdc = GetDC (hwnd) ;

          GetTextMetrics (hdc, &tm) ;
          cxChar = tm.tmAveCharWidth ;
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
          cyChar = tm.tmHeight + tm.tmExternalLeading ;

          ReleaseDC (hwnd, hdc) ;

          SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;  // 设置滚动条的范围 0 -- NUMLINES - 1
          SetScrollPos   (hwnd, SB_VERT, iVscrollPos, TRUE) ;      //  设置(更新) 滚动条的位置, 在创建窗口是iVscrollPos=0 即滑块在最上顶上
          return 0 ;

     case WM_SIZE:
          cyClient = HIWORD (lParam) ;  // 在WM_SIZE消息中, lParam的低位字 是客户区的宽度,高字位是高度  cyClient  高度
          return 0 ;

     case WM_VSCROLL:
          switch (LOWORD (wParam)) // 在WM_VSCROLL 消息中,wParam的低位字是鼠标在滚动条上的动作,这个值是通知码,有SB_开头
          {
          case SB_LINEUP:          // 鼠标点击滚动条最上的那个三角箭 ,点击一下,iVscrollPos 减一.
               iVscrollPos -= 1 ;
               break ;
     
          case SB_LINEDOWN:
               iVscrollPos += 1 ;
               break ;
     
          case SB_PAGEUP:       // 鼠标点击 滚动条和三角箭的之间的空白位置,发生翻页的 消息.
               iVscrollPos -= cyClient / cyChar ;
               break ;
     
          case SB_PAGEDOWN:   
               iVscrollPos += cyClient / cyChar ;
               break ;
     
          case SB_THUMBPOSITION:   // 鼠标松开
               iVscrollPos = HIWORD (wParam) ;// 对于SB_THUMBPOSITION而言, wParam的高位字是滑块的位置
               break ;
     
          default :
               break ;
          }

          iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;  // 限定iVscrolPos 在0到NUMLINES - 1 取值范围内

          if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))  // 如果iVscrollPos的值变了,则更新其位置,并设置 窗口无效
          {
               SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
               InvalidateRect (hwnd, NULL, TRUE) ;  //  客户区无效,则产生 WM_PAINT 消息,TRUE 使其后调用的BeginPaint擦除原有的背景.
          }
          return 0 ;

     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
     
          for (i = 0 ; i < NUMLINES ; i++)
          {
			   // y是每一行的坐标,为负数时该行文字实际输出到客户区的外面了
			   // 大于0时,才是输出到 客户区 ,即 i > iVscrollPos时,也就是那些行数位于滑块的下面部分才输出更新吗?
			   // 假设滑块是向下拉,实际是原来滑块下面的内容在上升,就是这部分需要重绘 ?
			   /* 测试了发现: 如果滑块在最底下,即iVscrollPos = NUMLINES-1,
			       在for循环中,i取0到NUMLINES-2时,y都为负数,客户区没有输出,当 i = NUMLINES-1时,
				    y= 0,此刻y对应客户区的第一行,显示的内容对应是sysmetrics[i] 即 sysmetrics的最后一行.
			   */
			   

               y = cyChar * (i - iVscrollPos) ;
     
               TextOut (hdc, 0, y,
                        sysmetrics[i].szLabel,
                        lstrlen (sysmetrics[i].szLabel)) ;
     
               TextOut (hdc, 22 * cxCaps, y,
                        sysmetrics[i].szDesc,
                        lstrlen (sysmetrics[i].szDesc)) ;
     
               SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
     
               TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
                        wsprintf (szBuffer, TEXT ("%5d"),
                             GetSystemMetrics (sysmetrics[i].iIndex))) ;
     
               SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
          }
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


如果iVscrollPos初始化为1 则创建窗口时滑块的位置如下:

 

-----

 

 

//-------------------------------

 

//---  如果把滑块拉到底,则显示的是 原库文件中 最后一行(最后一个元素).....如下图:

-----

 

 

windows程序设计第五版 第四章SYSMETS3.C 示例分析(自己的笔记) /*----------------------------------------------------    SYSMETS3.C -- System Metrics Display Program No. 3                  (c) Charles Petzold, 1998   ------------------------------------------- 阅读详情

相关推荐

windows程序设计 例题解析 SYSMETS1.C

//头文件 /*-----------------------------------------------    SYSMETS.H -- System metrics display structure   -----------------------------------------------*/ #define NUMLINES ((int) (sizeof sysmetr

zhongguo_fj的专栏 734

win32简单的GDI 介绍

好久没有记录博客了,今天记录下简单的win32对应的GDI吧,上次写博客都过了两个月了,一个是那时候快过年,一个是个人在做些东西,博客没有时间去更新,今天简单记录下win32对应东西吧。本文章是基于 win32程序设计(第5版本),详细的可查阅本书。 今天简单了解 TEXTMETRIC 结构体对字体的处理:TEXTMETRIC 结构体有20个栏位,这里只简单的介绍7个。 typedef struct tagTEXTMETRIC { LONG tmHeight ; LO...

比卡丘不皮的博客 837

windows程序设计第四章sysmets3详细解释

这张图片详细解释《Windows程序设计(第5版珍藏版)》第四章sysymets3,让你彻底理解!你绝对能看懂!!醍醐灌顶!!!!!!

SystemMetrics

头文件: #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))struct { int iIndex ; TCHAR * szLabel ; TCHAR * szDesc ; } sysmetrics [] = { SM_CXSCREEN,...

weixin_30565327的博客 270

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

Goldwasser-Micali 公钥加密系统

1、二次剩余问题 对于整数n ,定义Zn∗={a∈Zn,gcd(a,n)=1}Z^*_n=\{ a∈Z_n,gcd(a,n) =1\}Zn∗​={a∈Zn​,gcd(a,n)=1} 。当存在d∈Znd \in Z_nd∈Zn​ ,使得 d2≡a mod nd^2 \equiv a \, mod \,nd2≡amodn ,称 a 为模 n 的二次剩余;否则称 a 为模 n的二次非剩余。判断 a 是否为模 n 的二次剩余的问题称为模n 的二次剩余问题。 \rule[-10pt]{14.3cm}{0.05em}

不染心的博客 4314

c2061 dword 语法错误_vs2010新建立的mfc工程编译就出错error C2065: “DWORD_PTR”: 未声明的标识符...

下面是报错内容:> stdafx.cpp1>1> NOTE: WINVER has been defined as 0x0500 or greater which enables1> Windows NT 5.0 and Windows 98 features. When these headers were released,1> Windows NT 5....

weixin_42539973的博客 711

使用qt+PaddleOCR做一个OCR软件demo

文章目录使用qt+PaddleOCR做一个OCR软件demo效果展示1 建立环境1.1 vs项目环境1.2 qtcreator项目环境1.2.1 源代码整理1.2.2 依赖项整理如下1.2.3 模型文件如下1.2.4 在.pro文件中设置依赖库的模式1.2.5 pro文件中添加.h和.lib2 在工程代码中添加截图功能2.1 新建截图类并连接信号2.2 QImage转cv::Mat3 在工程代码中集成PaddleOCR3.1 初始化PaddleOCR3.2 修改文字识别类的run函数,增加一个返回结果的值的

ShareProgress的博客 9306

使用VC6时:关于WinAPI的版本问题。

最近偶然用到一个结构体:SCROLLBARINFO ,编译(用到VC6+SP6)时无法通过,提示未找到其定义。仔细查看了一下API文档,提到:HeaderDeclared in Winuser.h, include Windows.hMinimum operating systemsWindows 98, Windows NT 4.0 with Service Pack 6觉得没啥问题啊,只好把W

石头记 2963

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

视觉提示学习(Prompt Learning):CV领域的GPT时刻?

视觉提示学习(Prompt Learning):CV领域的GPT时刻? ,人工智能,计算机视觉,大模型,AI,在人工智能技术不断演进的今天,计算机视觉(Computer Vision,CV)作为人工智能领域的重要分支,始终致力于让机器 “看懂” 世界。从早期基于传统特征工程的图像识别方法,到深度学习时代卷积神经网络(Convolutional Neural Networks,CNN)的崛起,CV 领域经历了多次重大变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

第25周-window程序设计(基础篇)-第4章-SYSMETS.C窗口消息处理程序

1、SYSMETS.C: /*SYSMETS.C——System Metrics Display Program No.1*/ #include #include"sysmets.h" LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev

时缔&实验室 1040

PINN:当深度学习遇上朗伯-比尔定律

光谱数据处理中引入PINN的三种架构设计

qq_53529450的博客 154

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System Metrics Display Program No. 1 (c) Charles Petzold, 1998 -----------------------------------------...

weixin_30293135的博客 77

rk3588上适配wifi模组aic8800

记录一下在rk3588上调试aic8800,调试分为Debian11以及Android12两个平台,这里主要是讲过程以及修改的过程,以补丁的形式来提供解决方法。在Debian11下主要通过配置设备树、编译驱动并自动加载固件完成调试,详细介绍了设备树修改、驱动编译脚本调整和驱动加载流程。

m0_60805802的博客 1006

大模型之Spring AI实战系列(二十六):Spring Boot + DeepSeek 实战指南:构建AI聊天应用

在人工智能技术飞速发展的今天,大型语言模型已经成为了推动技术创新的重要力量。DeepSeek作为国内领先的大型语言模型提供商,其推出的DeepSeek系列模型在多个领域都展现出了卓越的性能。本文将详细介绍如何使用Spring Boot框架集成DeepSeek API,构建一个简单的AI聊天应用。我们将实现两个核心功能:普通文本生成和流式文本生成。

寻道AI,探索AI无限可能! 2264

详细解析“新SYSMETS”的代码

书籍:《(第五版)》环境:visual studio 2022内容:输出文字->新说明:以下内容大部分来自腾讯元宝。

felicity_one的博客 795

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Windows 程序设计 第四章 sysmets1

/*---------------------------------------------------- SYSMETS1.C -- System Metrics Display Program No. 1 (c) Charles Petzold, 1998 -------------------------------------------

-----------------------------不要在跟自己无关的事情上浪费时间 715

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

第25周-window程序设计(基础篇)-第4章-SYSMETS.H

1、SYSMETS.H: /* SYSMETS.H,定义了75个整数索引标识符。(System metrics display structure系统度量显示结构) GetSystemMetrics传回一个整数,这个整数通常就是参数中指定的图形组件大小。 GetSystemMetrics是在程序中完成与设备无关图形输出的重要函数. */ #define NUMLINES((int)(sizeo

时缔&实验室 906

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

第25周-window程序设计(基础篇)-第4章-SYSMETS3.C

1、SYSMETS3.C: /*SYSMETS3.C:依赖windows保存滚动条信息并做边界检查*/ #include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,hPrevInstance,

时缔&实验室 745

Windows程序设计 sysmets

<br /><br />//这是我初次编写windows应用程序(窗口),按理说是按书本上的抄录下来的,呵呵<br />//下面我把代码详细解释一下<br /> <br />/**********************一些字符前缀解释****************************************************/<br />/*cs_:class(类风格选项),WM_:widows message(窗口消息),CW_:creat widows(绘制窗口)<br />DT_:dra

gududesiling的专栏 800

详细解析“在SYSMETS中加入卷动功能”的代码

书籍:《(第五版)》环境:visual studio 2022内容:输出文字->在SYSMETS中加入卷动功能说明:以下内容大部分来自腾讯元宝。

felicity_one的博客 629

学习Windows程序设计第四章(一)

今天看了下《Windows程序设计》的第四章文本输出,现记录下学习心得。 这一章主要讲的是文本输出,今天试了下第一个例子,用到了一个叫SYSMETS.H的头文件。 头文件代码: /*----------------------------------------------- SYSMETS.H -- System metrics display structure ----------...

大象的窝 250

windows程序设计 例题解析 SYSMETS2.C

//sysmets.h头文件没有列出来 /*----------------------------------------------------    SYSMETS2.C -- System Metrics Display Program No. 2                  (c) Charles Petzold, 1998   ----------------------

zhongguo_fj的专栏 662

windows程序设计 例题解析 SYSMETS3

//头文件未给出 /*----------------------------------------------------    SYSMETS3.C -- System Metrics Display Program No. 3                  (c) Charles Petzold, 1998   ---------------------------------

zhongguo_fj的专栏 1189

c语言textout字体大小,《WINDOWS程序设计》第四章关于TEXTOUT的小问题

《WINDOWS程序设计》第四章关于TEXTOUT的小问题文章原文是这样说的:您会发现常常需要显示格式化的数字跟简单的字符串。我在第二章讲到过,您不能使惯用的工具(可爱的printf 函数)来完成这项工作,但是可以使用sprintf 和Windows 版的sprintf-wsprintf。这些函数与printf 相似,只是把格式化字符串放到字符串中。然后,可以用TextOut 将字符串输出到显...

weixin_28826521的博客 901
上一篇: Windows 程序设计 第四章 sysmets1
下一篇: 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
sergery
博客等级 码龄18年 113粉丝 136原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值