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:变换,旋转,扭曲:刻度盘,指针形状 ...
随机推荐
- QT学习:02 界面布局管理
--- title: framework-cpp-qt-02-界面布局管理 EntryName: framework-cpp-qt-02-ui-layout-manage date: 2020-04- ...
- uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系
按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址: load address: entry point: 这两个地址是mkimage时指定的 bootm address:bootm ...
- scala偏函数小栗子
package cn.beicaiqm.scala.day04 /** * Created by Administrator on 2018/6/1. * 被包在花括号内没有match的一组case语 ...
- C#中?.、??、?:、及?等符号用途
1.可空类型修饰符(?) 众所周知,在C#中引用类型可以使用一个null引用来表示一个不存在的值,比如 string str = null 是正确的: 但是值类型却不能为空,比如 int k = ...
- 【AppStore】一文让你学会IOS应用上架Appstore
前言 咱们国内现在手机分为两类,Android手机与苹果手机,现在用的各类APP,为了手机的使用安全,避免下载到病毒软件,官方都极力推荐使用手机自带的应用商城进行下载,但是国内Android手机品类众 ...
- SqlParameter,参数化查询问题
SqlParameter p = new SqlParameter("@pageIndex", (object)pageIndex); SqlParameter带有两个参数的构造函 ...
- ARP协议介绍与投毒攻击
目录 ARP是什么? ARP协议工作原理 ARP攻击原理 攻击软件 防范 Reference ARP是什么? ARP是通过网络地址(IP)来定位机器MAC地址的协议,它通过解析网络层地址(IP)来找寻 ...
- css3 动画插件Animate.css
官网:https://animate.style/ GitHub:https://github.com/daneden/animate.css
- JavaScript高级~数组方法reduce
reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值. 有点抽象,意思可以看做每个元素执行之后,都会有一个汇总结果,你可以通过这个汇总结果 ...
- 如何对jar包修改并重新发布在本机
本人苦于jieba不能如何识别伊利丹·怒风,召唤者坎西恩这种名字,对jieba-analysis进行了解包和打包 步骤1:找到对应jar 步骤2:在cmd中输入jar -xvf xxx.jar解压包, ...