自定义鼠标.docx

上传人:b****5 文档编号:6905397 上传时间:2023-01-12 格式:DOCX 页数:7 大小:18.23KB
下载 相关 举报
自定义鼠标.docx_第1页
第1页 / 共7页
自定义鼠标.docx_第2页
第2页 / 共7页
自定义鼠标.docx_第3页
第3页 / 共7页
自定义鼠标.docx_第4页
第4页 / 共7页
自定义鼠标.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

自定义鼠标.docx

《自定义鼠标.docx》由会员分享,可在线阅读,更多相关《自定义鼠标.docx(7页珍藏版)》请在冰豆网上搜索。

自定义鼠标.docx

自定义鼠标

自定义鼠标

首先通过插入->资源->引入插入相应的图标

然后在视类中自定义一个成员变量HCURSORm_cursor;

如果是加载系统图标则使用下面的方法即可:

m_cursor=LoadCursor(NULL,IDC_CROSS);//加载系统自定义的十字架形状的鼠标

如果是加载自定义的鼠标,则可以使用下面三种方法(第一个参数必须为当前应用程序的实例句柄,第二个参数必须是图标资源名称或者图标资源字符串):

m_cursor=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

m_cursor=LoadCursor(theApp.m_hInstanceMAKEINTRESOURCE(IDI_ICON1));

注意:

在一个文件中想要使用另外一个文件中定义的全局变量时,必须在使用之前声明这个变量时外部定义的,

externCTestAPPtheApp;//此处只是外部声明,而非定义,切记

m_cursor=LoadCursor(AfXGetAPP()->m_hInstance,MAKEINTRESOURCEIDI_ICON1));

MAKEINTRESOURCE的作用:

是把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内容和长度是不变的!

它只不过就是C语言里面"强制类型转换"而已.

如果我们是要在整个应用程序运行期间鼠标形状都是我们自定义的,则我们既可以在窗口创建前,也可以在窗口创建后进行修改.

1.在窗口创建前修改:

由于鼠标是在视图类上显示的,所以在视图类的PreCreateWindow函数中利用AfxRegisterWndClass进行修改,其返回值是所对应的窗口类的名称。

cs.lpszclass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,m_cursor,0,0);

2.在窗口创建后修改:

在OnCreate函数中利用SetClassLong函数进行修改

SetClassLong(m_hwnd,GCL_CURSOR,(long)m_cursor);

如果我们并不想鼠标在整个程序运行过程当中都是我们定义的形状,则我们可以在消息响应的时候才设置鼠标的形状,比如我们在鼠标在窗口客户区移动的时候将鼠标设置为自定义形状,则我们可以在OnMouseMove当中加入如下代码:

:

:

SetCurSor(m_cursor);

首先要添加鼠标光标(Cursor)文件(*.cur)到工程中,然后需要为应用程序添加WM_SETCURSOR消息

用:

:

SetCursor(AfxGetApp()->LoadCursor(图标ID));函数设置就可以了,该函数可以在任意处使用,这就意味着你可以随时改变鼠标的光标修改应用程序的图标首先要添加图标文件(*.ico)到工程中,然后把应用程序原有的窗口图标文件删除,将新加的图标文件的ID修改成程序原有图标的ID就可以了。

或者在窗口类或视图类的构造函数中加入如下代码:

m_hIcon=AfxGetApp()->LoadIcon(要加入的图标的ID);以下是动态修改鼠标光标的示例代码:

BOOLCXcDlg:

:

OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CPointpos;

:

:

GetCursorPos(&pos);

ScreenToClient(&pos);

if((pos.x>250&&pos.x<290)&&(pos.y>150&&pos.y<190))//当鼠标处在某一区域内时修改鼠标光标

{

:

:

SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));

returntrue;

}

/*else

{

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

returntrue;

}*/

returnCDialog:

:

OnSetCursor(pWnd,nHitTest,message);

}

 

VC鼠标设置

 

消息下:

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));

或是:

HCURSORhc;

hc=LoadCursor(NULL,IDC_CROSS);

SetCursor(hc);

IDC_APPSTARTING带小沙漏的标准箭头

IDC_ARROW标准箭头

IDC_CROSS十字光标

IDC_HANDwindows2000:

手型

IDC_HELP带问号的箭头

IDC_IBEAMi型标

IDC_ICONobsoleteforapplicationsmarkedversion4.0orlater.

IDC_NO禁止符号

IDC_SIZEobsoleteforapplicationsmarkedversion4.0orlater.useidc_sizeall.

IDC_SIZEALL十字箭头

IDC_SIZENESW指向东北和西南的双向箭头

IDC_SIZENS指向南和北的双向箭头

IDC_SIZENWSE指向西北和东南的双向箭头

IDC_SIZEWE指向东西的双向箭头

IDC_UPARROW上箭头

IDC_WAIT沙漏

 

当我们要自己选择一个图标的时候按照以下几个步骤:

1、定义一个成员变量:

HCURSORm_cursor;

m_cursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);

也可以

m_cursor=LoadCursorFromFile(".\\res\\123.cur");

2、重载OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)函数,

3、在函数里面写入:

:

:

SetCursor(m_cursor);

OK,我们自定义的鼠标完成;

当然我们也可以用ani格式的动态鼠标形状,可以使程序更帅;

和载入.cur一样:

例如;

m_cursor=LoadCursorFromFile(".\\res\\123.ani");

-----------------------------------------------------------------------------------------------------------

当然也可以先把文件加载进来直接导入:

按照以下步骤:

1、先把ani文件导入;

2、随便保存成什么名字;然后在程序的.rc文件下,把对应的代码修改成以下代码:

IDR_FLYANICURSORDISCARDABLE"fly.ani"

或者

IDR_FLYCURSORDISCARDABLE"fly.ani"

不然有的时候可能出现错误,我现在也没有搞清楚是什么问题;

或者直接在.rc文件下添加代码:

IDR_FLYANICURSORDISCARDABLE"fly.ani"

或者

IDR_FLYCURSORDISCARDABLE"fly.ani"

就不用第一步骤了;然后

m_cursor=AfxGetApp()->LoadCursor("IDR_FLY");

这样就可以实现了;

ani格式我们可以通过一些动画或gif格式转换过来;

下面一些理论的东西可能对我们也有用,是转自其他人的博客的内容:

转粘(vckbase):

windows编程中有两种方法改变指针:

一种是当应用的主窗口类注册时,为wndclass结构提供一个全程光标指针,另外一种方法是在程序中处理wm_setcursor消息来设置鼠标光标。

标准的mfc应用程序使用第一种方法自动在主窗口注册时将光标指针设置为一个箭头。

如果要改变光标指针,则可以通过在主窗口或子窗口中重载消息wm_setcursor的处理函数来重新设置鼠标指针。

//handlewm_setcursorinbuttonclass

boolcmybutton:

:

onsetcursor(cwnd*pwnd,uintnhittest,uintmsg)

{

:

:

setcursor(m_hmycursor);

returntrue;

}当用户将鼠标指针移到按钮上时,鼠标不被捕获,windows发送一个wm_setcursor消息到按钮。

从上面onsetcursor的代码中可以看到,它传递一个参数是窗口句柄-即鼠标指针所指的窗口,这里指的是按钮本身;onsetcursor传递的第二个参数是nhittest,这是一个鼠标点击测试代码,它以htxxx开头,用于wm_nchittest消息;onsetcursor传递的第三个参数是触发事件的鼠标消息的消息id-例如,wm_mousemove。

wm_setcursor是专门用来设置鼠标指针的消息,当设置了鼠标指针以后,应该让它返回true以防止windows再作缺省处理。

wm_setcursor的处理机制是这样的,如果有父窗口的话,缺省的窗口过程首先发送wm_setcursor消息到父窗口,如果父窗口处理wm_setcursor消息,则windows不再作任何多余的事情,处理完消息便结束。

如果父窗口不处理wm_setcursor消息,windows让子窗口来处理wm_setcursor,如果子窗口也不做任何处理,windows使用全程光标指针,如果没有全程光标指针,则使用箭头指针。

如果你在程序中要是使用动态光标指针,你必须决定是在子窗口处理wm_setcursor消息还是在父窗口中处理wm_setcursor消息。

两种方法各有利弊,根据具体情况而定。

一般总是让对象决定它们自己的行为属性-也就是说最好在子窗口中做处理。

本文中的子窗口即按钮。

这就要派生一个新的按钮类,新的按钮类有自己的消息映射及其消息处理过程。

可以使用类向导来产生新的按钮类,但那样要做的事情太多。

如果你已经有自己的按钮类,那当然是在自己的按钮类中处理wm_setcursor消息。

如果没有自己的按钮类而又想偷懒的话,那就在对话框中处理wm_setcursor消息得啦,只是不要向面向对象专家说是我告诉你这么做的。

今天按书写了一小段程序,此程序是用来检测鼠标是否在某区域,当鼠标指向按钮时,鼠标做相应的变化。

书上原来的程序是这样的:

BOOLCTestDlg:

:

OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

CStringStrHotInfo;

switch(pWnd->GetDlgCtrlID())

{

caseIDOK:

SetCursor(AfxGetApp()->LoadCursor(IDC_CROSS));

StrHotInfo="当前热区为OK按钮";

break;

caseIDCANCEL:

SetCursor(AfxGetApp()->LoadCursor(IDC_CROSS));

StrHotInfo="当前热区为cancel按钮";

break;

default:

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

break;

}

this->SetWindowTextW(StrHotInfo);

returntrue;}

启动执行,当鼠标指向“OK"或"Cancel"时,鼠标消失了。

不知道什么原因,通过查阅资料,将程序更改为:

BOOLCTestDlg:

:

OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

CStringStrHotInfo;

switch(pWnd->GetDlgCtrlID())

{

caseIDOK:

SetCursor(LoadCursor(NULL,IDC_CROSS));///注意加入头文件“winuser.h”

StrHotInfo="当前热区为OK按钮";

break;

caseIDCANCEL:

SetCursor(LoadCursor(NULL,IDC_CROSS));

StrHotInfo="当前热区为cancel按钮";

break;

default:

SetCursor(LoadCursor(NULL,IDC_APPSTARTING));

break;

}

this->SetWindowTextW(StrHotInfo);

returntrue;

}

此时,程序能完成预想的任务,关键要注意加入头文件“winuser.h”。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1