程序效果:

猫的眼睛一直跟着鼠标移动:

鼠标经过猫的右脚附近时,猫会抓住鼠标。(未使用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编译)的更多相关文章

  1. 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)

    目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...

  2. 俄罗斯方块(Win32实现,Codeblocks+GCC编译)

    缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...

  3. 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)

    说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...

  4. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  5. GLine游戏(Win32GUI实现,CodeBlocks+GCC编译)

    游戏规则: 在10X10的棋盘上有五种颜色的棋子. 点击一个棋子,再点击一个空格子,如果两者之间有一条路径的话,棋子会移动到空格子内. 每移动一次,棋盘上会增加三个棋子,其位置和颜色都是随机的. 当横 ...

  6. Socket服务端和客户端(C++,CodeBlocks+GCC编译)

    //main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...

  7. Shell(C++实现,CodeBlocks+GCC编译)

    程序效果: 只实现了login .cd .ls .cat 四个命令.而且只能在 Windows 下运行. 代码: //main.cpp 1 #include <iostream> #inc ...

  8. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  9. GCC 编译优化指南

    转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...

随机推荐

  1. XAF视频教程来啦,已出7课

        XAF交流学习群内的兄弟录制了视频,他没有博客,委拖我发至博客园,希望能让更多的开发人员受益.快速开发企业级应用的好工具!   XAF入门01快速浏览   XAF入门02特点. XAF入门03 ...

  2. 【Java每日一题】20161219

    package Dec2016; import java.util.Arrays; public class Ques1219 { public static void main(String[] a ...

  3. js设置、获取单值cookie和多值cookie

    js设置.获取单值cookie和多值cookie,代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值coo ...

  4. python基础之正则表达式

    正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...

  5. 【Java学习系列】第1课--Java环境搭建和demo运行

    本文地址 分享提纲: 1. java环境的搭建 2. java demo代码运行 3.参考文档 本人是PHP开发者,一直感觉Java才是程序的王道(应用广,科班出身),所以终于下决心跟一跟. 主要是给 ...

  6. 【夯实PHP基础系列】linux下yum安装PHP APC

    Alternative PHP Cache(可选PHP缓存),依赖于 PECL扩展库 用源码方式安装,直接yum就行了:首先要安装apc的依赖包:yum install php-pear php-de ...

  7. 15、ASP.NET MVC入门到精通——MVC-路由

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Routing(路由) – URL url 作为广泛使用的Web用户接口,需要被重视 好的Url应该满足如下条件: URL应为获取某种资源提 ...

  8. 前端Demo常用库文件链接

    <!doctype html><html><head> <meta charset="UTF-8"> <title>前端 ...

  9. Windows8.1下安装NoSQL-- mongodb安装使用

    1. 官方下载monodb:http://www.mongodb.org/downloads 现在最新版本3.0 2. 以下载Windows 64-bit为例官方最新版的没有分开, 32位和64位是应 ...

  10. SharePoint 2007 Full Text Searching PowerShell and CS file content with SharePoint Search

    1. Ensure your site or shared folder in one Content Source. 2. Add file types. 3. The second step in ...