《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程序设计或者是 ...
随机推荐
- Oracle查看被锁的表和解锁[转]
查看被锁的表 select p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$p ...
- Linux简介(好!)
Linux操作系统介绍 来源:233网校论文中心[ 2009-12-02 14:23:00 ]阅读:1作者:王长青编辑:studa20 [摘 要]文章从Unix.Minix系统的产生引出了Linux操 ...
- 从零开始PHP学习 - 第一天
写这个系列文章主要是为了督促自己 每天定时 定量消化一些知识! 同时也为了让需要的人 学到点啥~! 本人技术实在不高!本文中可能会有错误!希望大家发现后能提醒一下我和大家! 偷偷说下 本教程最后的目 ...
- C++设计模式之命令模式
厨师类: #include "Cooker.h" Cooker::Cooker(void) { } Cooker::~Cooker(void) { } void Cooker::M ...
- android一分钟学会可视化操作数据库(无需ROOT)
我刚开始弄android数据库的时候,想查询一些数据,以验证程序逻辑,发现很多方案都需要ROOT. 即便有不需要ROOT的方案,命令行交互也比较麻烦. 今天跟大家分享一下这个点点鼠标就能实现的功能. ...
- 强大的DELPHI RTTI–兼谈需要了解多种开发语言
一月 27th, 2005 by 猛禽 风焱在<“18般武艺”?>中说到他碰上的被多种语言纠缠的问题.我在回复里说: 很多语言只要能看懂几分就行了,没必要每一种都精通 但是如果只会很少的一 ...
- c#搭建服务端 准备工作(1)
思路 搭建服务器主要为了接收客户端所传来的数据,在学习过程中,整体的搭建逻辑大体分为以下几个步骤: 1.启动线程监听服务端口 2.监听客户端链接并进行处理 3.接收客户端传入的消息 4.向客户端回传( ...
- Largest Submatrix(动态规划)
Largest Submatrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- [LeetCode] Search a 2D Matrix [25]
题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the fo ...
- MFC数据类型(data types)
为便于理解MFC库函数中的各种形参,现将MFC中常见的参数类型总结如下: 下面这些是和Win32程序(SDK程序)共同使用的数据类型: 数据类型 意义 BOOL Boolean值(布尔值,不是TRUE ...