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:变换,旋转,扭曲:刻度盘,指针形状 ...
随机推荐
- 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!
下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...
- uboot 添加 自定义命令
--- title: uboot-uboot 添加 自定义命令 date: 2020-05-13 16:51:38 categories: tags: - uboot - cmd - config - ...
- ajax - 接口、表单、模板引擎
1. 今天继续ajax的一个学习,首先明确一个观念,接口,什么是接口,当使用ajax请求数据时,被请求的url就叫做数据接口也就是接口,注意每个接口必须有请求方式,这里有一个接口的测试工具,postm ...
- Qt中全局变量的定义和使用
全局变量的定义 现在需要将自定义的STRParameter变量定义为全局变量,就需要新建两个文件,分别命名为"global.h"和"global.cpp" 在g ...
- 创建基于kotlin开发环境的spring项目入门
kotlin是idea所属公司开发的一门jvm语言,如果你不了解估计也不会看这里,所以我就不多说了. 这里简单说一下如何新建一个小的kotlin spring项目.kotlin和idea是一家公司,所 ...
- P5494 题解
来一发 \(O(\log n)\) 线性空间的解法. 考虑通过只维护线段树叶子节点的虚树的方法压缩空间,考虑记录下每个节点的编号,然后通过异或完求最低位的 \(1\) 的方式求出 LCA 的深度,然后 ...
- Docker 总体架构图解
Docker 的总体架构 Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,模块各司其职. 下图是它的总体架构图: 1. 用户使用 Docker Client 与 Docker Daem ...
- mac电脑好用的工具总结
制作gif:https://gfycat.com/gifbrewery 制作gif(超级好用,制作速度快,压缩图片小):https://www.cockos.com/licecap/ 解压工具:htt ...
- Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup
最近在学习dubbo,跟着教程做,但是运行时报错,需要添加netty依赖 <dependency> <groupId>io.netty</groupId> < ...
- 流式查询1. mybatis的游标Cursor,分页大数据查询
流式查询流式查询 指的是查询成功后不是返回一个集合而是返回一个迭代器,应用可以通过迭代器每次取一条查询结果.流式查询的好处是能够降低内存使用.例如我们想要从数据库取 1000 万条记录而又没有足够的内 ...