• PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 1
    收藏次数
  • 1 积分
    下载积分
  • 13
    下载次数
  • 2009-09-03 14:37
    上传日期
windows API应用 纯C 指针时钟显示系统时间
clock.rar
  • clock.cpp
    5.3KB
内容介绍
#include <windows.h> #include <string.h> #include <time.h> #include <math.h> #define ID_TIMER 1 //全局变量 WNDCLASSEX wnd; char szAppName[] = "定时器动画程序"; //函数声明 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; BOOL MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE hInstance,int iCmdShow); //函数:WinMain //作用:入口函数 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) { MSG msg; if(!MyRegisterClass(hInstance)) { return FALSE; } if(!InitInstance(hInstance,iCmdShow)) { return FALSE; } while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } //函数:SetIsotropic //作用:使图像始终位于窗口中央,并且在窗口尺寸变化时与窗口保持相同的比例进行缩放 void SetIsotropic (HDC hdc, int cxClient, int cyClient) { SetMapMode (hdc, MM_ISOTROPIC);//设定映像模式 SetWindowExtEx (hdc, 1000, 1000, NULL); SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL); SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL);//设定视口原点坐标 } //函数:Rotate //作用:将点的坐标进行旋转变换 void Rotate (POINT pt[], int iNum, int i_Angle) { int i;//需要进行变换的点的个数 POINT ptTemp; for (i = 0; i < iNum; i++) { ptTemp.x = (int) (pt[i].x * cos ((2 * 3.14159) * i_Angle / 360) +//对点的X坐标进行变换 pt[i].y * sin ((2 * 3.14159) * i_Angle / 360));//对点的Y坐标进行变换 ptTemp.y = (int) (pt[i].y * cos ((2 * 3.14159) * i_Angle / 360) - pt[i].x * sin ((2 * 3.14159) * i_Angle / 360)); pt[i] = ptTemp; } } //函数:DrawClock //作用:绘制定时器的刻度 void DrawClock (HDC hdc) { int i_Angle; POINT pt[3]; for (i_Angle = 0; i_Angle < 360; i_Angle += 6) { pt[0].x =0; pt[0].y =900; Rotate(pt, 1, i_Angle); //调用Rotate函数将刻度的圆心保存在pt[0]中 pt[2].x = pt[2].y = i_Angle % 5 ? 33 : 100;//pt[2]中保存实心圆半径的半径 pt[0].x = pt[0].x-pt[2].x / 2;//pt[0]保存实心圆内接正方形右下角坐标 pt[0].y = pt[0].y-pt[2].y / 2; pt[1].x = pt[0].x + pt[2].x;//pt[1]保存实心圆内接正方形左上角坐标 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 DrawStick (HDC hdc, struct tm *datetime, BOOL bChange) { static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,//保存绘制定时器指针的点的坐标 0, -200,50, 0, 0, 800,-50, 0, 0, -200,0, 0, 0, 0, 0, 0, 0, 0, 0,800 } ; int i; //用于循环计数 int i_Angle[3];//用于保存时针、分针和秒针的旋转角度 POINT ptTemp[3][5]; i_Angle[0] = (datetime->tm_hour * 30) % 360 + datetime->tm_min / 2 ;//时针角度 i_Angle[1] = datetime->tm_min * 6;//设定分针角度 i_Angle[2] = datetime->tm_sec * 6;//设定秒针角度 memcpy (ptTemp, pt, sizeof (pt)); for (i = bChange ? 0 : 2; i < 3; i++)//对三根指针上的每个点进行变换 { Rotate (ptTemp[i], 5, i_Angle[i]) ; Polyline (hdc, ptTemp[i], 5) ; } } //函数:WndProc //作用:处理主窗口消息 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient;//用于保存客户区范围 static struct tm dtPrevious; BOOL bChange; HDC hdc; PAINTSTRUCT ps; time_t lTime;//用于保存系统时间 struct tm *datetime; switch (msg) { case WM_CREATE://处理窗口创建消息 time (&lTime);//获得系统时间 datetime = localtime (&lTime);//转换时间格式 dtPrevious = *datetime; return 0; case WM_SIZE://处理窗口尺寸变化的消息 cxClient = LOWORD (lParam); cyClient = HIWORD (lParam); return 0; case WM_TIMER://处理时针消息 time (&lTime);//读取系统时间 datetime = localtime (&lTime); bChange = datetime->tm_hour != dtPrevious.tm_hour ||datetime->tm_min != dtPrevious.tm_min ;//判断是否需要改变时针或分针 hdc = GetDC (hwnd); SetIsotropic (hdc, cxClient, cyClient); SelectObject (hdc, GetStockObject (WHITE_PEN)); DrawStick (hdc, &dtPrevious, bChange); SelectObject (hdc, GetStockObject (BLACK_PEN)); DrawStick (hdc, datetime, TRUE); ReleaseDC (hwnd, hdc); dtPrevious = *datetime; return 0; case WM_PAINT://处理窗口重画消息 hdc = BeginPaint (hwnd, &ps); SetIsotropic (hdc, cxClient, cyClient); DrawClock (hdc); DrawStick (hdc, &dtPrevious, TRUE); EndPaint (hwnd, &ps); return 0; case WM_DESTROY://处理窗口销毁消息 KillTimer (hwnd, ID_TIMER); PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, msg, wParam, lParam); } //函数:MyRegisterClass //作用:注册窗口类 BOOL MyRegisterClass(HINSTANCE hInstance) { wnd.cbSize = sizeof (wnd); wnd.style = CS_HREDRAW | CS_VREDRAW; wnd.lpfnWndProc = WndProc; wnd.cbClsExtra = 0; wnd.cbWndExtra = 0; wnd.hInstance = hInstance; wnd.hIcon = NULL; wnd.hCursor = LoadCursor (NULL, IDC_ARROW); wnd.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wnd.lpszMenuName= NULL; wnd.lpszClassName = szAppName; wnd.hIconSm = NULL; return RegisterClassEx (&wnd); } //函数:InitInstance //作用:创建和显示窗口,申请时针消息 BOOL InitInstance(HINSTANCE hInstance,int iCmdShow) { HWND hwnd; hwnd = CreateWindow (szAppName, "时钟", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; if (!SetTimer (hwnd, ID_TIMER, 1000, NULL))//申请时针消息 { MessageBox (hwnd, "定时器太多!", szAppName,MB_ICONEXCLAMATION | MB_OK) ; return FALSE ; } ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); return TRUE; }
评论
    相关推荐
    • Windows-API.zip
      Windows api 编程好资料,请放心下载,不要错过咬
    • Windows-API-.zip
      这是有关Windows API 编程入门的教程,讲解的很全面与详细,我是无意之间发现的,感觉很有用,就上传和大家分享!
    • Windows_API编程入门教程.rar
      Windows API 编程是指调用Windows 的接口函数来进行程序的编写, 例如MessageBox 就是一个API 函数或者说接口函数。怎么说都可以,自己理解就行。如果你连这个都不太懂,我想也不会搜到这篇文章了
    • C语言实现的读写配置文件函数,与Windows API函数功能一样
      利用纯C语言实现的配置文件.ini读写函数,可跨平台使用。功能与Windows API函数 WritePrivateProfileString 和GetPrivateProfileString 一样
    • Windows程序设计
      本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程式写作的方法。这些程式用C语言编写并使用原始的Windows Application Programming Interface(API
    • EasyHook:EasyHook-Windows API挂钩的重塑
      该项目支持在32位或64位Windows Vista x64,Windows Server 2008 x64,Windows 7,Windows 8.1和Windows 10的完全托管环境中使用托管代码扩展(挂钩)非托管代​​码(API)。 EasyHook当前支持注入为.NET ...
    • npipe:用 Go 编写的 Windows 命名管道实现
      包 npipe 提供了一个围绕 Windows 命名管道的 Go 包装器。 Windows 命名管道文档: : 请注意,代码位于分支),但应导入为 gopkg.in/natefinch/npipe.v2(包名称仍为 npipe)。 npipe 提供了一个基于 stdlib ...
    • 纯API调用webbrowser
      不用MFC,用WINAPI调用IE控件。 已经封装成dll
    • api 视频编程(c语言 摄像头)
      c语言纯api视频编程,操作摄像头,摄像头编程。
    • C语言+WIN32 API实现播放器,功能齐全
      C语言+WIN32 API实现播放器,功能齐全