zoukankan      html  css  js  c++  java
  • VC++SDK编程——模拟时钟

      1 #include <Windows.h>
      2 #include <tchar.h>
      3 #include <math.h>
      4 typedef struct Time
      5 {
      6     int hour, min, sec;
      7 }TimeStructure;
      8 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
      9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     10 void AdjustTime(TimeStructure *x);
     11 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
     12 {
     13     MSG msg;
     14     if (!InitWindowClass(hInstance, nCmdShow))
     15     {
     16         MessageBox(NULL, L"创建窗口失败!", _T("创建窗口"), NULL);
     17         return 1;
     18     }
     19     while (GetMessage(&msg, NULL, 0, 0))
     20     {
     21         TranslateMessage(&msg);
     22         DispatchMessage(&msg);
     23     }
     24     return(int)msg.wParam;
     25 }
     26 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     27 {
     28     HDC hDC;
     29     PAINTSTRUCT ps;
     30     HBRUSH hBrush;
     31     HPEN hPen;
     32     RECT clientRect;
     33     static TimeStructure x;
     34     float sita = 0;
     35     int xOrg, yOrg, rSec, rMin, rHour, rClock, xBegin, xEnd, yBegin, yEnd;
     36     switch (message)
     37     {
     38     case WM_CREATE:                                        //创建窗口时,响应的消息
     39         SetTimer(hWnd, 9999, 1000, NULL);                    //设置定时器
     40         break;
     41     case WM_PAINT:
     42         x.sec++;
     43         AdjustTime(&x);
     44         hDC = BeginPaint(hWnd, &ps);
     45         GetClientRect(hWnd, &clientRect);                    //获得用户区的尺寸
     46         hPen = (HPEN)GetStockObject(BLACK_PEN);                //设置画笔为系统预定义的黑色画笔
     47         hBrush = CreateSolidBrush(RGB(255, 220, 220));        //创建粉红色的单色画刷
     48         SelectObject(hDC, hPen);                            //选择画笔
     49         SelectObject(hDC, hBrush);                            //选择画刷
     50         xOrg = (clientRect.left + clientRect.right) / 2;
     51         yOrg = (clientRect.top + clientRect.bottom) / 2;        //计算屏幕中心的坐标,它也是时钟的中心
     52         rClock = min(xOrg, yOrg) - 50;                        //钟表的半径
     53         rSec = rClock * 6 / 7;                            //秒针的半径
     54         rMin = rClock * 5 / 6;                            //分针的半径
     55         rHour = rClock * 2 / 3;                            //时针的半径
     56         Ellipse(hDC, xOrg - rClock, yOrg - rClock, xOrg + rClock, yOrg + rClock);//绘制表面圆
     57         for (int i = 0; i < 60; i++)                        //绘制表面的刻度
     58         {
     59             if (i % 5)                                    //绘制表面表面的整点刻度
     60             {
     61                 hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
     62                 SelectObject(hDC, hPen);
     63                 xBegin = xOrg + rClock*sin(2 * 3.1415926*i / 60);
     64                 yBegin = yOrg + rClock*cos(2 * 3.1415926*i / 60);
     65                 MoveToEx(hDC, xBegin, yBegin, NULL);
     66                 xEnd = xOrg + (rClock - 20)*sin(2 * 3.1415926*i / 60);
     67                 yEnd = yOrg + (rClock - 20)*cos(2 * 3.1415926*i / 60);
     68 
     69             }
     70             else                                            //绘制表面表面的非整点刻度
     71             {
     72                 hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
     73                 SelectObject(hDC, hPen);
     74                 xBegin = xOrg + rClock*sin(2 * 3.1415926*i / 60);
     75                 yBegin = yOrg + rClock*cos(2 * 3.1415926*i / 60);
     76                 MoveToEx(hDC, xBegin, yBegin, NULL);
     77                 xEnd = xOrg + (rClock - 25)*sin(2 * 3.1415926*i / 60);
     78                 yEnd = yOrg + (rClock - 25)*cos(2 * 3.1415926*i / 60);
     79             }
     80             LineTo(hDC, xEnd, yEnd);
     81             DeleteObject(hPen);
     82         }
     83         hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
     84         SelectObject(hDC, hPen);
     85         sita = 2 * 3.1415926*x.sec / 60;
     86         xBegin = xOrg + (int)(rSec*sin(sita));
     87         yBegin = yOrg - (int)(rSec*cos(sita));                //秒针的起点,它的位置在秒针的最末端
     88         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
     89         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);//秒针的终点,它的位置在秒针的反方向的长度为秒针的1/8
     90         MoveToEx(hDC, xBegin, yBegin, NULL);
     91         LineTo(hDC, xEnd, yEnd);                            //绘制秒针
     92         hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
     93         SelectObject(hDC, hPen);
     94         sita = 2 * 3.1415926*x.min / 60;
     95         xBegin = xOrg + (int)(rMin*sin(sita));
     96         yBegin = yOrg - (int)(rMin*cos(sita));                //分针的起点
     97         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
     98         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);//分针的终点
     99         MoveToEx(hDC, xBegin, yBegin, NULL);
    100         LineTo(hDC, xEnd, yEnd);                            //绘制分针
    101         hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
    102         SelectObject(hDC, hPen);
    103         sita = 2 * 3.1415926*x.hour / 12;
    104         xBegin = xOrg + (int)(rHour*sin(sita));
    105         yBegin = yOrg - (int)(rHour*cos(sita));
    106         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
    107         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);
    108         MoveToEx(hDC, xBegin, yBegin, NULL);
    109         LineTo(hDC, xEnd, yEnd);                            //绘制时针
    110         DeleteObject(hPen);
    111         DeleteObject(hBrush);
    112         EndPaint(hWnd, &ps);                                //结束绘图
    113         break;
    114     case WM_TIMER:                                        //响应定时器发出的定时消息
    115         if (wParam == 9999)                                //判断是否是设置的定时器发出的消息
    116             InvalidateRect(hWnd, NULL, true);                //刷新屏幕
    117         break;
    118     case WM_SIZE:                                            //窗口尺寸改变时,刷新窗口
    119         InvalidateRect(hWnd, NULL, true);
    120         break;
    121     case WM_DESTROY:
    122         PostQuitMessage(0);                                //调用PostQuitMessage发出WM_QUIT消息
    123         break;
    124     default:
    125         return DefWindowProc(hWnd, message, wParam, lParam);    //默认时采用系统消息默认处理函数
    126         break;
    127     }
    128     return 0;
    129 }
    130 void AdjustTime(TimeStructure *x)
    131 {
    132     if (x->sec == 60)
    133     {
    134         x->sec = 0;
    135         x->min++;
    136         if (x->min == 60)
    137         {
    138             x->min = 0;
    139             x->hour++;
    140             if (x->hour == 12)
    141                 x->hour = 0;
    142         }
    143     }
    144 }
    145 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)
    146 {
    147     WNDCLASSEX wcex;
    148     HWND hWnd;
    149     TCHAR szWindowClass[] = L"窗口示例";
    150     TCHAR szTitle[] = L"模拟时钟";
    151     wcex.cbSize = sizeof(WNDCLASSEX);
    152     wcex.style = 0;
    153     wcex.lpfnWndProc = WndProc;
    154     wcex.cbClsExtra = 0;
    155     wcex.cbWndExtra = 0;
    156     wcex.hInstance = hInstance;
    157     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    158     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    159     wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    160     wcex.lpszMenuName = NULL;
    161     wcex.lpszClassName = szWindowClass;
    162     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    163     if (!RegisterClassEx(&wcex))
    164         return FALSE;
    165     hWnd = CreateWindow(
    166         szWindowClass,
    167         szTitle,
    168         WS_OVERLAPPEDWINDOW,
    169         CW_USEDEFAULT, CW_USEDEFAULT,
    170         CW_USEDEFAULT, CW_USEDEFAULT,
    171         NULL,
    172         NULL,
    173         hInstance,
    174         NULL
    175         );
    176     if (!hWnd)
    177         return FALSE;
    178     ShowWindow(hWnd, nCmdShow);
    179     UpdateWindow(hWnd);
    180     return TRUE;
    181 }

    界面太丑了,后来代码又被我改了:
      1 #include <Windows.h>
      2 #include <tchar.h>
      3 #include <math.h>
      4 typedef struct Time
      5 {
      6     int hour, min, sec;
      7 }TimeStructure;
      8 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
      9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     10 HFONT CreateMyFont(TCHAR * fontName, int height, int width);
     11 void AdjustTime(TimeStructure *x);
     12 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
     13 {
     14     MSG msg;
     15     if (!InitWindowClass(hInstance, nCmdShow))
     16     {
     17         MessageBox(NULL, L"创建窗口失败!", _T("创建窗口"), NULL);
     18         return 1;
     19     }
     20     while (GetMessage(&msg, NULL, 0, 0))
     21     {
     22         TranslateMessage(&msg);
     23         DispatchMessage(&msg);
     24     }
     25     return(int)msg.wParam;
     26 }
     27 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     28 {
     29     HDC hDC;
     30     PAINTSTRUCT ps;
     31     HFONT font;
     32     HBRUSH hBrush;
     33     HPEN hPen;
     34     LPCTSTR num[12] = { L"12", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8", L"9", L"10", L"11" };
     35     RECT clientRect;
     36     SYSTEMTIME sys;
     37     GetLocalTime(&sys);
     38     static TimeStructure x = { sys.wHour, sys.wMinute, sys.wSecond };//获取系统当前时间
     39     float sita = 0;
     40     int xOrg, yOrg, rSec, rMin, rHour, rClock, xBegin, xEnd, yBegin, yEnd;
     41     switch (message)
     42     {
     43     case WM_CREATE:                                        //创建窗口时,响应的消息
     44         SetTimer(hWnd, 9999, 1000, NULL);                    //设置定时器
     45         break;
     46     case WM_PAINT:
     47         x.sec++;
     48         AdjustTime(&x);
     49         hDC = BeginPaint(hWnd, &ps);
     50         GetClientRect(hWnd, &clientRect);                    //获得用户区的尺寸
     51         hPen = (HPEN)GetStockObject(BLACK_PEN);                //设置画笔为系统预定义的黑色画笔
     52         SelectObject(hDC, hPen);                            //选择画笔
     53         xOrg = (clientRect.left + clientRect.right) / 2;
     54         yOrg = (clientRect.top + clientRect.bottom) / 2;        //计算屏幕中心的坐标,它也是时钟的中心
     55         rClock = min(xOrg, yOrg) - 50;                        //钟表的半径
     56         rSec = rClock * 6 / 7;                            //秒针的半径
     57         rMin = rClock * 5 / 6;                            //分针的半径
     58         rHour = rClock * 2 / 3;                            //时针的半径
     59         hBrush = CreateSolidBrush(RGB(0, 0, 0));            //创建黑色的单色画刷
     60         SelectObject(hDC, hBrush);                            //选择画刷
     61         Ellipse(hDC, xOrg - rClock - 20, yOrg - rClock - 20, xOrg + rClock + 20, yOrg + rClock + 20);
     62         hBrush = CreateSolidBrush(RGB(204, 204, 255));        //创建长春花色的单色画刷
     63         SelectObject(hDC, hBrush);                            //选择画刷
     64         Ellipse(hDC, xOrg - rClock - 5, yOrg - rClock - 5, xOrg + rClock + 5, yOrg + rClock + 5);
     65         for (int i = 0; i < 60; i++)                        //绘制表面的刻度
     66         {
     67             if (i % 5)                                    //绘制表面表面的整点刻度
     68             {
     69                 hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
     70                 SelectObject(hDC, hPen);
     71                 xBegin = xOrg + rClock*sin(2 * 3.1415926*i / 60);
     72                 yBegin = yOrg + rClock*cos(2 * 3.1415926*i / 60);
     73                 MoveToEx(hDC, xBegin, yBegin, NULL);
     74                 xEnd = xOrg + (rClock - 20)*sin(2 * 3.1415926*i / 60);
     75                 yEnd = yOrg + (rClock - 20)*cos(2 * 3.1415926*i / 60);
     76             }
     77             else                                            //绘制表面表面的非整点刻度
     78             {
     79                 hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
     80                 SelectObject(hDC, hPen);
     81                 xBegin = xOrg + rClock*sin(2 * 3.1415926*i / 60);
     82                 yBegin = yOrg + rClock*cos(2 * 3.1415926*i / 60);
     83                 MoveToEx(hDC, xBegin, yBegin, NULL);
     84                 xEnd = xOrg + (rClock - 25)*sin(2 * 3.1415926*i / 60);
     85                 yEnd = yOrg + (rClock - 25)*cos(2 * 3.1415926*i / 60);
     86             }
     87             LineTo(hDC, xEnd, yEnd);
     88             if (i % 5 == 0)
     89             {
     90                 int j = 18 - i / 5;
     91                 LPCTSTR outInfo = num[j % 12];
     92                 font = CreateMyFont(L"楷体_GB2312", 24, 12);
     93                 SelectObject(hDC, font);
     94                 SetBkColor(hDC, RGB(204, 204, 255));
     95                 if (j % 13 / 10 == 0)
     96                     TextOut(hDC, xOrg + (rClock - 33)*sin(2 * 3.1415926*i / 60) - 6, yOrg + (rClock - 33)*cos(2 * 3.1415926*i / 60) - 12, outInfo, 1);
     97                 else
     98                     TextOut(hDC, xOrg + (rClock - 33)*sin(2 * 3.1415926*i / 60) - 12, yOrg + (rClock - 33)*cos(2 * 3.1415926*i / 60) - 12, outInfo, 2);
     99                 DeleteObject(font);
    100             }
    101             DeleteObject(hPen);
    102         }
    103         hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
    104         SelectObject(hDC, hPen);
    105         sita = 2 * 3.1415926*x.sec / 60;
    106         xBegin = xOrg + (int)(rSec*sin(sita));
    107         yBegin = yOrg - (int)(rSec*cos(sita));                //秒针的起点,它的位置在秒针的最末端
    108         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
    109         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);//秒针的终点,它的位置在秒针的反方向的长度为秒针的1/8
    110         MoveToEx(hDC, xBegin, yBegin, NULL);
    111         LineTo(hDC, xEnd, yEnd);                            //绘制秒针
    112         hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
    113         SelectObject(hDC, hPen);
    114         sita = 2 * 3.1415926*x.min / 60;
    115         xBegin = xOrg + (int)(rMin*sin(sita));
    116         yBegin = yOrg - (int)(rMin*cos(sita));                //分针的起点
    117         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
    118         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);//分针的终点
    119         MoveToEx(hDC, xBegin, yBegin, NULL);
    120         LineTo(hDC, xEnd, yEnd);                            //绘制分针
    121         hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
    122         SelectObject(hDC, hPen);
    123         sita = 2 * 3.1415926*x.hour / 12;
    124         xBegin = xOrg + (int)(rHour*sin(sita));
    125         yBegin = yOrg - (int)(rHour*cos(sita));
    126         xEnd = xOrg + (int)(rClock*sin(sita + 3.1415926) / 8);
    127         yEnd = yOrg - (int)(rClock*cos(sita + 3.1415926) / 8);
    128         MoveToEx(hDC, xBegin, yBegin, NULL);
    129         LineTo(hDC, xEnd, yEnd);                            //绘制时针
    130         DeleteObject(hPen);
    131         DeleteObject(hBrush);
    132         EndPaint(hWnd, &ps);                                //结束绘图
    133         break;
    134     case WM_TIMER:                                        //响应定时器发出的定时消息
    135         if (wParam == 9999)                                //判断是否是设置的定时器发出的消息
    136             InvalidateRect(hWnd, NULL, true);                //刷新屏幕
    137         break;
    138     case WM_SIZE:                                            //窗口尺寸改变时,刷新窗口
    139         x = { sys.wHour, sys.wMinute, sys.wSecond };
    140         InvalidateRect(hWnd, NULL, true);
    141         break;
    142     case WM_DESTROY:
    143         PostQuitMessage(0);                                //调用PostQuitMessage发出WM_QUIT消息
    144         break;
    145     default:
    146         return DefWindowProc(hWnd, message, wParam, lParam);    //默认时采用系统消息默认处理函数
    147         break;
    148     }
    149     return 0;
    150 }
    151 void AdjustTime(TimeStructure *x)
    152 {
    153     if (x->sec == 60)
    154     {
    155         x->sec = 0;
    156         x->min++;
    157         if (x->min == 60)
    158         {
    159             x->min = 0;
    160             x->hour++;
    161             if (x->hour == 12)
    162                 x->hour = 0;
    163         }
    164     }
    165 }
    166 HFONT CreateMyFont(TCHAR * fontName, int height, int width)
    167 {
    168     return CreateFont(
    169         height,
    170         width,
    171         0,
    172         0,
    173         FW_HEAVY,
    174         0,
    175         0,
    176         0,
    177         GB2312_CHARSET,
    178         OUT_DEFAULT_PRECIS,
    179         CLIP_DEFAULT_PRECIS,
    180         DEFAULT_QUALITY,
    181         DEFAULT_PITCH | FF_DONTCARE,
    182         fontName
    183         );
    184 }
    185 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)
    186 {
    187     WNDCLASSEX wcex;
    188     HWND hWnd;
    189     TCHAR szWindowClass[] = L"窗口示例";
    190     TCHAR szTitle[] = L"模拟时钟";
    191     wcex.cbSize = sizeof(WNDCLASSEX);
    192     wcex.style = 0;
    193     wcex.lpfnWndProc = WndProc;
    194     wcex.cbClsExtra = 0;
    195     wcex.cbWndExtra = 0;
    196     wcex.hInstance = hInstance;
    197     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    198     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    199     wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    200     wcex.lpszMenuName = NULL;
    201     wcex.lpszClassName = szWindowClass;
    202     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    203     if (!RegisterClassEx(&wcex))
    204         return FALSE;
    205     hWnd = CreateWindow(
    206         szWindowClass,
    207         szTitle,
    208         WS_OVERLAPPEDWINDOW,
    209         CW_USEDEFAULT, CW_USEDEFAULT,
    210         CW_USEDEFAULT, CW_USEDEFAULT,
    211         NULL,
    212         NULL,
    213         hInstance,
    214         NULL
    215         );
    216     if (!hWnd)
    217         return FALSE;
    218     ShowWindow(hWnd, nCmdShow);
    219     UpdateWindow(hWnd);
    220     return TRUE;
    221 }

  • 相关阅读:
    PowerShell美化
    Open Live Writer
    Docker学习笔记
    [Caliburn.Micro专题][1]快速入门
    Git
    自助报表是什么东西?能不能利用自助报表把报表事务推给业务人员?
    什么是报表工具?和 EXCEL 有什么区别?
    报表为什么会没完没了?怎么解决这个问题?
    How Python Handles Big Files
    完成一个预测建模项目一般需要多长时间?
  • 原文地址:https://www.cnblogs.com/jacen789/p/4712140.html
Copyright © 2011-2022 走看看