【发布时间】:2021-08-03 16:18:49
【问题描述】:
我创建了一个 Windows 应用程序。我创建的元素使用子类化,因为我想处理鼠标悬停事件。
DWORD dwStyleOfIcons = SS_BITMAP | SS_NOTIFY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER;
img1 = CreateWindow(L"STATIC", NULL, dwStyleOfIcons,
posX, posY, imgWt, imgHt,
hWnd, (HMENU)ICON1_CLICKED, hInst, NULL);
SetWindowSubclass(img1, StaticSubClassWndProc, ICON1_CLICKED, 0);
在我的StaticSubClassWndProc() 中,我处理WM_MOUSEMOVE、WM_MOUSELEAVE 和WM_MOUSEHOVER:
LRESULT CALLBACK StaticSubClassWndProc (HWND hwndsubclass, UINT msg, WPARAM wp, LPARAM lp, UINT_PTR uidsubclass , DWORD_PTR dwrefdata)
{
...
switch(Msg)
{
case WM_MOUSEHOVER: {
if(uidsubclass == ICON1_CLICKED){
texture = "texture2.bmp";
modifyImage(texture);
}
break;
}
case WM_MOUSELEAVE: {
if(uidsubclass == ICON1_CLICKED){
texture = "texture.bmp";
modifyImage(texture);
}
break;
}
我的应用程序中有许多 STATIC 项目,我想要的只是弹出上下文菜单的行为,例如当我将鼠标悬停在图像上时,它会变为选定的图像,而当光标不在视图中时图像恢复正常。我能够做到这一点。
我可以对充当图标的图像执行此操作,但如何为静态文本控件执行此操作?本质上,在弹出菜单中,选定的文本都被突出显示:
没有更简单的方法可以让我在这个窗口中的元素表现得像一个弹出菜单吗?我想要的只是弹出菜单行为的这种自定义结构。
【问题讨论】:
-
您是否在问如何为
STATIC控件指定颜色?让 parent 窗口的 WndProc 处理WM_CTLCOLORSTATIC消息。 -
我打算在鼠标悬停时更改窗口的颜色,并在文本静态控件中留下事件。我该怎么做?
-
如前所述,您需要让父窗口处理
WM_CTLCOLORSTATIC消息。声明一个颜色变量,并在收到WM_CTLCOLORSTATIC时应用它。在鼠标事件中,更新变量和InvalidateRect()STATIC控件以触发重绘,这将发送一条新消息。
标签: c++ visual-studio winapi