WIN32下的模拟时钟
#include <Windows.h>
#include <math.h>
#include <tchar.h>
#include "resource.h" #define PI 3.1415926 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nCmdShow)
{
MSG msg;
if (!InitWindowClass(hInstance,nCmdShow))
{
MessageBox(NULL, L"Failed to Create Windows", L"InFo", NULL);
return 1;
}
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
} BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX wcex;
HWND hWnd;
TCHAR szWindowsClass[] = L"窗口示例";
TCHAR szTitle[] = L"模拟时钟"; wcex.cbClsExtra = 0;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.cbWndExtra = 0;
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.hInstance = hInstance;
wcex.hIconSm = LoadCursor(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.lpfnWndProc = WndProc;
wcex.lpszClassName = szWindowsClass;
wcex.lpszMenuName = NULL;
wcex.style = CS_HREDRAW | CS_VREDRAW; //注册窗口类
if (!RegisterClassEx(&wcex))
{
return FALSE;
} //hWnd = CreateWindowEx(0,szWindowsClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
hWnd = CreateWindowEx(0,szWindowsClass, szTitle, WS_OVERLAPPEDWINDOW, 200, 200, 600, 400, NULL, NULL, hInstance, NULL);
if (!hWnd)
return FALSE; ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDc;
PAINTSTRUCT ps;
HBRUSH hBrush;
HPEN hPen;
RECT clientRect;
SYSTEMTIME x;
float sita = 0;
double rSec, rMin, rHour,temHour,temMin, xOrg, yOrg, rClock, ptLong, xBegin, xEnd, yBegin, yEnd; //消息分发
switch (message)
{
case WM_CREATE:
SetTimer(hWnd, 9999, 1000, NULL);
break;
case WM_PAINT:
hDc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &clientRect);//获取窗口大小 hPen = (HPEN)GetStockObject(BLACK_PEN);
hBrush = CreateSolidBrush(RGB(255, 220, 220));
SelectObject(hDc, hPen);
SelectObject(hDc, hBrush); //时钟表盘圆点坐标
xOrg = (clientRect.left + clientRect.right) / 2;
yOrg = (clientRect.bottom + clientRect.top) / 2; //表盘,秒,分,时针半径
rClock = min(xOrg, yOrg) * 4 / 5;
rSec = rClock * 6 / 7;
rMin = rClock * 5 / 6;
rHour = rClock * 2 / 3; //画圆盘
Ellipse(hDc, int(xOrg - rClock), int(yOrg - rClock), int(xOrg + rClock), int(yOrg + rClock)); //画刻度
for (int i = 0; i < 60; i++)
{
if (i % 5)
{
hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
ptLong = rClock * 9 / 10;
}
else
{
hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
ptLong = rClock * 7 / 8;
}
SelectObject(hDc, hPen); //刻度起止点
xBegin = xOrg + rClock * sin(2 * PI*i / 60);
yBegin = yOrg + rClock * cos(2 * PI*i / 60);
xEnd = xOrg + ptLong * sin(2 * PI*i / 60);
yEnd = yOrg + ptLong * cos(2 * PI*i / 60); MoveToEx(hDc, (int)xBegin,(int)yBegin, NULL);
LineTo(hDc, (int)xEnd, (int)yEnd);
DeleteObject(hPen);
} GetLocalTime(&x); //画秒针
hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
SelectObject(hDc, hPen); sita = float(2 * PI*x.wSecond / 60);
//秒针起止点
xBegin = xOrg + (int)(rSec*sin(sita));
yBegin = yOrg - (int)(rSec*cos(sita));
xEnd = xOrg + (int)(rClock*sin(sita + PI) / 8);
yEnd = yOrg - (int)(rClock*cos(sita + PI) / 8); MoveToEx(hDc, (int)xBegin, (int)yBegin, NULL);
LineTo(hDc, (int)xEnd, (int)yEnd); //画分针
hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hDc, hPen); sita = float(2 * PI*x.wMinute / 60);
//分针起止点
xBegin = xOrg + (int)(rMin*sin(sita));
yBegin = yOrg - (int)(rMin*cos(sita));
xEnd = xOrg + (int)(rClock*sin(sita + PI) / 8);
yEnd = yOrg - (int)(rClock*cos(sita + PI) / 8); MoveToEx(hDc, (int)xBegin, (int)yBegin, NULL);
LineTo(hDc, (int)xEnd, (int)yEnd); //画时针
hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
SelectObject(hDc, hPen); /*if (x.wMinute >= 12 && x.wMinute<=24)
sita = 2 * PI*(x.wHour +(12/60)) / 12;
else if(x.wMinute>24 && x.wMinute<=36)
{
sita = 2 * PI*(x.wHour + (24/60)) / 12;
}
else if(x.wMinute>36 && x.wMinute<=48)
{
sita = 2 * PI*(x.wHour + (48/60)) / 12;
}
else if (x.wMinute > 48 && x.wMinute<=59)
{
sita = 2 * PI*(x.wHour + (double)(x.wMinute/60)) / 12;
}
else
{
sita = 2 * PI*x.wHour / 12;
}*/
temMin =(double)(x.wMinute) / 60;//把分转换成小时的十进制,也就是30分钟->0.5小时
temHour = x.wHour + temMin; //把时针换面十进制时间,1:30->1.5小时
//这么设定时针的时间3:30就不是3了,改成3.5了,这么一来时针在表盘上就会在两个小时的刻度的中间
//而不是只指到3的刻度一个小时不变<_>;
sita = float(2 * PI*temHour / 12);
//时针起止点
xBegin = xOrg + (double)(rHour*sin(sita));
yBegin = yOrg - (double)(rHour*cos(sita));
xEnd = xOrg + (double)(rClock*sin(sita + PI) / 8);
yEnd = yOrg - (double)(rClock*cos(sita + PI) / 8); MoveToEx(hDc, (int)xBegin, (int)yBegin, NULL);
LineTo(hDc, (int)xEnd, (int)yEnd); DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hWnd, &ps);
break;
case WM_TIMER:
if (wParam == 9999)
InvalidateRect(hWnd, NULL, true);
break;
case WM_SIZE:
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
} return 0;
}
在网上抄的,对于刚学的小白来说,只有抄,不过网上这个时针一个小时才跳一下,不好看,我自己改进了下.
主要是画时针时把时间(3:30)换成十进制的3.5表示就OK了,说起来很简单,我也弄了好几个小时.
WIN32下的模拟时钟的更多相关文章
- Windows下编程--模拟时钟的实现
windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1) 编写按键事件处理(启动和停止时钟) (2) 编写时钟事件处理,调用显示时钟函数 (3) 编写显示时钟函数,要调用显 ...
- 一个模拟时钟的时间选择器 ClockPicker
最近开发的一个模拟时钟的时间选择器 ClockPicker,用于 Bootstrap,或者单独作为一个 jQuery 插件. 源代码托管在 GitHub 上: ClockPicker 最近项目中需要用 ...
- win32下用VC扩展PHP全过程
闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不 多说了,进入正题: 一.已经在机器上安装PHP环境的就略过,否则先 ...
- 模拟时钟(AnalogClock)和数字时钟(DigitalClock)
Demo2\clock_demo\src\main\res\layout\activity_main.xml <LinearLayout xmlns:android="http://s ...
- cocos2dx c++ 在mac下写的中文凝视,在win32下编译时不通过
今天遇到个奇怪的问题,在mac下写的程序,加的中文凝视,编译没有问题,可是在win32下(使用的时vs2012, win7 64bit 系统)编译就总是报错 最后在中文凝视后 加一个空格,或者 换行, ...
- win32下利用python操作printer
在win32下操作printer: 1)import win32print 2) 获得默认打印机名: >>> win32print.GetDefaultPr ...
- android脚步---数字时钟和模拟时钟
时钟UI组件是两个非常简单的组件,分为Digitalclock 和Analogclock, main.xml文件,书中程序有问题,加了两个组件,一个Button和一个<Chronometer ...
- Java多线程之sleep方法阻塞线程-模拟时钟
package org.study2.javabase.ThreadsDemo.status; import java.text.SimpleDateFormat; import java.util. ...
- css模拟时钟
css模拟时钟 思路: 画时钟数字(x,y)坐标 x = x0 + r*cos(deg) y = y0 + r*sin(deg) 知识点: 创建元素: createElement 添加元素: appe ...
- 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。
使用CSS3纯代码来实现模拟时钟,及指针动画功能. 在这里主要使用到css3一些基本元素: border-radius:圆角边框,画圆形:表盘 Transform:变换,旋转,扭曲:刻度盘,指针形状 ...
随机推荐
- 【论文阅读】IROS2017: Voxblox & RAL2019: Voxblox++
IROS2017: Voxblox & RAL2019: Voxblox++ Status: Finished Type: RAL Year: 2019 组织/Sensor: ETH-ASL ...
- 工控必备!NXP i.MX 8M Mini开发板规格书资料分享,高性能低功耗!
1 核心板简介 创龙科技SOM-TLIMX8-B是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高端工业级核心板,A ...
- vulnhub - BREACH: 1
vulnhub - BREACH: 1 描述 作为多部分系列中的第一部分,Breach 1.0 旨在成为初学者到中级的 boot2root/CTF 挑战.解决将需要可靠的信息收集和持久性相结合.不遗余 ...
- PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
大家好,我是码农先森. 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念.PHP 服务端和前端 HTML.CSS.JS 代码混合式开发,也不分前端.后端程序员,大家都是全干工程师.随 ...
- Redis常见的16个使用场景
1.缓存 String类型 例如:热点数据缓存(例如报表.明星出轨),对象缓存.全页缓存.可以提升热点数据的访问数据. 2.数据共享分布式 String 类型,因为 Redis 是分布式的独立服务,可 ...
- mybatis-plus的insert方法出现-id' doesn't have a default value问题
出现这个问题,只需把对应的字段注解设置为,例如: @TableId(value = "id",type = IdType.INPUT) private String id; 即可解 ...
- Java 知识总结大汇总!看完哪个都变大佬!
免费编程资源大全项目:https://github.com/liyupi/free-programming-resources 大家好,我是鱼皮,今天分享 十几个 让人直呼 "哇塞" ...
- tp5命名规范
tp5中对类,文件名,函数和方法的命名规范如下: 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,不需要添加contr ...
- 可视化—gojs 超多超实用经验分享(二)
想了想序号还是接上一篇分享的的序号接着写,如果在本文中没有获取需要的答案,可以移步去看看上一篇的分享.gojs 超多超实用经验分享(一) 目录 22. 指定线段连接到节点的某一个特定的接口上 23. ...
- Django 多数据库配置与使用总结
Django 多数据库配置与使用总结 By:授客 QQ:103355122 #实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: https:/ ...