《windows程序设计》学习_4.1:计时器(可用于扫雷)

欢迎来我的个人网站:http://www.rxwcv.cn

    

  为了做一个逼真的扫雷,我的扫雷程序的位图都是从windowsXP下面的扫雷里来的。具体是怎么获取位图的呢?win8.1不给力,习惯了vc++6.0,所以虚拟机里装上了xp,用vc++6.0加载扫雷程序,就可以获得xp原版的位图了。

      这次要做的是一个计时器,扫雷的的计时器不是时、分、秒;类型的,而是百秒、十秒、秒类型的。看过雷区翻盖的朋友,也该都能明白,计时器显示时间的变化其实也是在画图,不停的换0~9这几个数字的图。那么现在只需要一个时钟消息,让他来触发画图就可以了。而windows中,恰好有这个消息:WM_TIMER。这个消息是如何使用的呢?

      当你要触发计时器时,先要设置计时器(SetTimer);当时钟到来以后,在WM_TIMER写响应程序;在不需要计时器的时候,注销计时器 (KillTimer)。这也是我的程序的大体思路:当WM_CREATE消息到来时,先把时钟画出来,画在右上角,值全为0;当单击鼠标左键时开始计 时,时钟到来的时候,发送自定义消息;在自定义消息下画图(显示出时钟跳动),当WM_DESTROY消息到来时,注销掉时钟。

      程序中定义的宏是用来表示计时器用的,因为我们完全可以设置多个计时器,每个计时器时钟间隔不同来完成扫雷中计时器功能。但我并不是这样做的,而是 设置了一个一秒跳动一下的计时器,并且设置了一个整型变量sec记录秒数。sec%10表明了是多少秒;(sec%100)/10表示的是几十秒(这里主 要是因为直接整除10会出现错误的结果,所以先把百位去掉了);sec/100表明的是几百秒。

#include <windows.h>
#include "resource.h"

#define ID_TIMER_1   1


//自定义消息
#define WM_MYMSG (WM_USER + 100) 

LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,        //当前实例句柄
                   HINSTANCE hPrevInstance, //先前实例句柄
                   LPSTR lpCmdLine,            //命令行
                   int nCmdShow)            //显示状态,全屏,最小化或一般
{
    static TCHAR szAppName[] = TEXT("计时器");
    //窗口句柄
    HWND hwnd;
    //消息
    MSG msg;
    //窗口类
    WNDCLASS wndclass;
    //窗口风格:当移动窗口或者改变大小时重绘窗口
    wndclass.style           =  CS_HREDRAW | CS_VREDRAW;
    //指明回调函数
    wndclass.lpfnWndProc   = WndProc;
    //额外的比特用来确认下一个窗口类的位置,暂时不用
    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  = NULL;
    //窗口类名
    wndclass.lpszClassName = szAppName;

    //注册窗口
    if(!RegisterClass(&wndclass))
    {
        return -1;
    }

    //创建窗口
    hwnd = CreateWindow(szAppName,                
                        TEXT("计时器"),            
                        WS_OVERLAPPEDWINDOW,    
                        CW_USEDEFAULT,            
                        CW_USEDEFAULT,            
                        CW_USEDEFAULT,            
                        CW_USEDEFAULT,            
                        NULL,                    
                        NULL,                    
                        hInstance,                
                        NULL);                    

    //显示窗口
    ShowWindow(hwnd,SW_SHOWNA);

    //更新窗口
    UpdateWindow(hwnd);

    //消息循环
    while(GetMessage(&msg,NULL,0,0))
    {
        
        TranslateMessage(&msg);
        //将消息给窗口
        DispatchMessage(&msg);

    }

    return msg.wParam;

}
//回调函数:本程序的主要功能是设计一个计时器
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //位图句柄
    static HBITMAP hBitmap_clc;
    //客户区大小
    static int cxClient,cyClient;
    //资源大小
    static int cxSource_clc,cySource_clc;
    //位图结构信息
    BITMAP bitmap_clc;
    //设备描述表句柄
    HDC hdc,hdcMem;
    //实例句柄
    HINSTANCE hInstance;
    //绘图结构信息
    PAINTSTRUCT ps;
    //计时用的变量
    static int sec = 0; 

    switch(message)
    {
    //创建消息:装载位图,获取位图信息
    case WM_CREATE:
        //获得实例句柄
        hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
        //装载位图
        hBitmap_clc = LoadBitmap(hInstance, MAKEINTRESOURCE  (IDB_BITMAP1));
        //获取位图的信息,放到bitmap_clc里
        GetObject(hBitmap_clc,sizeof(BITMAP),&bitmap_clc);
        //每个数字的长和宽
        cxSource_clc = bitmap_clc.bmWidth;
        cySource_clc = bitmap_clc.bmHeight/12;
        return 0;

    //当前客户区大小
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        return 0;

    //绘图消息:设置默认的贴图
    case WM_PAINT:
        hdc = BeginPaint (hwnd, &ps);
        //给指定的设备创建兼容的内存设备内容
        hdcMem = CreateCompatibleDC(hdc);
        //把对象选到设备内容中:参数为设备内容句柄,对象句柄
        SelectObject(hdcMem,hBitmap_clc);
        //开始画图
        //贴图位置:最右边是1秒,中间10秒,左边100秒        
        BitBlt(hdc, cxClient-cxSource_clc,   0, cxSource_clc, cySource_clc,hdcMem, 0, cySource_clc*11, SRCCOPY);
        BitBlt(hdc, cxClient-cxSource_clc*2, 0, cxSource_clc, cySource_clc,hdcMem, 0, cySource_clc*11, SRCCOPY);
        BitBlt(hdc, cxClient-cxSource_clc*3, 0, cxSource_clc, cySource_clc,hdcMem, 0, cySource_clc*11, SRCCOPY);
        DeleteDC(hdcMem);
        EndPaint (hwnd, &ps); 
        return 0;

    //鼠标左键点击:开始计时
    case WM_LBUTTONDOWN:
        SetTimer(hwnd,ID_TIMER_1,1000,NULL);
        return 0;

    //时钟到来:发出声音,发送自定义消息
    case WM_TIMER:
        //MessageBeep(MB_ICONASTERISK);
        PlaySound(TEXT("123.wav"), NULL, SND_FILENAME | SND_ASYNC);   //自定义声音
        sec++;
        //发送自定义消息
        SendMessage(hwnd,WM_MYMSG,wParam,lParam); 
        return 0;
    //自定义消息,开始画图改变时钟的值
    case WM_MYMSG:
        hdc = GetDC(hwnd);
        hdcMem =  CreateCompatibleDC(hdc);
        SelectObject(hdcMem,hBitmap_clc);
        //开始画图
        //数字的位置:0是第12个,位置为cySource_clc*11,1?是第11个,位置为cySource_clc*10,依次类推
        BitBlt(hdc, cxClient-cxSource_clc,   0, cxSource_clc, cySource_clc, hdcMem, 0, cySource_clc*(11-sec%10), SRCCOPY);
        BitBlt(hdc, cxClient-cxSource_clc*2, 0, cxSource_clc, cySource_clc, hdcMem, 0, cySource_clc*(11-(sec%100)/10), SRCCOPY);
        BitBlt(hdc, cxClient-cxSource_clc*3, 0, cxSource_clc, cySource_clc, hdcMem, 0, cySource_clc*(11-sec/100), SRCCOPY);
        DeleteDC(hdcMem);
        ReleaseDC(hwnd,hdc);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        KillTimer(hwnd,ID_TIMER_1);
        return 0;
    }
    //缺省处理
    return DefWindowProc (hwnd, message, wParam, lParam);
}

欢迎来我的个人网站:http://www.rxwcv.cn

转载于:https://www.cnblogs.com/Hewie/p/3423267.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Smith Chart(史密斯图)是一种通用电路工具,用于帮助工程师分析各种电传输网络,特别是在射频(RF)和微波领域。Smith Chart通常用于计算和设计电线、微带线、同轴电缆等电路元件的阻抗匹配和传输线的变换设计。 在Smith Chart上,圆周表示电阻、射线和阻抗值。Smith Chart常用于导入朗格迪取样(Logarithm Sampling)和匹配网络设计,提供了一种直观的方式来表示复杂的电路元素。 在Smith Chart中,内圆表示空载(开路)的阻抗,外圆表示短路的阻抗,而半径为1表示50欧姆的阻抗。使用Smith Chart的过程中,可以通过绘制负载(Load)圆圈和传输线圆圈来设计微波元件的阻抗匹配网络,从而修正网络的典型问题,例如失配和波阻抗不匹配等。 总的来说,Smith Chart是一个很方便、有用的工具,用于设计各种微波元件的阻抗匹配网络,这样就能够更好地满足工程师的需要和要求。 ### 回答2: Smith Chart是电路设计中常用的一种工具,用于解决各种电路匹配的问题,尤其是在微波频段。Smith Chart通常呈现为一个圆形图表,其中包含了一系列常见的阻抗、反射系数、传输线参数等等,用户可以使用它进行各种传输线、电路阻抗的计算与设计。Smith Chart的4.1版本是较早的版本,但仍然赢得了很多信赖和使用者。它主要的特点是,具有较好的分辨率和细节,包含的参数较为丰富,而且简单易于使用,即使对于初学者也可以快速上手。在使用Smith Chart进行设计时,我们可以将待计算的参数画在Smith Chart上,然后通过舍取法或线性插值法来得到精确的匹配结果。此外,通过Smith Chart我们还可以进行参数调节,例如调整反射系数,实现阻抗匹配等等。总体来说,Smith Chart是电路设计工具中不可缺少的一部分,其精确性和效率让其成为了众多电子工程师和学生们的首选。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值