#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. HTTP POST和GET的区别[转]

    http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.aspx 1.HTTP 只有POST和GET 两种命令模式: 2.POST是被设 ...

  2. 正确的注销PHP SESSION

    /* 1.每个页面都必须开启session_start()后才能在每个页面里面使用session. 2.session_start()初始化session,第一次访问会生成一个唯一会话ID保存在客户端 ...

  3. codeforces 21D. Traveling Graph 状压dp

    题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...

  4. 如何在C++中获得完整的类型名称(RTTI的typeid在不同平台下有不同的输出值表达,自建类改进了RTTI丢失的信息)

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/)   地球人都知道C++里有一个typeid操作符可以用 ...

  5. JavaEE Tutorials (19) - Web应用安全入门

    19.1Web应用安全概述29519.2保护Web应用安全296 19.2.1指定安全约束297 19.2.2指定认证机制300 19.2.3在部署描述文件中指定认证机制302 19.2.4声明安全角 ...

  6. HDU 5972 Regular Number(ShiftAnd+读入优化)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5972 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  7. HDU 5716 带可选字符的多字符串匹配(ShiftAnd)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5716 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  8. poj2538---字符匹配(映射)

    #include <stdio.h> #include <stdlib.h> #include<string.h> int main() { int i,j; ], ...

  9. [LeetCode][Python]Add Two Numbers

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/add-two ...

  10. Qt编写端口扫描工具

    Qt提供了QTcpSocket类,可以方便地建立TCP连接.利用这一功能,Maxiee编写了一个简单地端口扫描工具. 软件的功能就是,扫描某一网段的固定端口,如80端口,若目的地址开放了这一端口,那么 ...