杀死焦点不是杀死焦点

时间:2010-06-25 05:17:40

标签: c++ c user-interface winapi

这就是我正在做的事情。我创建了一个组合框,但我没有使用它。单击它时,它会调用trackpopup并显示上下文菜单。然而,在我点击上下文菜单之后,我希望它能够像你点击任何地方(杀死焦点)或从组合框中选择一个项目一样关闭组合框。

以下是组合框的事件:

 if(uMsg == WM_COMMAND)
 {

  HMENU m;
  m = CreatePopupMenu();
  MENUITEMINFO itm;
  itm.cbSize = sizeof(MENUITEMINFO);
  itm.fMask = MIIM_FTYPE | MIIM_STRING;
  itm.fType = MIIM_STRING;
  itm.dwTypeData = "Kill time";
  itm.cch = 12;
POINT p;
GetCursorPos(&p);
  InsertMenuItem(m,4,false,&itm);

  if((int)HIWORD(wParam) == CBN_DROPDOWN)
  {
   SendMessage(engineGL.controls.TopSelHwnd,WM_KILLFOCUS,(WPARAM)engineGL.controls.TopSelHwnd,0);
   SendMessage(engineGL.controls.TopSelHwnd,WM_IME_SETCONTEXT,(WPARAM)0,(LPARAM)ISC_SHOWUIALL);

   TrackPopupMenu(m,0,p.x,p.y,NULL,hWnd,NULL);
    SendMessage(hWnd,WM_KILLFOCUS,0,0);

   SetFocus(HWND_DESKTOP);

  }

  return 1;
 } 

如何点击上下文菜单中的项目后,组合框会正常关闭,好像我真的从中选择了一个项目?

由于

1 个答案:

答案 0 :(得分:2)

我不确定。需要尝试你的代码。 但是我确信不应该手动发送WM_KILLFOCUS消息。相反,您需要通过调用SetFocus将焦点设置到另一个窗口。操作系统会自动向失去焦点的窗口和获得焦点的新窗口发送消息。