#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下的模拟时钟的更多相关文章

  1. Windows下编程--模拟时钟的实现

    windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1)   编写按键事件处理(启动和停止时钟) (2)   编写时钟事件处理,调用显示时钟函数 (3)   编写显示时钟函数,要调用显 ...

  2. 一个模拟时钟的时间选择器 ClockPicker

    最近开发的一个模拟时钟的时间选择器 ClockPicker,用于 Bootstrap,或者单独作为一个 jQuery 插件. 源代码托管在 GitHub 上: ClockPicker 最近项目中需要用 ...

  3. win32下用VC扩展PHP全过程

    闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不 多说了,进入正题: 一.已经在机器上安装PHP环境的就略过,否则先 ...

  4. 模拟时钟(AnalogClock)和数字时钟(DigitalClock)

    Demo2\clock_demo\src\main\res\layout\activity_main.xml <LinearLayout xmlns:android="http://s ...

  5. cocos2dx c++ 在mac下写的中文凝视,在win32下编译时不通过

    今天遇到个奇怪的问题,在mac下写的程序,加的中文凝视,编译没有问题,可是在win32下(使用的时vs2012, win7 64bit 系统)编译就总是报错 最后在中文凝视后 加一个空格,或者 换行, ...

  6. win32下利用python操作printer

    在win32下操作printer:   1)import win32print   2) 获得默认打印机名:          >>> win32print.GetDefaultPr ...

  7. android脚步---数字时钟和模拟时钟

    时钟UI组件是两个非常简单的组件,分为Digitalclock  和Analogclock, main.xml文件,书中程序有问题,加了两个组件,一个Button和一个<Chronometer ...

  8. Java多线程之sleep方法阻塞线程-模拟时钟

    package org.study2.javabase.ThreadsDemo.status; import java.text.SimpleDateFormat; import java.util. ...

  9. css模拟时钟

    css模拟时钟 思路: 画时钟数字(x,y)坐标 x = x0 + r*cos(deg) y = y0 + r*sin(deg) 知识点: 创建元素: createElement 添加元素: appe ...

  10. 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。

    使用CSS3纯代码来实现模拟时钟,及指针动画功能. 在这里主要使用到css3一些基本元素: border-radius:圆角边框,画圆形:表盘 Transform:变换,旋转,扭曲:刻度盘,指针形状 ...

随机推荐

  1. 高通Android Cam-x Actuator Bring up

    高通Android Camera Bring Up Actuator reference:https://blog.csdn.net/mr_zjc/article/details/105736925 ...

  2. QT学习:07 字符编码的问题

    --- title: framework-cpp-qt-07-字符编码的问题 EntryName: framework-cpp-qt-07-char-coding date: 2020-04-13 1 ...

  3. Canvas绘制圆角图片

    效果图: 思路: 先绘制一个圆角长方形 在画布中裁剪下来 在圆角长方形内绘制图片 图片四个角超出圆角长方形的区域被隐藏 具体代码: <!DOCTYPE html> <html lan ...

  4. VulnHub_DC-4渗透流程

    VulnHub_DC-4 DC-4 is another purposely built vulnerable lab with the intent of gaining experience in ...

  5. Spring声明事务和分布式事务处理技术

    Spring声明事务的两种方式 方式一.传统的编程式事务管理: 需要手动编写代码在业务层注入事务管理模板(一般不用) 方式二.基于 AOP 技术实现的声明式事务管理: Spring 声明式事务管理在底 ...

  6. VSCode如何设置Vue前端的debug调试

    vscode在调试vue.代码时,如何进行debug? 1.安装Chrome Debug插件. 2.在launch.json中,将url修改成你前端项目的路径: 1 { 2 // Use Intell ...

  7. JDK1.8新特性Lambda表达式简化if-else里都有for循环的优化方式

    在日常开发过程当中,能把代码写出来,不一定就意味着能把代码写好,说不准,所写的代码在他人看来,其实就是一坨乱七八糟的翔,因此,代码简化尤其重要,我曾经遇到过这样一个类型的代码,即if-else里都有相 ...

  8. [oeasy]python0140_导入_import_from_as_namespace_

    导入import 回忆上次内容 上次学习了 try except   注意要点 半角冒号 缩进 输出错误信息   有错就报告 不要隐瞒 否则找不到出错位置 还可以用traceback把 系统报错信息原 ...

  9. PHP 程序员为什么依然是外包公司的香饽饽?

    大家好,我是码农先森. PHP 唯一的爽点就是开发起来「哇真快」这刚好和外包公司的需求相契合,在 Web 领域的芒荒年代 PHP 以王者姿态傲视群雄.如果 PHP 敢说第二,就没有哪门子语言敢称第一, ...

  10. Hyperledger Fabric 2.x 环境搭建

    一.说明 区块链网络的核心是分布式账本,在这个账本中记录了网络中发生的所有交易信息. Hyperledger Fabric是一个是开源的,企业级的,带权限的分布式账本解决方案的平台.Hyperledg ...