抓鼠标的猫(Win32实现,Codeblocks+GCC编译)
程序效果:
猫的眼睛一直跟着鼠标移动:

鼠标经过猫的右脚附近时,猫会抓住鼠标。(未使用Hook)

代码:
//main.cpp
1 #include <windows.h>
#include <math.h>
//#include <iostream>
//using namespace std;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
double WIDTH=,HEIGHT=;
double px=0.0,py=0.0;
double ppx=0.0,ppy=0.0;
POINT sp;
int cat=;
double width,height;
PAINTSTRUCT ps ;
RECT rect ;
POINT pts[];
double left_eye_px=0.0,right_eye_px=0.0;
double eye_py=0.0;
double eye_r=0.0;
double k=0.0;
double ball_hr=0.0;//半径
double deltax=0.0;
POINT p,pp;
int initGraph=;
LPPOINT catp;
RECT eye_rect;
HBRUSH gray_brush =CreateSolidBrush (RGB(,,));
HBRUSH white_brush =CreateSolidBrush (RGB(,,));
HBRUSH black_brush =CreateSolidBrush (RGB(,,));
int drawRound(HDC hdc,int x,int y,int r) //r 直径
{
Ellipse(hdc,x-r/,y-r/,x+r/,y+r/);
return ;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
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 ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("Mouse Hook"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
WIDTH, // initial x size
HEIGHT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, , ))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
} int init(HWND hwnd)
{
GetClientRect (hwnd, &rect) ;
width=rect.right-rect.left ;
height=rect.bottom-rect.top ;
left_eye_px=width*/-height/;
right_eye_px=width*/+height/;
eye_py=height*/-height/;
eye_r=height/;
ball_hr=eye_r/;//半径
px=left_eye_px;
py=eye_py;
ppx=right_eye_px;
ppy=eye_py;
eye_rect.left=left_eye_px-eye_r/;
eye_rect.right=right_eye_px+eye_r/;
eye_rect.top=eye_py-eye_r/;
eye_rect.bottom=eye_py+eye_r/;
return ;
}
int drawHand(HDC hdc)
{
/**< 画嘴 */
if(cat==)
{
MoveToEx (hdc, width/+width/,height/*, NULL) ;
LineTo (hdc, width*/-width/, height/*) ;
SelectObject (hdc,gray_brush ) ;
Ellipse(hdc,width/-width/,height/*,width/+width/,height*1.1);//左胳膊
Ellipse(hdc,width/*-width/,height/*,width/*+width/,height*1.1);//右胳膊
return ;
}
SelectObject (hdc, gray_brush) ;
Ellipse(hdc,width/*-width/,height/*,width/*+width/,height*1.1);//右胳膊
Ellipse(hdc,width/-width/,height-height/,width/+width/,height);//左胳膊
/**< 画脚掌 */
Ellipse(hdc,width/-width/,height-height/,width/+width/,height);
MoveToEx (hdc, width/-width/,height-height/, NULL) ;
LineTo (hdc, width/-width/, height-height/) ;
MoveToEx (hdc, width/,height-height/, NULL) ;
LineTo (hdc, width/, height-height/) ;
MoveToEx (hdc, width/+width/,height-height/, NULL) ;
LineTo (hdc, width/+width/, height-height/) ;
Arc( hdc, width/-width/, height-height/,width/+width/, height,width/+width/, height,width/-width/, height);
/**< 画嘴 */
Arc( hdc, width*/+width/, height/*,width*/-width/, height/*,width*/, height/*, width*/, height/*);
return ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
POINT pc;
HDC hdc;
switch (message)
{
case WM_CREATE:
init(hwnd);
initGraph =;
InvalidateRect (hwnd,NULL, true) ;
return ;
case WM_SIZE:
init(hwnd);
initGraph =;
InvalidateRect (hwnd,NULL, true) ;
return ;
case WM_MOVE:
return ;
case WM_LBUTTONDOWN:
GetCursorPos(&pc);
if(pc.x==sp.x&&pc.y==sp.y)
{
cat=;
SetCursorPos(sp.x,sp.y-height/);
ReleaseCapture () ;
initGraph=;
InvalidateRect (hwnd,NULL, true) ;
}
return ;
case WM_MOUSEMOVE:
if(cat==)
{
SetCursorPos(sp.x,sp.y);
return ;
}
GetCursorPos(&p);
pp=p;
ScreenToClient(hwnd,&pp);
if((pp.x>width/-width/)&&(pp.x<width/+width/)&&(pp.y>height-height/)&&(pp.y<height))
{
SetCapture (hwnd) ;
sp.x=width/;
sp.y=height-height/;
ClientToScreen(hwnd,&sp);
cat=;
initGraph=;
InvalidateRect (hwnd,NULL, true) ;
return ;
}
k=999.0;
if(pp.x-left_eye_px!=)
{
k=(pp.y-eye_py)/(pp.x-left_eye_px);
}
deltax=(ball_hr/)/(+k*k);
deltax=sqrt(deltax);
if(!(pp.x>left_eye_px))
{
deltax=(-1.0)*deltax;
}
px=left_eye_px+deltax*;
deltax=(ball_hr/)/(+/(k*k));
deltax=sqrt(deltax);
if(!(pp.y>eye_py))
{
deltax=(-1.0)*deltax;
}
py=eye_py+deltax*;
k=999.0;
if(pp.x-right_eye_px!=)
{
k=(pp.y-eye_py)/(pp.x-right_eye_px);
}
deltax=(ball_hr/)/(+k*k);
deltax=sqrt(deltax);
if(!(pp.x>right_eye_px))
{
deltax=(-1.0)*deltax;
}
ppx=right_eye_px+deltax*;
deltax=(ball_hr/)/(+/(k*k));
deltax=sqrt(deltax);
if(!(pp.y>eye_py))
{
deltax=(-1.0)*deltax;
}
ppy=eye_py+deltax*;
InvalidateRect (hwnd, &eye_rect, false) ;
return ;
case WM_PAINT:
hdc=BeginPaint (hwnd,&ps) ;
if(initGraph==)
{
SelectObject (hdc, gray_brush) ;
Ellipse(hdc,width/,height/,width-width/,height*/);//身体
/**< 画脸 */
Ellipse(hdc,,height/,width*/,height*/);
/**< 画耳朵 */
pts[].x =width/;
pts[].y =height/;
pts[].x =width/;
pts[].y =height/*;
pts[].x =width/*;
pts[].y =height/*;
Polygon (hdc, pts, ) ;
pts[].x =width/*;
pts[].y =height/;
pts[].x =width/*;
pts[].y =height/*;
pts[].x =width/*;
pts[].y =height/*;
Polygon (hdc, pts, ) ;
/**< 画胡子 */
MoveToEx (hdc, , height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
MoveToEx (hdc, , height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
MoveToEx (hdc, , height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
MoveToEx (hdc, width, height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
MoveToEx (hdc, width, height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
MoveToEx (hdc, width, height/*, NULL) ;
LineTo (hdc, width/*,height/*) ;
drawHand(hdc);
initGraph=;
}
/**< 画眼睛 */
SelectObject (hdc, white_brush) ;
drawRound(hdc,left_eye_px,eye_py,eye_r);
drawRound(hdc,right_eye_px,eye_py,eye_r);
SelectObject (hdc, black_brush) ;
drawRound(hdc,px,py,ball_hr*);
drawRound(hdc,ppx,ppy,ball_hr*);
EndPaint (hwnd, &ps) ;
return ;
case WM_DESTROY:
PostQuitMessage () ;
return ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
程序写于大三上学期,Windows程序设计 课程考核作业。
2016.4.12更新博客。
END
抓鼠标的猫(Win32实现,Codeblocks+GCC编译)的更多相关文章
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...
- 俄罗斯方块(Win32实现,Codeblocks+GCC编译)
缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...
- 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)
说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- GLine游戏(Win32GUI实现,CodeBlocks+GCC编译)
游戏规则: 在10X10的棋盘上有五种颜色的棋子. 点击一个棋子,再点击一个空格子,如果两者之间有一条路径的话,棋子会移动到空格子内. 每移动一次,棋盘上会增加三个棋子,其位置和颜色都是随机的. 当横 ...
- Socket服务端和客户端(C++,CodeBlocks+GCC编译)
//main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...
- Shell(C++实现,CodeBlocks+GCC编译)
程序效果: 只实现了login .cd .ls .cat 四个命令.而且只能在 Windows 下运行. 代码: //main.cpp 1 #include <iostream> #inc ...
- GCC 编译优化指南(转)
GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...
- GCC 编译优化指南
转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...
随机推荐
- ubuntu入门
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- 关于项目中值对象Identifier的设计-领域驱动
到现在为止做了不项目,发现每个实体都会有个相应的值对象. 先简单说一下值对象和实体之间的区别: (以下内容来着<领域驱动设计>一书) 当一个小孩画画的时候,他注意的是画笔的颜色和笔尖的粗细 ...
- 簡單工廠模式-之-什麼是產品線 And 抽象工廠模式-之-什麼是產品族
簡單工廠模式-之-什麼是產品線 簡單工廠模式中,有一個概念就是使用了多層次的產品結構,那麼什麼是產品結構或者說什麼是產品線? 假定我們有一個基準的產品標準Product,那麼所有繼承該基類或者傳遞基類 ...
- 初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
- Apache的初中级面试题
--- 原文:[关于Apache的25个初中级面试题](http://www.oschina.net/translate/apache-interview-questions) Apache 求职面试 ...
- 字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理
前言: chrome 谷歌浏览器默认的字体大小为16px:可以通过设置font-size来设置字体大小但是当设置到12px以下的时候字体大小不再改变:对于想设置其他大小的字体就很头疼,本文参考网上的方 ...
- DVWA安装,ALMP环境搭建以及php版本转换
前言 本文记录DVWA(Damn Vulberability Web App)在虚拟机中安装配置,包括ALMP环境的搭建和php版本的转换. 目录 2. ALMP环境搭建 3. php版本切换 一. ...
- 地理数据库 (Geodatabase) 版本管理
版本化地理数据库包含一些非版本化地理数据库中不存在的附加表格和记录.这些附加表和记录有助于长时间执行并行编辑.如果不进行版本化处理,则编辑者需要锁定数据并防止其他用户对数据进行编辑或查看.要使用此功能 ...
- AFNetworking 3.0 断点续传 使用记录
最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...
- iOS导航栏标题颜色
按钮的颜色 [self.navigationBar setTintColor:[UIColor whiteColor]]; 标题颜色.字体 [self.navigationBar setTitleTe ...