利用VC5.0捕捉屏幕“热点” 先来看看什么是屏幕"热点",当我们在Windows 95提供的帮助文件或上网浏 览网页时,就指当鼠标移动到屏幕的某一块区域(例如一幅图像或一个按钮)内 时,鼠标指针变成了一只"手",有时还会出现一些提示性的文字。这图像或按 钮所在的区域就是"热点"。笔者用VC5.0在中文WINDOWS95平台上开发了一个 实例程序,本文将通过这个具体实例讨论如何实现屏幕"热点"的捕捉。 如果在窗口中设置鼠标光标,则Windows95会向当前窗口发送WM_SETCURSOR 消息。窗口接受WM_SETCURSOR消息并作相应的处理。在程序中我们通过判断鼠 标当前位置来捕捉"热点"。如果鼠标位于"热点"内,则设置"手"形指针并显示 提示文字。如果鼠标离开了"热点",则将鼠标指针恢复为原来的形状。下面是 具体的实现步骤。 1.生成一个窗体 用VC的AppWizard(应用程序向导)生成一个工程项目Test,在生成过程中, 指定窗体类型为CDialog based(对话框)形式。 2.在项目中增加资源 将位图文件material.bmp和鼠标指针文件Hand.cur用Import(导入)方式增 加到该项目的资源文件中。分别给这两个资源指定ID号为IDB_PIC和IDC_HAND。 3.在窗体中增加控件 在窗体中加入一个Picture(图像)控件。属性设置如下:ID=IDC_PICTURE, TYPE=Bitmap,Image=IDB_PIC。Visible,Group,Tabstop,Notify四项选中。 加入一个Button(按钮)控件。属性设置如下:ID=IDC_BUTTON1,Visible, Tabstop两项选中。 加入一个Static Text(静态文本)控件,属性设置如下:ID=IDC_TEXT, Visible项不选中. 4.增加相应的代码 在VC下的ClassWizard(类向导)中,选择CTestDlg类的WM_SETCURSOR消息 处理入口及其相互对应的成员函数OnSetCursor并作如下修改。 BOOL CTestDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // 在此处加入代码 switch(pWnd->GetDlgCtrlID()) // 得到鼠标所在位置的控件的ID号 { case IDC_PICTURE: // 鼠标位于"热点"1(图像框)区域内 { // 设置鼠标指针为"手"形指针 SetCursor(AfxGetApp()->LoadCursor(IDC_HAND)); // 将提示文字可见 GetDlgItem(IDC_TEXT)->ShowWindow(SW_SHOW); // 显示"This is a picture!"一行字 GetDlgItem(IDC_TEXT)->SetWindowText("This is a picture!"); return TRUE; } break; case IDC_BUTTON1: //鼠标位于"热点"2(按钮)区域内 { SetCursor(AfxGetApp()->LoadCursor(IDC_HAND)); GetDlgItem(IDC_TEXT)->ShowWindow(SW_SHOW); // 显示"This is a button!"一行字 GetDlgItem(IDC_TEXT)->SetWindowText("This is a button!"); return TRUE; } break; default: // 鼠标离开了"热点" { // 将提示性文字隐藏 GetDlgItem(IDC_TEXT)->ShowWindow(SW_HIDE); // 将鼠标指针设置为标准的鼠标指针 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); return TRUE; } } return CDialog::OnSetCursor(pWnd, nHitTest, message); } 5.编译并运行项目。 在Project的Settings项中设置WIN32 RELEASE(发行模式)后编译并 运行该工程。这时,屏幕上出现一个窗体,当鼠标移动到位图或按钮上时 ,鼠标都变成了一只"手"。在底部会分别出现"This is a picture!", "This is a button!"一行字。当鼠标离开这两个"热点"时,鼠标指针 又恢复为原来的形状。