转换为屏幕坐标的函数:
BOOL ScreenToClient( LPPOINT lpPoint窗口点坐标 ) //窗口坐标转换为屏幕坐标
3.显示与隐藏鼠标光标的函数
Int ShowCursor(BOOL true或flase); //隐藏及显示鼠标光标
其中,true代表显示光标,false代表隐藏光标。
4.限制鼠标光标移动区域的函数
Windows API中提供的ClipCursor()函数可以用来设置限制鼠标光标的移动区域和解除鼠标光标移动区域的限制。
BOOL ClipCursor(CONST RECT 移动区域矩形); //限制鼠标光标移动区域
BOOL ClipCursor(NOOL); //解除限制
这里有一个RECT移动区域矩形,我们在MSDN中找出它的声明:
[cpp]
typedef struct tagRECT {
LONG left; //矩形区域右上点X坐
LONG top; //矩形区域右上点Y坐标
LONG right; //矩形区域左上点X坐标
LONG bottom; //矩形区域左上点Y坐标
} RECT;
typedef struct tagRECT {
LONG left; //矩形区域右上点X坐
LONG top; //矩形区域右上点Y坐标
LONG right; //矩形区域左上点X坐标
LONG bottom; //矩形区域左上点Y坐标
} RECT;
5.取得窗口外部区域及内部区域的API函数
我们还需知道取得窗口外部区域及内部区域的API函数。
BOOL GetWindowRect(HWND hWND,LPRECT 矩形结构);//取得窗口外部区域矩形
BOOL GetClientRect(HWND hWnd,LPRECT 矩形结构体); //取得窗口内部区域矩形
这里需要注意的是,GetWindowRect()返回的坐标类型是屏幕坐标。
GetClientRect()返回的坐标类型是窗口坐标。
由于限制鼠标光标移动区域的ClipCursor()函数中输入的矩形区域必须是屏幕坐标,因此如果取得的是窗口内部区域,那么还必须将窗口坐标转换为屏幕坐标的操作,下面我们以一段程序代码来说明将鼠标光标限制在窗口内部区域移动的过程:
[cpp]
RECT rect;
POINT lt,rb;
GetClientRect(hWnd,&rect); //取得窗口内部矩形
//将矩形左上点坐标存入lt中
lt.x = rect.left;
lt.y = rect.top;
//将矩形右下坐标存入rb中
rb.x = rect.right;
rb.y = rect.bottom;
//将lt和rb的窗口坐标转换为屏幕坐标
ClientToScreen(hWnd,<);
ClientToScreen(hWnd,&rb);
//以屏幕坐标重新设定矩形区域
rect.left = lt.x;
rect.top = lt.y;
rect.right = rb.x;
rect.bottom = rb.y;
//限制鼠标光标移动区域
ClipCursor(&rect);
RECT rect;
POINT lt,rb;
GetClientRect(hWnd,&rect); //取得窗口内部矩形
//将矩形左上点坐标存入lt中
lt.x = rect.left;
lt.y = rect.top;
//将矩形右下坐标存入rb中
rb.x = rect.right;
rb.y = rect.bottom;
//将lt和rb的窗口坐标转换为屏幕坐标
ClientToScreen(hWnd,<);
ClientToScreen(hWnd,&rb);
//以屏幕坐标重新设定矩形区域
rect.left = lt.x;
rect.top = lt.y;
rect.right = rb.x;
rect.bottom = rb.y;
//限制鼠标光标移动区域
ClipCursor(&rect);
三,在实例中融会贯通
讲了这么多的windows API函数了,也早该到了我们的showtime了,依然,我们通过一个实例来把本节所讲的内容融会贯通。
这个实例处理鼠标移动消息使飞机在窗口中移动,并且处理单击鼠标左键消息来让飞机发射子弹,而且设定了鼠标光标的位置,隐藏了鼠标光标,还有限制了鼠标光标移动的区域。(背景贴图采用循环背景滚动,其实很简单,就是每次都把窗口右边多余的部分再贴到窗口坐标来,以后有机会我会作为一节笔记具体讲)
同样的,我们贴出详细注释好的代码:
[cpp]
#include "stdafx.h"
#include
//定义结构体
struct BULLET //bullet结构体代表飞机子弹
{
int x,y; //子弹坐标
bool exist; //子弹是否存在
};
//全局变量声明
HINSTANCE hInst;
HBITMAP bg,ship,bullet; //存储背景图,飞机图,子弹图
HDC hdc,mdc,bufdc;
HWND hWnd;
DWORD tPre,tNow;
int x,y,nowX,nowY; //x,y代表鼠标光标所在位置,nowX,nowY代表飞机坐标,也是贴图的位置
int w=0,bcount; //w为滚动背景所要裁剪的区域宽度,bcount记录飞机现有子弹数目
BULLET b[30]; //声明一个“bullet”类型的数组,用来存储飞机发出的子弹
//全局函数声明
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
//****WinMain函数,程序入口点函数**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
//初始化
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
//消息循环
GetMessage(&msg,NULL,NULL,NULL);