欢迎来我的个人网站: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 = ;
//额外的比特用来确认下一个窗口实例的位置,暂时不用
wndclass.cbWndExtra = ;
//实例句柄
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 -;
} //创建窗口
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,,))
{ 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 = ; 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/;
return ; //当前客户区大小
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return ; //绘图消息:设置默认的贴图
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
//给指定的设备创建兼容的内存设备内容
hdcMem = CreateCompatibleDC(hdc);
//把对象选到设备内容中:参数为设备内容句柄,对象句柄
SelectObject(hdcMem,hBitmap_clc);
//开始画图
//贴图位置:最右边是1秒,中间10秒,左边100秒
BitBlt(hdc, cxClient-cxSource_clc, , cxSource_clc, cySource_clc,hdcMem, , cySource_clc*, SRCCOPY);
BitBlt(hdc, cxClient-cxSource_clc*, , cxSource_clc, cySource_clc,hdcMem, , cySource_clc*, SRCCOPY);
BitBlt(hdc, cxClient-cxSource_clc*, , cxSource_clc, cySource_clc,hdcMem, , cySource_clc*, SRCCOPY);
DeleteDC(hdcMem);
EndPaint (hwnd, &ps);
return ; //鼠标左键点击:开始计时
case WM_LBUTTONDOWN:
SetTimer(hwnd,ID_TIMER_1,,NULL);
return ; //时钟到来:发出声音,发送自定义消息
case WM_TIMER:
//MessageBeep(MB_ICONASTERISK);
PlaySound(TEXT("123.wav"), NULL, SND_FILENAME | SND_ASYNC); //自定义声音
sec++;
//发送自定义消息
SendMessage(hwnd,WM_MYMSG,wParam,lParam);
return ;
//自定义消息,开始画图改变时钟的值
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, , cxSource_clc, cySource_clc, hdcMem, , cySource_clc*(-sec%), SRCCOPY);
BitBlt(hdc, cxClient-cxSource_clc*, , cxSource_clc, cySource_clc, hdcMem, , cySource_clc*(-(sec%)/), SRCCOPY);
BitBlt(hdc, cxClient-cxSource_clc*, , cxSource_clc, cySource_clc, hdcMem, , cySource_clc*(-sec/), SRCCOPY);
DeleteDC(hdcMem);
ReleaseDC(hwnd,hdc);
return ; case WM_DESTROY:
PostQuitMessage();
KillTimer(hwnd,ID_TIMER_1);
return ;
}
//缺省处理
return DefWindowProc (hwnd, message, wParam, lParam);
}

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

《windows程序设计》学习_4.1:计时器(可用于扫雷)的更多相关文章

  1. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

  2. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...

  3. Windows程序设计学习笔记(五)——菜单资源和加速键的使用

    菜单可能是Windows提供的统一用户界面中最重要的一种方式,菜单通常在标题栏的下一行显示,这一栏叫做菜单栏,菜单栏中的每一项称之为菜单项,菜单栏中的每一个菜单项在激活时会显现一个下拉菜单(也可以说是 ...

  4. Windows程序设计学习笔记(四)自绘控件与贴图的实现

    Windows系统提供大量的控件供我们使用,但是系统提供的控件样式都是统一的,不管什么东西看久了自然会厌烦,为了使界面更加美观,添加一些新的东西我们需要自己绘制控件. 控件在默认情况下并不进行自绘,如 ...

  5. windows程序设计学习笔记(一)

    windows里的变量类型 1.简单重定义windows变量 BOOL (TRUE FALSE) INT UINT(32位,4字节) LONG DWORD(32位,4字节) lParam,wParam ...

  6. 《Windows程序设计第5版》学习进度备忘

    书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...

  7. 最全的Windows Azure学习教程汇总

    Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器.数据中心.Web 和 PC 上的应用程序. Azure 是一种灵活和支持互操作的平台,能够将 ...

  8. MFC Windows程序设计源代码免费下载

    本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...

  9. windows程序设计简介

    大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...

  10. Windows编程中的若干难点 - Windows程序设计(SDK)007

    Windows编程中的若干难点 让编程改变世界 Change the world by program 一个窗口的生与死 我记得有童鞋会问:如果我的程序需要在关闭前让用户判断是否确定要关闭窗口,我应该 ...

随机推荐

  1. leetcode算法刷题(三)

    今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...

  2. android 向SD卡写入数据

    原文:android 向SD卡写入数据 1.代码: /** * 向sdcard中写入文件 * @param filename 文件名 * @param content 文件内容 */ public v ...

  3. docker 网络4种模式

    1.host 模式,使用docker run 时 使用--net=host 指定 docker 使用的网络和宿主机一样,在容器上看到的网卡ip就是宿主机上的ip 2.container 模式,使用-- ...

  4. Build A Micro Team

    最近这两周一直在忙,忙到忘记回QQ和微信的程度,甚至有两天下班回来直接躺平,虽说忙碌但是也收获了不少. Start 说起来有趣,最近在忙的这个项目最初是公司设立的用于工程师在业余时间开发的projec ...

  5. Python学习笔记6-Python中re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  6. JavaScript单线程

    首先浏览器的js引擎是单线程的,执行一个耗时操作必定阻碍线程后续代码的执行(比如等待网络请求的响应).一些语言采用了开一个子线程并把耗时操作放到子线程去执行的办法解决了这个问题.js引擎本身不支持多线 ...

  7. Memcached基本架构和思想

    Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. 从用户的角度来说,服务器维护了一个键-值关系的数 ...

  8. AngularJS初始用之 中间件 connect .static 静态文件不能找到

    学习心得,软件更新太快,学习不能照书本. 在学习搭建Nodejs服务器时,掉坑了啦,太坑了,对于什么都不知道的初学者,开门就是坑...,怎么坚持学下去... 还好,现在的世界很大,如果你发现自己不是犯 ...

  9. 《think in python》学习-5

    think in python -5 think in python -5 条件和递归 求模操作符% 用于整数,可以计算出第一个操作数除以第二个操作数的余数 7%3 #结果是2 求模操作符%有很多用途 ...

  10. 无法加载协定为“XXXWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置

    错误描述:无法加载协定为“XXXWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分. 错误原因:该webservce在web.confi ...