#include<windows.h>
#include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstace, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Stick1");
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))
{
MessageBox(NULL, TEXT ("The Program requires Windows NT!"), szAppName, MB_ICONERROR);
return ;
} hwnd = CreateWindow (szAppName,
TEXT ("Stick 1"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL); ShowWindow(hwnd , iCmdShow);
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;
static int cxClient,cyClient,cxSource,cySource;
//位图类结构,包含位图信息
BITMAP bitmap;
//设备环境表句柄
HDC hdc,hdcMem;
//这条消息的实例句柄,因为只在WM_CREATE消息中获得,所以是创建窗口的实例句柄
HINSTANCE hInstance;
int x,y,mx,my;
//PAINTSTRUCT包含了绘制客户区域的信息,第一个参数就是HDC类
PAINTSTRUCT ps; //控制距离的变量
int dstx = ;
int dsty = ;
switch(message)
{
//创建窗口的消息:第一个消息
case WM_CREATE:
//LPCREATESTRUCT是一个指向结构CREATESTRUCT的指针
//对lParam强制类型转换以后指向结构体,结构体中的hInstance
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
//装载位图:参数为实例句柄,位图,返回值是位图句柄
//虽然也可以用位图名来装载位图,但通常都是用序号
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE (IDB_BITMAP1));
//从制定的图形对象中获取信息
//参数为:图形句柄,对象缓冲区大小,对象信息缓冲区
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
//一幅位图的宽
cxSource = bitmap.bmWidth;
///一幅位图的高:整个位图由16种不同的图形组成,每幅图形为整个位图的16分之1
cySource = bitmap.bmHeight/; return ;
//改变窗口的大小
case WM_SIZE:
//32位值的高低位代表客户区的长宽
 93       //不同的消息间需要保留,所以用的是static
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return ;
//绘制窗口消息
case WM_PAINT:
//BeginPaint?函数准备画图,向PAINTSTRUCT结构中填充信息
100        //参数为:窗口句柄,指向PAINTSTRUCT结构的画图信息,返回值为一个HDC
hdc = BeginPaint (hwnd, &ps) ;
//创建内存的环境设备,返回值是一个内存设备环境的句柄
hdcMem = CreateCompatibleDC(hdc);
//将一个对象选择到设备环境中,参数为:设备环境句柄,对象句柄
SelectObject(hdcMem,hBitmap); for(y = dsty; y < cyClient-dsty; y += cySource)
{
for(x = dstx; x < cxClient-dstx; x += cxSource)
{
//贴图函数,参数为:目标DC句柄,贴图点的左上坐标的x坐标,贴图点的左上坐标的y坐标,
113              //目标和源的长,目标和源的宽,源DC句柄,源的左上角x坐标,源的左上角y坐标,
114                //光栅操作代码(这里是直接从源矩阵复制到目标矩阵)
BitBlt(hdc,x,y,cxSource,cySource,hdcMem,,,SRCCOPY); }
}
DeleteDC(hdcMem);
//绘制窗口结束
EndPaint (hwnd, &ps) ;
return ;
case WM_LBUTTONDOWN:
//左键会显示雷区被翻开的效果
hdc = GetDC(hwnd);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem,hBitmap); //使得鼠标点到哪,就选择那里的雷区,并画一幅翻开的图片
131        //鼠标点到雷区外,不起作用
132        //鼠标点到雷区里,用这个方块的左上角代替贴图的位置
133        //鼠标位置:
mx = (LOWORD(lParam));
my = (HIWORD(lParam)); //点到雷区里面才有效,雷区位置:离上下dsty,左右dstx
if(mx>dstx && mx<cxClient-dstx && my>dsty && my<cyClient-dsty )
{
//将鼠标的位置改为这个点对应雷区的方砖的左上角
//结构总是在第一块砖上
mx = ((int)(mx-dstx)/cxSource)*cxSource+dstx;
my = ((int)(my-dsty)/cySource)*cySource+dsty;
//贴图函数,参数为:目标DC句柄,贴图点的左上坐标的x坐标,贴图点的左上坐标的y坐标,
145            //目标和源的长,目标和源的宽,源DC句柄,源的左上角x坐标,源的左上角y坐标,
146            //光栅操作代码(这里是直接从源矩阵复制到目标矩阵)
BitBlt(hdc,mx,my,cxSource,cySource,hdcMem,,cySource*,SRCCOPY); }
DeleteDC(hdcMem);
ReleaseDC(hwnd,hdc);
return ;
//关闭窗口消息
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
 
     

左键点击翻砖的实现:

鼠标点一下,将鼠标点的位置换成它属于的方砖的位置,然后贴上另一种方砖即可。位置的转化原理其实很简单,就是利用C语言中int类型数据整除的性质,举个例子:

如果一块方砖的大小为16*16,你鼠标的位置为(30,50),那么它所属的方砖的左上角,肯定是在30/16 =1, 50/16 = 3就是第一列,第三行的那里,具体的像素就是(1*16,3*16)。

《windows程序设计》学习_3.4:实现雷区翻转的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. windows程序设计简介

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

  9. 愉快的开始 - Windows程序设计(SDK)000

    愉快的开始 让编程改变世界 Change the world by program  参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张)  学习环境 视频演示:W ...

  10. Windows程序设计:格式化对话框的设计

    刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的. MessageBox函数是许多人刚开始学习Windows程序设计或者是 ...

随机推荐

  1. [置顶] HDFS文件内容追加(Append)

    HDFS设计之处并不支持给文件追加内容,这样的设计是有其背景的(如果想了解更多关于HDFS的append的曲折实现,可以参考<File Appends in HDFS>:http://bl ...

  2. Arduino周边模块:LCD与数码管

    Arduino周边模块:LCD与数码管 Arduino周边模块:LCD与数码管 数码管的介绍 数码管一般是用来显示数字和字符的 数码管原理 一位数码管 该图是一个8段数码管,该数码管中包含了8个LED ...

  3. Android 通知栏系列....

    转:http://blog.csdn.net/vipzjyno1/article/details/25248021 在android的应用层中,涉及到很多应用框架,例如:Service框架,Activ ...

  4. 记一次C++与lua连接

    今晚,花了两个多钟折腾lua和c++的互连,终于成功了,觉得有必要记录下来.说实话,搜索引擎真是有利有弊,利在你有地方搜答案,弊则在于你半天都找不到正确的答案甚至找到误导你的答案,今晚更加加深了我的体 ...

  5. text-indent: -999px;是什么意思

    就是把该元素内的文字移到屏幕外面去,让我们肉眼看不见,有时候是因为如某栏目名称的文字或者logo的文字已经用背景图片代替了,我们不需要眼睛看见那些文字,但是希望搜索引擎可以搜到,就可以用这个把文字“隐 ...

  6. 记一次SQL联合查询注入工具的编写

    这是一个ASP网站的简单SQL注入检测和利用的工具,主要的功能是简单的检测出SQL注入漏洞,可以使用该id存在的SQL注入来获取数据库中的网站管理员的表名和字段名,猜解数据库中该表的字段数,最后通过联 ...

  7. C++设计模式之命令模式

    厨师类: #include "Cooker.h" Cooker::Cooker(void) { } Cooker::~Cooker(void) { } void Cooker::M ...

  8. Python自动化环境搭建

    安装配置 Eclipse + PyDev + Robotframework 集成开发环境 1.安装JDK安装目录下的jdk-7u17-windows-i586.exe文件(JAVA开发.运行环境)安装 ...

  9. MMC卡是什么

    MMC卡(Multimedia Card) 翻译成中文为“多媒体卡”.是一种快闪存储器卡标准.在1997年由西门子及SanDisk共同开发,技术基于东芝的NAND快闪记忆技术,因此较早期基于Intel ...

  10. 深入GDI图像显示

    摘  要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示.图像旋转显示.图像镜像显示进行了研究. 关键词:GDI图像显示,特殊GDI函数的 ...