使用光标功能创建捕鼠器

【勇芳软件工作室】汉化HomePreviousNext

以下示例使用SetCursorPosGetCursorPosCreateCursorLoadCursorSetCursor功能创建简单的捕鼠器。它还使用光标和定时器功能每10秒监视光标的位置。如果最近10秒内光标位置没有变化,并且应用程序的主窗口最小化,应用程序会更改光标并将其移动到捕鼠器图标。

类似的捕鼠器的例子包括在图标中。它使用LoadCursorLoadIcon功能,而不是更多依赖于设备的CreateCursorCreateIcon 功能。

HICON hIcon1; //图标句柄

POINT ptOld; //上一个光标位置

HCURSOR hCurs1; //光标句柄

//以下光标位掩码在代码中定义

//本主题前面出现的示例。

//阴光标AND和XOR位掩码

BYTE ANDmaskCursor[] = ...

BYTE XORmaskCursor[] = ...

//杨图标和位掩码

BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, //行1

0xFF, 0xFF, 0xC3, 0xFF, //行2

0xFF, 0xFF, 0x00, 0xFF, //行3

0xFF, 0xFE, 0x00, 0x7F, //行4

0xFF, 0xFC, 0x00, 0x1F, //行5

0xFF, 0xF8, 0x00, 0x0F, //第6行

0xFF, 0xF8, 0x00, 0x0F, //第7行

0xFF, 0xF0, 0x00, 0x07, //行8

0xFF, 0xF0, 0x00, 0x03, //第9行

0xFF, 0xE0, 0x00, 0x03, //行10

0xFF, 0xE0, 0x00, 0x01, //第11行

0xFF, 0xE0, 0x00, 0x01, // line 12

0xFF, 0xF0, 0x00, 0x01, //第13行

0xFF, 0xF0, 0x00, 0x00, //第14行

0xFF, 0xF8, 0x00, 0x00, //第15行

0xFF, 0xFC, 0x00, 0x00, // line 16

0xFF, 0xFF, 0x00, 0x00, //第17行

0xFF, 0xFF, 0x80, 0x00, // 18行

0xFF, 0xFF, 0xE0, 0x00, //行19

0xFF, 0xFF, 0xE0, 0x01, //行20

0xFF, 0xFF, 0xF0, 0x01, // line 21

0xFF, 0xFF, 0xF0, 0x01, // line 22

0xFF, 0xFF, 0xF0, 0x03, // line 23

0xFF, 0xFF, 0xE0, 0x03, // line 24

0xFF, 0xFF, 0xE0, 0x07, //行25

0xFF, 0xFF, 0xC0, 0x0F, //行26

0xFF, 0xFF, 0xC0, 0x0F, //行27

0xFF, 0xFF, 0x80, 0x1F, // line 28

0xFF, 0xFF, 0x00, 0x7F, // line 29

0xFF, 0xFC, 0x00, 0xFF, //行30

0xFF, 0xF8, 0x03, 0xFF, //行31

0xFF, 0xFC, 0x3F, 0xFF}; // line 32

//杨图标XOR位掩码

BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, //行1

0x00, 0x00, 0x00, 0x00, //行2

0x00, 0x00, 0x00, 0x00, //行3

0x00, 0x00, 0x00, 0x00, //行4

0x00, 0x00, 0x00, 0x00, //行5

0x00, 0x00, 0x00, 0x00, //第6行

0x00, 0x00, 0x00, 0x00, //第7行

0x00, 0x00, 0x38, 0x00, //行8

0x00, 0x00, 0x7C, 0x00, //第9行

0x00, 0x00, 0x7C, 0x00, //行10

0x00, 0x00, 0x7C, 0x00, //第11行

0x00, 0x00, 0x38, 0x00, // line 12

0x00, 0x00, 0x00, 0x00, //第13行

0x00, 0x00, 0x00, 0x00, //第14行

0x00, 0x00, 0x00, 0x00, //第15行

0x00, 0x00, 0x00, 0x00, // line 16

0x00, 0x00, 0x00, 0x00, //第17行

0x00, 0x00, 0x00, 0x00, // 18行

0x00, 0x00, 0x00, 0x00, //行19

0x00, 0x00, 0x00, 0x00, //行20

0x00, 0x00, 0x00, 0x00, // line 21

0x00, 0x00, 0x00, 0x00, // line 22

0x00, 0x00, 0x00, 0x00, // line 23

0x00, 0x00, 0x00, 0x00, // line 24

0x00, 0x00, 0x00, 0x00, //行25

0x00, 0x00, 0x00, 0x00, //行26

0x00, 0x00, 0x00, 0x00, //行27

0x00, 0x00, 0x00, 0x00, // line 28

0x00, 0x00, 0x00, 0x00, // line 29

0x00, 0x00, 0x00, 0x00, //行30

0x00, 0x00, 0x00, 0x00, //行31

0x00, 0x00, 0x00, 0x00}; // line 32

hIcon1 = CreateIcon(hinst, //应用程序实例的句柄

32, //图标宽度

32, //图标高度

1, // XOR平面的数量

1, //每像素的位数

ANDmaskIcon, // AND bitmask

XORmaskIcon); // XOR位掩码

hCurs1 = CreateCursor(hinst, //应用程序实例的句柄

19, //热点水平位置

2, //热点的垂直位置

32, //光标宽度

32, //光标高度

ANDmaskCursor, // AND bitmask

XORmaskCursor); // XOR位掩码

//填写窗口类结构。

WNDCLASS wc;

wc.hIcon = hIcon1; //类图标

wc.hCursor = LoadCursor(NULL, IDC_ARROW); //类游标

//

//注册窗口类并执行

//其他应用程序初始化。

//

//设置捕鼠器的计时器。

GetCursorPos(&ptOld);

SetTimer(hwnd, IDT_CURSOR, 10000, (TIMERPROC) NULL);

龙APIENTRY MainWndProc(

HWND hwnd, //窗口句柄

UINT message, //消息类型

UINT wParam, // 附加信息

LONG lParam) // 附加信息

{

HDC hdc; //设备上下文的句柄

POINT pt; //当前光标位置

RECT rc; //图标化的窗口位置

开关(讯息)

{

//

//处理其他消息。

//

case WM_TIMER:

//如果窗口最小化,请比较

//当前光标位置与一个10

//秒前。如果光标位置有

//未更改,将光标移动到图标。

if(IsIconic(hwnd))

{

GetCursorPos(&pt);

if ((pt.x == ptOld.x) && (pt.y == ptOld.y))

{

GetWindowRect(hwnd, &rc);

SetCursorPos(rc.left + 20, rc.top + 4);

//请注意附加的常量

//(20和4)是应用程序特定的

//对齐阴影光标的值

//和阳形图标。

}

其他

{

ptOld.x = pt.x;

ptOld.y = pt.y;

}

}

return 0;

case WM_SETCURSOR:

//如果窗口最小化,绘制hC??urs1。

//如果窗口没有最小化,绘制

//默认游标(类光标)。

if(IsIconic(hwnd))

{

SetCursor(hCurs1);

break;

}

case WM_DESTROY:

//销毁计时器

KillTimer(hwnd, IDT_CURSOR);

PostQuitMessage(0);

break;

}

}