以下示例使用SetCursorPos,GetCursorPos,CreateCursor,LoadCursor和SetCursor功能创建简单的捕鼠器。它还使用光标和定时器功能每10秒监视光标的位置。如果最近10秒内光标位置没有变化,并且应用程序的主窗口最小化,应用程序会更改光标并将其移动到捕鼠器图标。
类似的捕鼠器的例子包括在图标中。它使用LoadCursor和LoadIcon功能,而不是更多依赖于设备的CreateCursor和CreateIcon 功能。
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;
}
}