虫虫教学

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 611|回复: 0

抓不住的兔子

[复制链接]

4449

主题

4659

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41710

最佳新人发帖达人推广达人热心会员突出贡献优秀讲师

发表于 2021-10-15 18:29:29 | 显示全部楼层 |阅读模式
       抓不住的兔子
     用户在繁忙的工作当中容易变得烦躁,这时就需要放松,而玩一些简单的游戏则无疑是不错的选择,本实例就是一款休闲小游戏,鼠标化身一只金黄色的小手,用户可以通过移动鼠标来抓取兔子(永远也抓不到的,鼠标一旦接近兔子,兔子就会随机出现在其他的位置),效果如图1所示。
                              



关键技术
实例首先要将兔子的背景抠除掉,然后通过新创建的按钮类的静态成员函数获得兔子的移动范围,当鼠标移动到按钮范围内时,在按钮的移动范围内,随机设置要移动的新坐标,并在新的位置显示兔子,使用户无法抓捕兔子。如何使用户无法抓捕兔子呢?主要是判断鼠标和按钮之间的关系,如果鼠标移动到按钮范围内,就将按钮移动到新的位置,要判断鼠标是否移动到按钮范围内可以使用PtInRect方法。
PtInRect方法方法用于判断一个指定的点是否在矩形区域内,语法如下:
BOOL PtInRect( POINT point ) const;
u Point:要进行判断的点的坐标。
v 返回值:如果点位于矩形区域中,则返回非0值;否则返回0。
设计过程
(1)创建一个基于对话框的应用程序,修改其Caption属性为“抓不住的兔子”。
(2)向工程中导入位图资源和鼠标指针文件,分别为程序背景,按钮背景和设置鼠标显示形状。
(3)向对话框中添加一个按钮控件。设置按钮控件的Owner draw属性。
(4)以CButton类为基类,派生一个CMoveButton类。

(5)覆写CMoveButton类的DrawItem虚方法,实现按钮外观的绘制。
void CMoveButton:rawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
      CRect rect;
      GetClientRect(rect);
      CDC dc;
      dc.Attach(lpDrawItemStruct->hDC);

      CDC     memDC;
      CBitmap      bitmap;                                                  //声明位图对象

      CBitmap* bmp = NULL;
       COLORREF col;
      CRect rc;
      int   x, y;
      CRgn rgn, tmp;
      GetWindowRect(&rc);                                                    //获得窗体区域
      bitmap.LoadBitmap(IDB_BITMAPCONEY);                              //装载模板位图
      memDC.CreateCompatibleDC(&dc);                                        //创建与内存兼容设备上下文
      bmp = memDC.SelectObject(&bitmap);
      rgn.CreateRectRgn(0, 0, rc.Width(), rc.Height());                      //初始化区域
       //计算得到区域
      for (x=0; x<=rc.Width(); x++)
      {
            for (y=0; y<=rc.Height(); y++)
            {
                  //将背景部分去掉
                  col = memDC.GetPixel(x, y);                               //得到像素颜色

                  if (col == RGB(0, 0, 0))                                //如果是背景颜色
                   {
                        tmp.CreateRectRgn(x, y, x+1, y+1);               //创建区域
                        rgn.CombineRgn(&rgn, &tmp,RGN_XOR);            //去除相互重叠的区域
                        tmp.DeleteObject();                                //删除区域对象
                  }
            }
      }
      SetWindowRgn((HRGN)rgn,TRUE);                                        //设置窗体为区域形状
}

(6)处理鼠标移动事件,在该事件中随机调整按钮控件的显示位置。
秘笈心法
心法领悟599:兔子形状区域的创建

为了创建兔子形状的区域,实例需要一个特殊图像,这个图像除了兔子图案外其它像素全是黑色,然后使用GetPixel方法对图像每个像素的颜色进行判断,只要是黑色,就不使用CombineRgn方法连接,这样最后就会将兔子图案所在像素的点连接成一个区域。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|虫虫教学--虫虫联盟官网

GMT+8, 2025-4-28 23:37 , Processed in 0.083399 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表