windows api学习笔记-使用定时器

#include <windows.h>
#include "resource.h"
#include <string>
 
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型
 
int APIENTRY WinMain(                               //APIENTRY是__stdcall的宏定义
                     HINSTANCE hInstance,           //本模块的实例句柄
                     HINSTANCE hPrevInstance,       //Win16留下的废物
                     LPSTR lpCmdLine,               //命令行参数
                     int nCmdShow                   //主窗口初始化时的现实形式
                     )
{
    char szClassName[] = "MainClass";
    WNDCLASSEX wndclass;   //用来描述主窗口的结构
    wndclass.cbSize = sizeof(wndclass);  //结构的大小
    wndclass.style = CS_HREDRAW|CS_VREDRAW; //如果窗口大小,横向改变和竖向改变都会重画窗口
    wndclass.lpfnWndProc = MainWndProc;//窗口函数指针
    wndclass.cbClsExtra = 0;//没有额外的类内存
    wndclass.cbWndExtra = 0;//没有额外的窗口内存
    wndclass.hInstance = hInstance;//实例句柄
    wndclass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);//使用预定义图标
    wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW);//使用预定义光标
    wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//使用白色背景画刷
    wndclass.lpszMenuName = (LPSTR)IDR_MENU1;//指定菜单,菜单在头文件中已经定义了
    wndclass.lpszClassName = szClassName;//窗口类的名称
    wndclass.hIconSm = NULL;//没有类的小图标
 
    ::RegisterClassEx(&wndclass);//注册这个窗口类
 
    HWND hwnd = ::CreateWindowEx(
        0,//扩展样式
        szClassName,//类名
        "My First Window",//窗口名。标题
        WS_OVERLAPPEDWINDOW,//窗口风格
        CW_USEDEFAULT,//初始X坐标
        CW_USEDEFAULT,//初始Y坐标
        CW_USEDEFAULT,//宽度
        CW_USEDEFAULT,//高度
        NULL,//父窗口句柄
        NULL,//菜单句柄
        hInstance,//实例句柄
        NULL//用户数据
        );
    if(hwnd == NULL)
    {
        ::MessageBox(NULL,"创建窗口出错","系统提示",MB_OK);
    }
    ::ShowWindow(hwnd,nCmdShow);//显示窗口
    ::UpdateWindow(hwnd);//刷新窗口
    MSG msg;
    while(::GetMessage(&msg,NULL,0,0))
    {
        ::TranslateMessage(&msg);//转换为键盘消息
        ::DispatchMessage(&msg);//将消息发送到相应的窗口函数
    }
    return msg.wParam;//当GetMessage返回FALSE时程序结束
}
 
#define IDT_TIMER1  1
 
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    char szText[56];
    static int nNum;
    static int bSetTimer;// 指示是否安装了定时器
    HDC hdc;
    PAINTSTRUCT ps;
    switch(message)
    {
        case WM_CREATE:
            {
                ::SetWindowText(hwnd,"定时器");
                bSetTimer = FALSE;
                return 0;
            }
        case WM_PAINT:
            {
                hdc = ::BeginPaint(hwnd,&ps);//使无效的客户区变的有效,并取得设备环境句柄               
                ::EndPaint(hwnd,&ps);
                return 0;
            }
        case WM_DESTROY:
            {
                ::PostQuitMessage(0);//向消息队列投递一个WM_QUIT消息,促使GET MESSAGE函数返回0,结束消息循环
                return 0;
            }
        case WM_COMMAND:
            {
                switch(LOWORD(wParam))
                {
                    case ID_FILE_EXIT:
                        ::SendMessage(hwnd,WM_CLOSE,0,0);
                        break;
                }
                return 0;
            }
        case WM_LBUTTONDOWN:
            {
                if(bSetTimer)
                {
                    ::KillTimer(hwnd,IDT_TIMER1);
                    bSetTimer = FALSE;
                }
                else
                {
                    if(::SetTimer(hwnd,IDT_TIMER1,600,NULL) == 0)
                    {
                        ::MessageBox(hwnd,"定时器安装失败","系统提示",MB_OK);
                    }
                    else
                    {
                        bSetTimer = TRUE;
                    }
                }
                break;
            }
        case WM_TIMER:
            {
                if(wParam == IDT_TIMER1)
                {
                    hdc = ::GetDC(hwnd);
                    nNum++;
                    ::wsprintf(szText,"计数:%d",nNum);
                    ::TextOut(hdc,10,10,szText,strlen(szText));//输出文本
                    ::InvalidateRect(hwnd,NULL,0);
                    ::MessageBeep(MB_OK);
                }
            }
            break;
    }
    return ::DefWindowProc(hwnd,message,wParam,lParam);
}
posted @   liulun  阅读(1438)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示