现在有一个窗体,我想让这个窗体的行为类似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展开的时候都会显示在父窗体外面,请问是怎么做到的?
{
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展开的时候都会显示在父窗体外面,请问是怎么做到的?
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;
}}
1 WM_FILLFOCUS
2 WM_MOUSELEAVE
2、把WS_CHILD风格去掉,换成WS_POPUP风格。
哦对,这个我看一下啊。
我试过了,按 win 键收不到。晕。