- 2
- 0
- 约4.54千字
- 约 5页
- 2017-05-13 发布于北京
- 举报
循序渐进实现仿QQ界面〔二〕:贴图按钮的三态模拟
循序渐进实现仿QQ界面(二):贴图按钮的三态模拟
2010-01-25 11:10
/u09cbc7-4f36-ba84-377f34188fb6.html?60391
上一篇的地址:/u10/ebe0aae8-0148-417b-ba80-ef1119f0c6a4.html?24099 演示程序需要RingSDK库,编译有问题的请看本文的原始链接:/ringphone/archive/2010/01/10/5171490.aspx,这里就直接进入正题,讲解如何实现贴图按钮的三态模拟。所谓三态,就是按钮的正常状态,鼠标移上去的高亮状态以及按下状态。实际应该还有一个Disable状态,不过这个程序没有不可用的按钮,因此就不实现这个效果了。由于是贴图,不是实际的按钮,因此必须自己处理鼠标消息并进行三种状态的绘制。首先当然要有一个鼠标位置检测函数HitTest,检测鼠标在哪个按钮上面,由于程序的非客户区仅仅是一个尺寸为2的园角矩形框,标题栏是模拟在客户区实现,因此这个HitTest函数是在WM_MOUSEMOVE消息里调用判断,无非是PtInRect进行各个按钮坐标的检测,因此这个HitTest函数的实现这里就不讲解了,看代码就明白了。如果鼠标在按钮区域,该函数返回按钮ID,在系统按钮区域,返回HTMINBUTTON,HTMAXBUTTON,HTCLOSE,方便直接发送系统命令,不在任何按钮,返回HTCAPTION,可以拖动窗口。 如果HitTest返回了按钮ID,用户没按下鼠标,应该绘制按钮的高亮状态。这里有个问题,绘制完了以后,用户继续移动鼠标,但是没移出这个按钮,WM_MOUSEMOVE消息又会检测到需要绘制高亮状态,这样不断绘制就会造成鼠标闪烁,因此需要定义一个m_nCurWhere的成员变量,记录鼠标上一次的HitTest检测值:
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_nCurSysCmd,标记当前是按下了哪个按钮,然后绘制按钮的按下状态。由于用户可能按下了按钮,不松开鼠标进行移动,因此还需要定义一个成员变量m_bInCapture,在WM_LBUTTONDOWN消息里置这个变量为TRUE,SetCapture捕获鼠标,在WM_LBUTTONUP消息里ReleaseCapture释放鼠标,置这个变量为FALSE,这样在WM_MOUSEMOVE里调用的按钮绘制函数就可以根据m_bInCapture判断是该绘制按下状态还是高亮状态。WM_LBUTTONUP消息也可以根据这个标志判断是否该执行按钮动作,否则在别的地方按下鼠标键,移到一个按钮上松开鼠标,执行该按钮功能有点不大对头,应该判断m_bInCapture为TRUE且m_nCurSysCmd与HitTest检测到的按钮相等才执行该按钮的功能。鼠标键按下时的移动,只会对m_nCurSysCmd标记的按钮进行按下状态和正常状态的绘制,其余按钮一概不理。发现QQ2009在这方面没有实现,按下按钮后不松开鼠标键移出按钮,按钮状态不会变化。 按此机制,WM_MOUSEMOVE里的判断应该修改一下了,增加对按钮按下状态的判断:
RINGMAINMSG(WM_MOUSEMOVE)?? {?? int nWhere = HitTest(param);?? ??? if(m_bInCapture)?? {?? //鼠标键按下状态的移动?? if(m_nCurSysCmd == nWhere m_nCurWhere != nWhere)?? {?? ?? //鼠标从按钮外移入按钮,绘制按下状态按钮?? ?? CheckAndDrawButtons(nWhere,8);?? }?? else if(m_nCurSysCmd != nWhere m_nCurSysCmd == m_nCurWhere)?? {?? ?? //鼠标移出按钮,绘制正常状态?? Check
您可能关注的文档
- 平面向量概念与线性运算〔学生版〕.doc
- 平面向量概念–基本定理.doc
- 平面向量数量积的坐标表示、模、夹角〔公开课教学设计〕.doc
- 平面向量的分解〔二〕.doc
- 平面向量概念〔模块〕.doc
- 平面向量的基本定理及其坐标表示第2课时.doc
- 平面向量的坐标表示和线性运算的坐标表示.doc
- 平面向量的基本定理和坐标表示导学案.doc
- 平面向量基概念和坐标运算.doc
- 平面向量的基本定理和坐标表示导学案2.doc
- 广东省广州省实验中学教育集团2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州大学附属中学2025-2026学年八年级上学期奥班期中物理试题(解析版).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(含答案).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(解析版).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 2026《中国人寿上海分公司营销员培训体系优化研究》18000字.docx
- 《生物探究性实验教学》中小学教师资格模拟试题.docx
原创力文档

文档评论(0)