《windows程序设计》学习_3.4:实现雷区翻转
#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:实现雷区翻转的更多相关文章
- Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...
- Windows程序设计学习笔记(1):一个简单的windows程序
<Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...
- windows程序设计学习笔记(一)
windows里的变量类型 1.简单重定义windows变量 BOOL (TRUE FALSE) INT UINT(32位,4字节) LONG DWORD(32位,4字节) lParam,wParam ...
- Windows程序设计学习笔记(五)——菜单资源和加速键的使用
菜单可能是Windows提供的统一用户界面中最重要的一种方式,菜单通常在标题栏的下一行显示,这一栏叫做菜单栏,菜单栏中的每一项称之为菜单项,菜单栏中的每一个菜单项在激活时会显现一个下拉菜单(也可以说是 ...
- Windows程序设计学习笔记(四)自绘控件与贴图的实现
Windows系统提供大量的控件供我们使用,但是系统提供的控件样式都是统一的,不管什么东西看久了自然会厌烦,为了使界面更加美观,添加一些新的东西我们需要自己绘制控件. 控件在默认情况下并不进行自绘,如 ...
- 《Windows程序设计第5版》学习进度备忘
书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...
- MFC Windows程序设计源代码免费下载
本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...
- windows程序设计简介
大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...
- 愉快的开始 - Windows程序设计(SDK)000
愉快的开始 让编程改变世界 Change the world by program 参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张) 学习环境 视频演示:W ...
- Windows程序设计:格式化对话框的设计
刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的. MessageBox函数是许多人刚开始学习Windows程序设计或者是 ...
随机推荐
- linux系统find命令使用
find命令简介 1.find的作用 find是个使用频率比较高的命令.常常用它在系统特定目录下,查找具有某种特征的文件. 2. find命令的格式 find [-path……]-option ...
- 如何寻找java的安装路径问题
关于不知道JAVA安装在linux的哪 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans ...
- CSS自学笔记(1):CSS简介
一.什么是CSS CSS(Cascading Style Sheet(级联样式表))是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...
- [转]iOS UIAppearance使用详解
在iOS 5以前,自定义原生控件的外观并没有原生支持,因此开发人员感觉很麻烦.开发人员经常面临的问题是修改一个控件所有实例的外观.解决这个问题的正确方法是重写一遍控件.但由于这么做非常费时,一些开发人 ...
- opennebula kvm attach disk
openNebula hotPlug disk or nic 网络检索关键字(Network search keywords) 208.117.233.122 virsh attach disk vi ...
- swift3.0 扩展、协议(4)
扩展和协议是swift中的两个特性,用于对已有的类型进行扩展和修改. 扩展(extension) 向已经存在的类型添加新的功能(属性.方法.下标脚本等等),扩展使用extension关键字定义,语法 ...
- Effective Objective-C 读书笔记
一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目 ...
- Matrix Swapping II(求矩阵最大面积,dp)
Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Android学习路线(六)为Android应用加入ActionBar
Action bar 是你可以为你的应用的Activity实现的最为重要的设计元素之中的一个.它提供了集中UI特性.而且通过提供和其它的Android应用的一致性体验让你的应用可以非常快被用户熟悉.基 ...
- delphi “Invalid floating point operation.”错误的解决方法
这两天用webbrower写东西,有时候打开SSL加密站点时会出现”Invalid floating point operation.”的错误,上网搜了下,把解决方法贴上. 导致原因 在Delphi2 ...