这里就直接进入正题,讲解如何实现贴图按钮的三态模拟。所谓三态,就是按钮的正常状态,鼠标移上去的高亮状态以及按下状态。实际应该还有一个Disable状态,不过这个程序没有不可用的按钮,因此就不实现这个效果了。由于是贴图,不是实际的按钮,因此必须自己处理鼠标消息并进行三种状态的绘制。首先当然要有一个鼠标位置检测函数HitTest,检测鼠标在哪个按钮上面,由于程序的非客户区仅仅是一个尺寸为2的园角矩形框,标题栏是模拟在客户区实现,因此这个HitTest函数是在WM_MOUSEMOVE消息里调用判断,无非是PtInRect进行各个按钮坐标的检测,因此这个HitTest函数的实现这里就不讲解了,看代码就明白了。如果鼠标在按钮区域,该函数返回按钮ID,在系统按钮区域,返回HTMINBUTTON,HTMAXBUTTON,HTCLOSE,方便直接发送系统命令,不在任何按钮,返回HTCAPTION,可以拖动窗口。 在本篇技术文章中,我们将探讨如何模仿QQ界面,特别是实现贴图按钮的三态模拟。这个过程涉及自定义按钮的绘制和鼠标事件处理,以达到类似QQ界面中按钮的交互效果。 三态模拟指的是按钮的正常状态、鼠标悬浮的高亮状态以及被按下的状态。通常还有禁用状态,但在本例中不考虑。因为这些按钮是通过贴图实现而不是标准控件,所以我们需要手动处理鼠标消息,并针对不同状态进行绘制。 为了检测鼠标位置,我们需要编写一个名为`HitTest`的函数。这个函数在`WM_MOUSEMOVE`消息中被调用,通过`PtInRect`检查鼠标是否位于各按钮的区域内。`HitTest`函数会返回按钮的ID,如果在系统按钮区域,它将返回如`HTMINBUTTON`, `HTMAXBUTTON`, `HTCLOSE`等值,方便直接发送系统命令。如果不在任何按钮上,返回`HTCAPTION`,允许用户拖动窗口。 当`HitTest`返回按钮ID且鼠标未按下时,应绘制按钮的高亮状态。为了避免因不断绘制导致的鼠标闪烁,我们需要一个成员变量`m_nCurWhere`来存储上一次`HitTest`的结果。只有当鼠标位置变化时,我们才需要更新按钮的状态: ```cpp int nWhere = HitTest(...); if (nWhere != m_nCurWhere) { // 绘制高亮或恢复原状 if (nWhere != HTCAPTION) CheckAndDrawButtons(nWhere, 4); // 绘制 nWhere 按钮的高亮状态 else CheckAndDrawButtons(m_nCurWhere, 0); // 恢复高亮按钮的原始状态 } m_nCurWhere = nWhere; ``` 对于按钮按下状态的处理,我们需在`WM_LBUTTONDOWN`消息中进行。通过`HitTest`确定按下的是哪个按钮,然后设置相应的按下状态。同时,我们需要一个`m_bInCapture`变量来追踪鼠标是否已被捕获。在`WM_LBUTTONDOWN`中设置`m_bInCapture`为`TRUE`,并使用`SetCapture`捕获鼠标;在`WM_LBUTTONUP`中释放鼠标并设置`m_bInCapture`为`FALSE`。这样,`WM_MOUSEMOVE`中的按钮绘制函数可以根据`m_bInCapture`判断应绘制按下状态还是高亮状态。在`WM_LBUTTONUP`中,只有当`m_bInCapture`为`TRUE`且`m_nCurSysCmd`与`HitTest`结果相同,才执行对应按钮的功能,防止意外触发。 在`WM_MOUSEMOVE`处理中,我们需要添加对按钮按下状态的判断: ```cpp RINGMAINMSG(WM_MOUSEMOVE) { int nWhere = HitTest(param); if (m_bInCapture) { // 鼠标键按下状态的移动 if (m_nCurSysCmd == nWhere && m_nCurWhere != nWhere) { // 鼠标从按钮外移入按钮,绘制按下状态按钮 CheckAndDrawButtons(nWhere, 8); } // 其他按下状态的处理... } // ... } ``` QQ2009的一个细节是,当按下按钮后不松开鼠标移动出按钮范围时,按钮状态不会改变。但这种行为在实现中是可以根据需求调整的。 总结来说,模仿QQ界面的贴图按钮三态模拟需要实现自定义的鼠标检测和状态管理。这涉及到对`HitTest`函数的使用,以及在`WM_MOUSEMOVE`和`WM_LBUTTONDOWN`消息中对按钮状态的处理。通过这样的自定义处理,我们可以创建出与QQ界面类似的交互体验,让用户感觉更自然和熟悉。
- 无名人士的小白2012-12-10这个东西到处都有下载 哈哈 还是挺棒的 谢谢分享
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助