windows程序设计 之 「CLOCK」范例分析笔记

MFC Windows 程序设计[三十一]之精简的时钟(附源码) MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。 阅读详情

/*--------------------------------------
   CLOCK.C -- Analog Clock Program
              (c) Charles Petzold, 1998
  --------------------------------------*/


#include <windows.h>
#include <math.h>

#define ID_TIMER     1
#define TWOPI        (2 * 3.14159 )

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR   szAppName[] = TEXT ("Clock ") ;
     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                  = NULL ;
     wndclass.hCursor              = LoadCursor (NULL, IDC_ARROW ) ;
     wndclass.hbrBackground   = (HBRUSH) GetStockObject (WHITE_BRUSH ) ;
     wndclass.lpszMenuName   = NULL ;
     wndclass.lpszClassName   = szAppName ;
    
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Program requires Windows NT! "),
                      szAppName, MB_ICONERROR ) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, TEXT ("Analog Clock "),
                          WS_OVERLAPPEDWINDOW ,
                          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 ;
}

void SetIsotropic (HDC hdc, int cxClient, int cyClient)
{    //使用同方向性映像模式
     SetMapMode (hdc, MM_ISOTROPIC ) ;
     //设置逻辑范围为1000,1000
     SetWindowExtEx (hdc, 1000, 1000, NULL) ;
     //设置设备范围
     SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;
     //设置设备原点为窗口中央。
     SetViewportOrgEx (hdc, cxClient / 2,  cyClient / 2, NULL) ;
     //该函数设定映像方式为 四象限笛卡尔坐标系 。
     //从窗口中心点开始,左-X ,右+X ,上+Y ,下-Y 。

}

void RotatePoint (POINT pt[], int iNum, int iAngle)
{
     int   i ;
     POINT ptTemp ;
    
     for (i = 0 ; i < iNum ; i++)
     {
         //TWOPI * iAngle / 360 转换角度为弧度。
         //Cos()=X/R  X坐标在半径中的比例
         //Sin() =Y/R   Y坐标在半径中的比例

         //该算法实现:将始边设为+Y轴,旋转方向为顺时针

         ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) +
             pt[i].y * sin (TWOPI * iAngle / 360)) ;
         
          ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) -
              pt[i].x * sin (TWOPI * iAngle / 360)) ;
         
         pt[i] = ptTemp ;
     }
}

void DrawClock (HDC hdc)
{
     int        iAngle ;
     POINT  pt[3] ;
    
     for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)
     {
          pt[0].x =   0 ;
          pt[0].y = 900 ;  //矩形中心点
         
          RotatePoint (pt, 1, iAngle) ; //以6度为单位进行顺时针旋转
         
          pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100 ; //判断设置圆点大小,以5为间隔。
         
          //假设要在12点画一个圆,圆大小为100.
          //pt[0].x = 0 - (100/2)   = -50      矩形左边
          //pt[0].y = 900-(100/2) = 850     矩形顶边
          //pt[1].x = -50 + 100     = 50      矩形右边
          //pt[1].y = 850 + 100    = 950    矩形底边

          pt[0].x -= pt[2].x / 2 ;
          pt[0].y -= pt[2].y / 2 ;
         
          pt[1].x  = pt[0].x + pt[2].x ;
          pt[1].y  = pt[0].y + pt[2].y ;
         
          SelectObject (hdc, GetStockObject (BLACK_BRUSH )) ;
         
          Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ; //在给定矩形内画圆
     }
}

void DrawHands (HDC hdc, SYSTEMTIME * pst, BOOL fChange)
{
     static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,       //时针12点时多边形坐标
                                             0, -200,   50, 0, 0, 800,   -50, 0, 0, -200,       //分针12点时多边形坐标
                                             0,    0,       0, 0,  0,   0,       0, 0,  0,  800 } ;  //秒针12点时绘画坐标
     int              i, iAngle[3] ;
     POINT        ptTemp[3][5] ;
    
     iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2 ; //时针在坐标系里的对应角度
     iAngle[1] =  pst->wMinute  *  6 ; //分针角度
     iAngle[2] =  pst->wSecond  *  6 ; //秒针角度
    
     memcpy (ptTemp, pt, sizeof (pt)) ; //复制画笔坐标到临时数组
    
     for (i = fChange ? 0 : 2 ; i < 3 ; i++) //如果小时或分钟更改,i=0,否者等于2(意思是只画秒针)。
     {
          RotatePoint (ptTemp[i], 5, iAngle[i]) ; //根据角度,计算顺时针旋转后的坐标

          Polyline (hdc, ptTemp[i], 5) ;  //根据旋转后的坐标,画多边形(表针)
     }
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int                  cxClient, cyClient ;
     static SYSTEMTIME   stPrevious ;
     BOOL                       fChange ;
     HDC                         hdc ;
     PAINTSTRUCT           ps ;
     SYSTEMTIME            st ;

     switch (message)
     {
     case WM_CREATE :
          SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
          GetLocalTime (&st) ; //获取系统当前时间信息
          stPrevious = st ;       //保存窗口创建时的时间信息
          return 0 ;
         
     case WM_SIZE :
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          return 0 ;
         
     case WM_TIMER :
          GetLocalTime (&st) ;
         
          //判断小时或者分钟,是否有更改。
          fChange = st.wHour   != stPrevious.wHour ||
                           st.wMinute != stPrevious.wMinute ;
         
          hdc = GetDC (hwnd) ;
         
          SetIsotropic (hdc, cxClient, cyClient) ;//该函数设定映像方式为 四象限笛卡尔坐标系 。
         
          SelectObject (hdc, GetStockObject (WHITE_PEN)) ; //设置白色画笔
          DrawHands (hdc, &stPrevious, fChange) ;               //涂抹掉之前的表针
         
          SelectObject (hdc, GetStockObject (BLACK_PEN)) ;  //设置黑色画笔
          DrawHands (hdc, &st, TRUE) ;                                  //绘画当前表针
         
          ReleaseDC (hwnd, hdc) ;
         
          stPrevious = st ;   //保存时间信息,用于下次比较
          return 0 ;
         
     case WM_PAINT :
          hdc = BeginPaint (hwnd, &ps) ;
         
          SetIsotropic (hdc, cxClient, cyClient) ;      //该函数设定映像方式为 四象限笛卡尔坐标系。
          DrawClock     (hdc) ;                                  //绘画钟面圆点
          DrawHands     (hdc, &stPrevious, TRUE) ; //绘画当前表针
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
         
     case WM_DESTROY :
          KillTimer (hwnd, ID_TIMER) ;
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

MFC Windows 程序设计[九十四]之精美的时钟(附源码) MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。 阅读详情

相关推荐

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

《Windows程序设计-第二版》第四章最后一个04Clock大例子中的GDI句柄泄漏问题

用Sysinternals工具里的process explorer监控发现 GDI Handles在不断增加,大概是每秒增加2个。 检查原书代码: case WM_TIMER: { // Èç¹û´°¿Ú´¦ÓÚ×îС»¯×´Ì¬¾ÍʲôҲ²»×ö if(::IsIconic(hWnd)) // IsIconicº¯ÊýÓÃÀ´Åжϴ°¿ÚÊÇ·ñ´¦ÓÚ

softfox的专栏 957

Docker 磁盘占用过多问题处理过程记录

Docker 磁盘爆满问题处理

MR.骑士道 3553

windows 程序设计之「SINEWAVE.C」范例分析笔记

实作正弦波wave波形音频并播放。wave函数的调用方法:waveOutOpen ;waveOutPrepareHeader ;waveOutWrite ;waveOutReset ;waveOutClose ;waveOutUnprepareHeader 。

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 2067

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 409

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 244

windows程序设计 「PopPad3」范例分析笔记

Open、Save、Find和Font通用对话框的使用。OPENFILENAME(Open) 、FINDREPLACE(Find & Replace) 、CHOOSEFONT(Font)结构简洁。

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 3519

香橙派rk3588的rknn多线程推理RTSP流服务性能优化与资源分配策略

本文深入探讨了香橙派RK3588平台上的RKNN多线程推理在RTSP流服务中的性能优化与资源分配策略。通过分析硬件架构、设计多线程推理流水线、实现NPU核心负载均衡及优化RGA内存管理,显著提升了RTSP视频流的处理帧率和降低了延迟,为边缘计算视频分析应用提供了实用的优化方案。

7up55的博客 653

Python爬虫学习笔记一:模拟登录(人工输入简单验证码)

# -*- coding: utf-8 -*-import requests, base64, refrom PIL import Imagefrom io import BytesIOdef logon():    loginUrl = 'http://############/login.do?method=enterbs'  #登陆提交地址    imgUrl = 'http://#####...

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 2556

R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值

R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)

statistics+insight+vista+power 1397

ADS基础教程24 - Gerber文件的导入

一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END!

XZ_ZC的博客 3049

球的体积公式推导

设球的半径为R,将半径OA n等分,过这些等分点作平面,把半球切割成n层,每一层都是近似于圆柱形状的“小圆片”,这些“小圆片”的体积之和就是半球的体积。 由勾股定理可得第i层(由下向上数)“小圆片”的下底面半径: 于是,第i层“小圆片”的体积: 由于“小圆片”近似于圆柱形状,所以它的体积也近似于相应的圆柱的体积。它的高就是“小圆片”的厚度R/n,底面就是“小圆片”的下底面。 半

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 4万+

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 216

利用Windows画图设计Clock程序

     学习windows 程序设计方面的知识,觉得还挺有意思。不仅加深了自己对window的了解,还了解了windows窗口与用户之间消息传递机制。     下面是学习过程中做的一个Clock的程序,有兴趣的可以参考一下:// ClockDemo.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "ClockDemo.h"

wl_soft专栏 1246

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows程序设计第五版源代码---CLOCK

源代码如下: #include <windows.h> #include <math.h> #define ID_TIMER 1 #define TWOPI (2 * 3.14159) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInsta...

weixin_43574277的博客 488

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Window Linux c 不同,C:Windows和其他操作系统中clock()的不同实现?

我必须为大学编写一个非常简单的控制台程序,该程序必须测量进行输入所需的时间。因此,我clock()在fgets()通话前后都使用了它。在我的Windows计算机上运行时,它运行完美。但是,当在我的朋友Mac-Book和Linux-PC上运行时,它给出的结果非常小(仅几微秒的时间)。我在所有3个操作系统上尝试了以下代码:#include #include #include void main(){c...

weixin_32259717的博客 190

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

windwos程序设计里的clock程序,第八章

windows程序设计第五版这本书,不得不说,收获颇多,但越到后面也就越来越难,有时都觉得是不是自己太笨了,这个clock程序看了好久,终于弄懂了,先看一下程序运行的结果吧 代码里都有注释,就不多说了 # include<windows.h> # include<cmath># define ID_TIMER 1 # define TWOPI (2*3.14159)LRESULT CALLBAC

那又怎样的博客 490

Windows程序设计零基础自学_7_定时器的使用

在Visual Basic里面可以利用Timer控件来实现定时的功能,在Windows程序设计里面同样可以实现定时的功能, 通过启用定时器的对象就可以实现定时作用。 用一个简单的Exp来查看定时器的使用: /* 本实例代码展示定时器的使用 ——Beeper程序 */ #include <windows.h> #define ID_T...

weixin_33724059的博客 116

Windows程序设计__孙鑫C++Lesson18《ActiveX 控件》

Windows程序设计__孙鑫C++Lesson18《ActiveX 控件》 vc6.0 Win7下环境问题解决: 注意本节课程中的环境很重要,vc 6.0 在Win7系统下易发生错误,错误及解决方法如下,解决方法是: (1)无法注册控件 尝试以管理员身份进行注册 比如以管理员身份运行cmd.exe 然后键入RegSvr *.ocx  或 者以管理员身份运行一些控件注册的辅助工具,本例中我

王定桥的专栏 2452

第四章 时钟 windows程序设计 王艳平版

/////////////////////////////////////////////////////////////// // Clock.cpp文件 #include #include "resource.h" #include LRESULT __stdcall WndProc(HWND, UINT, WPARAM, LPARAM);

pjz969的专栏 594

C++记录程序运行时间

转载自:https://www.cnblogs.com/didiaodidiao/p/9194702.html 一、Clock()计时函数 clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间

zq9955的博客 1962

《WINDOWS 环境下32位汇编语言程序设计》第7章 图形操作(2)

图形设备接口GDI(Graphics Device Interface)是Win32的一个重要组成部分,其作用是允许Windows的应用程序将图形输出到计算机屏幕、打印机或其他输出设备上。GDI实际上是一个函数库,包括直线、画图和字体处理等数百个函数。本章介绍Win32程序调用GDI函数库进行图形操作。

chenyijun的专栏 964

C++(Windows下计算时间变化(时间差))

Windows.h文件主要是想用Sleep函数。 #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using namespace std; int main() { int s, e; s = clock(); Sleep(1000); // sleep for 1 s...

gc.collect() 1588

《Windows Phone 7程序设计》样章-《数据绑定》

在我看来数据绑定是XAML类程序(WPF,Silverlight,WP7,Windows8)最最关键的概念,也是MVVM模式的基础,如果一位开发者在开发XAML类程序时并没有用上数据绑定,那么我觉得他/她还没有掌握开发XAML类程序的能力。数据绑定可以说每个XAML类程序开发者必须掌握的基本技能之一。下面是《数据绑定》样章的一部分,如果觉得翻译的不错而且条件许可,请购买正版书,谢谢您为中国文化事业...

weixin_30455661的博客 188
上一篇: 弧度 与 角度
下一篇: windows程序设计 之 「HEAD」范例分析笔记
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值