《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程序设计或者是 ...
随机推荐
- mini-httpd源码分析-version.h
/* version.h - version defines for mini_httpd */ #ifndef _VERSION_H_ #define _VERSION_H_ #define SER ...
- visual studio 配置OpenGL环境
首先在网上下载一个GLUT工具包. glut.zip,大约一百多kb. 解压之后得到这么几个文件: 将glut.h复制到C:\Program Files (x86)\Microsoft Visual ...
- Python标准库_ sys,random,time
一.sys 1. sys这个模块让你能够访问与Python解释器联系紧密的变量和函数 2. sys模块中一些重要的函数和变量 argv 命令行参数,包括脚本名称 exi ...
- Python核心编程笔记---- print@2
print 的输出从定向问题 print 可以用’>>‘来重定向输出,下面是例子 f = open('D:/python.txt','w+') print >> f," ...
- 深入GDI图像显示
摘 要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示.图像旋转显示.图像镜像显示进行了研究. 关键词:GDI图像显示,特殊GDI函数的 ...
- iOS_词典阵列 按key分组和排序
// // main.m // SortGroup // // Created by beyond on 14-10-26. // Copyright (c) 2014年 beyond.com All ...
- swift论坛正式上线
www.iswifting.com swift论坛正式上线.有问答专区,也有技术分享区,还有学习资料区,大家一起学习成长! 2014中国互联网大会于8月26日开幕. 政府主管部门.行业专家.企业领袖将 ...
- ASP.NET LINQ SQL执行超时的问题
最近在写一个航材取价的程序.由于执行的语句复杂,数据量比较大,容易造成超时. 看提示应该是执行SQL的时候超时,我在程序中用的linq. 实际把SQL语句单独执行的时候观察也要40秒左右. 查资料得知 ...
- 用for循环遍历DataTable中的数据
for (int i = 0; i < dataTable.Rows.Count; i++) { for (int j = 0; j < dataTable.Columns.Count; ...
- iOS的扩展类,扩展属性
Objective-C有两个扩展机制:Associative和Category.Category用来扩展类方法,Associative用于扩展属性.Associative机制的原理是把两个对象关联起来 ...