mfc鼠标指针变为手型问题

本文介绍如何在Visual Studio 2010中为静态文本添加超链接,并解决鼠标形状在超链接区域显示异常的问题。通过调整鼠标光标的加载方式,确保在静态文本框上能正确显示手形鼠标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在VC的静态文本下,可以通过响应WM_MOUSEMOVE和WM_LBUTTON消息的方法来完成嵌入超链接,这个方法在很多网上的文章都有叙述,在此就不多说了,想看原文的,可以看这里:
http://blog.youkuaiyun.com/wangningyu/archive/2009/08/07/4423442.aspx
但是在Visual Studio 2010下测试时,发现,尽管超链接可以完美的启动,但是每当鼠标进入响应区域时,就会消失不见。
检查了一下每个函数和调用,似乎都没有问题。这是写在CxxxxDlg的鼠标响应函数中的鼠标变化代码,其中CxxxxDlg::m_pRectLink是CRect型的变量,用来存储被设置为超链接的静态文本框的位置和尺寸:
  1. if (point.x > m_pRectLink.left && point.x < m_pRectLink.right && point.y > m_pRectLink.top && point.y < m_pRectLink.bottom )    
  2.      {  
  3.          HCURSOR hCursor;  
  4.          hCursor = AfxGetApp() -> LoadCursor(IDC_HAND);  
  5.          SetCursor(hCursor);  
  6.      }  
复制代码
检查了一下AfxGetApp的MSDN定义:
The pointer returned by this function can be used to access application information such as the main message-dispatch code or the topmost window.

发现AfxGetApp所得到的,其实就是theApp全局变量,是整个程序最低层的部分,AfxWinMain的入口点。而Dlg类则是运行于theApp之上的,所以在theApp中定义的鼠标,就被在上方的Dlg类遮盖了。
解决方法显然也有那么几个,但是这里用个最简单的方法。只需要把代码
  1. hCursor = AfxGetApp() -> LoadCursor(IDC_HAND);
复制代码
替换为
  1. AFX_GLOBAL_DATA agd;
  2. hCursor = agd.GetHandCursor ();
复制代码
即可在静态框上正常显示手状鼠标了。
新手,欢迎吐槽……

更新:AFX_GLOBAL_DATA类(虽然写的是structure)存在于afxglobals.h中,该头文件仅在VS 2010中存在。经过测试,在VS 2008中也存在着使用AfxGetApp()->LoadCursor()无法正常工作的问题。此时,可以直接不考虑使用程序的指针,而直接使用全局成员函数,也就是系统API。即:
  1. hCursor = ::LoadCursor (NULL, IDC_HAND);
  2. //由于不需要理会是否集成窗口句柄,所以第一个参数直接写为NULL
名称:MouseGesture(鼠标势) 版本:1.0.0.2 大小:4904K 语言:简体中文 授权:免费软件 平台:Win8/Win7/Vista/Win2003/WinXP 简介: MouseGesture是一款Window系统辅助工具,可用于方便、快速、高效的管理所有窗口。您可以简单地通过不同势来实现关闭、最小化、最大化、全部最小化、还原窗口、左移窗口和右移窗口的功能。 ------------------------------------------------------------------------------------------------- Introduction ------------------------------------------------------------------------------------------------- Welcome to the MouseGesture readme file. MouseGesture is a free tool that assist you to operate windows more quickly and effectively.With MouseGesture you can close, minimize, maximize, restore, left-move, right-move and minimize-all the windows just with your mouse moving. ------------------------------------------------------------------------------------------------------ What's new in MouseGesture 1.0.0.2 ? ------------------------------------------------------------------------------------------------------ * Optimized algorithms and operate more quickly * More accurate when judging the window * Add two browsers on which MouseGesture disable itself * Support for Windows 8 ------------------------------------------------------------------------------------------------- Features ------------------------------------------------------------------------------------------------- 1. Seven mouse-gesture actions associated with windows (Moving with RButton down) * Close a window (down-right) * minimize a window (down) * minimize all windows (down-left) * maximize a window (up) * restore a window (left-down) * left-move a window (left) * right-move a window (right) 2. Providing a using guide application for freshers 3. Enable you change the theme color as you like 4. Automatic launched with systems 5. Enable you shutdown MouseGesture temporarily if you need 6. Disable MouseGesture dynamically while you are surfing the Internet on web browser with it's own mousegestures. So far, 6 web browsers are in it. That is, Sougou explorer, QQBrowser, TheWorld, Maxthon and Opera.
在Visual C++ 6中创建一个Windows应用程序来显示一个灰色背景、居中文本和播放音乐的窗口,你可以按照以下步骤进行: 1. **创建新项目**: - 打开Visual Studio,选择“文件”->“新建”->“项目”,然后选择“MFC AppWizard (DLL)”或“MFC Win32 Application”。 2. **设计窗口界面**: - 在资源编辑器里,右键点击"资源视图"下的"窗体",选择"添加控件"。添加一个`Static Text`控件,设置其文字为“大家好,这是我的第一个Windows API程序!”并调整其位置到窗口正中央。 3. **设定窗口样式**: - 在`.rc`资源文件或`.cpp`代码中,通过`SetWindowLong()`函数改变窗口风格(例如,`WS_BORDER`去掉边框,`WS_POPUP`去掉最大化、最小化按钮,仅保留标题栏)。具体代码如下: ```cpp SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX); ``` 4. **设置背景颜色**: - 使用`SetBackgroundMode()`函数将背景变为灰色,如: ```cpp HDC hdc = GetDC(hWnd); HBRUSH brush = CreateSolidBrush(RGB(128, 128, 128)); FillRect(hdc, NULL, brush); DeleteObject(brush); ReleaseDC(hWnd, hdc); ``` 5. **加载并播放音乐**: - 使用Windows多媒体API (`MMSystem`) 来加载音乐文件并播放,需要包含头文件`mmsystem.h`。示例代码: ```cpp MMRESULT result; result = PlaySound("music.wav", NULL, SND_FILENAME | SND_ASYNC); ``` 确保音乐文件已经放置在项目的正确路径下。 6. **改变鼠标指针状**: - Windows API并不直接支持改变鼠标指针状,但可以借助第三方库(如GDI+或WinAPI本身的一些技巧),这通常是在窗口捕获鼠标事件后操作鼠标的系统鼠标指针,比较复杂。 7. **运行程序**: - 确保上述所有操作都在`OnInitDialog`等合适的地方完成,然后双击工程图标或者按下F5运行程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值