现在有一个窗体,我想让这个窗体的行为类似Menu,即失去焦点或者鼠标点击别的地方就关闭。如何??首先得加一个这样的函数:其中 is_tracking_ 表示是否不再吞吃消息void pump_message()
{
while (is_tracking_)
{
MSG msg;
if (::GetMessage(&msg, NULL, NULL, NULL))
{
if (!is_tracking_)
{
::PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
break;
} if (msg.message != WM_KICKIDLE && !AfxGetThread()->PreTranslateMessage(&msg))
{
// process this message
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
else
break;
}}现在的问题就是什么时候设置is_tracking_ 为 false很多人可能会说相应WM_FILLFOCUS,但是效果很不理想。也有人说使用SetCapture,然后再判断,效果也不理想。我看了一下xtreme的实现,里面加了键盘HooK,我觉得是不是有些复杂??问问有没有人做过的给点经验!!2.如何让子窗体显示在父窗体外面?这个问题看似有些奇怪,但是仔细想想菜单,或者CComboBox展开的时候都会显示在父窗体外面,请问是怎么做到的?

解决方案 »

  1.   


    void pump_message()
    {
    while (is_tracking_)
    {
    MSG msg;
    if (::GetMessage(&msg, NULL, NULL, NULL))
    {
    if (!is_tracking_)
    {
    ::PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
    break;
    } if (msg.message != WM_KICKIDLE && !AfxGetThread()->PreTranslateMessage(&msg))
    {
    // process this message
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
    }
    }
    else
    break;
    }}
      

  2.   

    处理试试
    1 WM_FILLFOCUS 
    2 WM_MOUSELEAVE
      

  3.   

    WM_MOUSELEAVE  需要在WM_MOUSEMOVE中加_TrackMouseEvent
      

  4.   

    1、窗口响应WM_ACTIVATE消息,判断nState为WA_INACTIVE时关闭。
    2、把WS_CHILD风格去掉,换成WS_POPUP风格。
      

  5.   

    SetCapture捕获鼠标输入,加上处理WM_KILLFOCUS消息(如果有焦点)即可。
      

  6.   

    窗口响应WM_ACTIVATE消息,判断nState为WA_INACTIVE时关闭。 ------------------------
    哦对,这个我看一下啊。
      

  7.   


    我试过了,按 win 键收不到。晕。
      

  8.   

    2、把WS_CHILD风格改成WS_POPUP风格。
      

  9.   

    看了一下win2k代码,他的trackpopupmenu里面巨复杂麻烦啊~~~