Windows API:为什么buttonhover效果在一段时间后卡住了?

Windows API:为什么buttonhover效果在一段时间后卡住了?,第1张

概述Windows API:为什么buttonhover效果在一段时间后卡住了?

最近开始使用windows API开发,我决定有一些交互性。 所以计划是使用Owner Drawnbutton,当鼠标进入矩形区域时会改变背景颜色,当鼠标离开时会变回原来的颜色。

我做了3个这样的button,并用他们自己的自定义窗口过程对它们进行了分类。 现在因为没有WM_MOUSEENTER消息,所以我使用了WM_MOUSEMOVE和一些鼠标跟踪来填充窗口。 这基本上意味着每当光标在窗口内移动时,矩形就会被填充。

当鼠标指针移动到button的矩形外时,我也使用WM_MOUSELEAVE来填充button。

而这似乎开始工作很好,但一段时间后,矩形填充将停止,背景将卡住hover颜色或默认颜色。

更改保存button上的默认文本

TB_SETpadding消息对垂直填充没有影响

如何检索标准button的本地化文本/标题?

windows.form c#在窗体之间移动

点击后禁用button

这是代码

#ifndef UWMENU_H_INCLUDED #define UWMENU_H_INCLUDED #endif // UWMENU_H_INCLUDED #include <iostream> using namespace std; LRESulT CALLBACK DBWndProc(HWND,UINT,WParaM,LParaM); WNDPROC DBWndProcold[3]; class UWMenu{ public: //WINDOW PROCEDURE FOR NEWS button static LRESulT CALLBACK DBWndProc(HWND hwnd,UINT msg,WParaM wParam,LParaM lParam){ HBrush BG_btnOne = CreateSolIDBrush(NAV_BTN_DEF_CLR); HBrush BG_btnOneOver = CreateSolIDBrush(NAV_BTN_OVER_CLR); int btnID = GetDlgCtrlID(hwnd); cout << btnID << "n"; switch(msg){ case WM_MOUSEMOVE:{ cout << "Mouse is hovering over buttonn"; SetCursor(LoadCursor(NulL,IDC_HAND)); HDC hdc = GetDC(hwnd); RECT rc; rc.left = 0; //top left X coordinate of button's rectangular area rc.top = 0; //top left Y coordinate of button's rectangular area rc.right = NAV_BTN_WIDTH; //Bottom right X coordinate of button's rectangular area rc.bottom = NAV_BTN_HEIGHT; //Bottom right Y coordinate of button's rectangular area printf("Repainting button background colorn"); FillRect(hdc,&rc,BG_btnOneOver); SetTextcolor(hdc,RGB(255,255,255)); SetBkMode(hdc,transparent); if(btnID == NBID_NEWS){DrawText(hdc,TXT_BN_NEWS,-1,DT_SINGLEliNE | DT_CENTER | DT_VCENTER);} if(btnID == NBID_TOolS){DrawText(hdc,TXT_BN_TOolS,DT_SINGLEliNE | DT_CENTER | DT_VCENTER);} if(btnID == NBID_EDITOR){DrawText(hdc,TXT_BN_EDITORS,DT_SINGLEliNE | DT_CENTER | DT_VCENTER);} ReleaseDC(hwnd,hdc); TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.DWFlags = TME_LEAVE; tme.hwndTrack = hwnd; tme.DWHoverTime = HOVER_DEFAulT; TrackMouseEvent(&tme); } break; case WM_MOUSELEAVE:{ printf("You left men"); SetCursor(LoadCursor(NulL,IDC_ARROW)); HDC hdc = GetDC(hwnd); RECT rc; rc.left = 0; //top left X coordinate of button's rectangular area rc.top = 0; //top left Y coordinate of button's rectangular area rc.right = NAV_BTN_WIDTH; //Bottom right X coordinate of button's rectangular area rc.bottom = NAV_BTN_HEIGHT; //Bottom right Y coordinate of button's rectangular area FillRect(hdc,BG_btnOne); SetTextcolor(hdc,hdc); TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.DWFlags = TME_CANCEL; tme.hwndTrack = hwnd; tme.DWHoverTime = HOVER_DEFAulT; TrackMouseEvent(&tme); } break; } return CallWindowProc(DBWndProcold[btnID-200],hwnd,msg,wParam,lParam); } };

mouse_move消息正在作为printf()的输出进行处理,当鼠标移动到button上时, cout以deBUGging模式显示。

有没有什么办法解决这一问题? 可能跟鼠标跟踪有什么关系?

我认为问题是这个button有点像FillRect()而指针在矩形里面。

任何帮助表示赞赏。

为什么我的窗口中的button在C ++中看起来很旧?

为什么我的button看起来像是从1990年开始的?

禁用某些button取决于哪个用户已经login

windowsbatch file启动buttongui

如何破解搅拌机帮助button?

这个问题现在已经解决了。 这是由于GDI泄漏。 通过删除在父窗口过程中重复创建的画笔解决了问题。

总结

以上是内存溢出为你收集整理的Windows API:为什么buttonhover效果在一段时间后卡住了?全部内容,希望文章能够帮你解决Windows API:为什么buttonhover效果在一段时间后卡住了?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存