我的程序问题出在那里? 既然鼠标离开了窗口,点就已经不起作用了,也就是说else后就不起作用了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 哈哈,告诉你用settime GetCapture,不要用SetCapture啊,那很占系统资源 我对vc也不熟悉,我说说我的看法:只有当鼠标在你的对话框之内时windows才会将鼠标消息发给你的应用程序,你的对话框消息处理过程才会对它进行处理(当然如果你进行了鼠标捕捉除外),上面你的程序在wm_mousemove消息处理程序中实现这样的功能是有问题的,因为你的对话框只可能接收到鼠标在对话框范围之内的鼠标移动消息,当鼠标移出对话框之后,你的程序不可能收到wm_mousemove消息了,所以你的OnMouseMove()函数中的else后的部分永远都不可能得到执行。 to supperlxf(嘿嘿) 我试试你的方法。应该不错 用_TrackMouseEvent()函数把,可以达到ToolBar那样的灵敏效果://set track mousre eventTRACKMOUSEEVENT TMEStruct = {sizeof(TRACKMOUSEEVENT),TME_LEAVE,m_hWnd,0};_TrackMouseEvent(&TMEStruct);//cancel track mouse eventTRACKMOUSEEVENT TMEStruct = {sizeof(TRACKMOUSEEVENT),TME_CANCEL | TME_LEAVE,m_hWnd,0};_TrackMouseEvent(&TMEStruct);然后就可以在窗口中手工重载WM_MOUSELEAVE消息,此消息在鼠标离开窗口时就会发给窗口. 谢谢 In355Hz(好象一条狗) 请看看,我现在改成这样。好象只能响应else 的语句了。鼠标放上去,没有反应。 void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; GetWindowRect(&rect); ClientToScreen(&point); if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} 这样: void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; GetWindowRect(&rect); // ClientToScreen(&point); if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} 漏了: void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; //GetWindowRect(&rect); // ClientToScreen(&point); GetCapture(.....) if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} to supperlxf(嘿嘿) 鼠标离开后,还是没有响应 void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; GetWindowRect(&rect);// ClientToScreen(&point);GetCapture(); if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,160, 110, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} 看我这: void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; GetWindowRect(&rect); // ClientToScreen(&point); GetCapture(point) if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} 吐血: void CRf001Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint point; CRect rect; GetWindowRect(&rect); // ClientToScreen(&point); point=GetCapture(); if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent);} supperlxf(嘿嘿) 你先试一下吧,还是不行。 运行成功看: POINT point; CRect rect; GetWindowRect(&rect); ::GetCursorPos(&point); if (rect.PtInRect(point)) { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); ::MessageBox(0," "," ",0); } else { ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW); } CDialog::OnTimer(nIDEvent); 谢谢 supperlxf(嘿嘿) 问题解决了。 我会给分的, 还有个问题,我的程序一开始出现在屏幕中央, 怎样是它一开始就显示在最上方。 再加20分。 oncreate时::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, -20, 280, 20, SWP_SHOWWINDOW);分我不要了,你放了我吧 【请教】关于如何重载OnFileOpen 无符号整型溢出问题 窗口的父窗口与所有者窗口问题. strtok的返回值是什么? 怎样在文件中输出? 如何使菜单可以浮动、移动,就像Toolbar和Rebar一样,Word2003里面菜单。有么有这种类? 用过minifmod的请进 thanks for your help! 我想学会创建DLL,不知如何入手,请提供一些步骤 为什么VC编写的DLL向VB返回参数时的问题(由于本人可用分有限,给分较少请见谅) 急!急!像这种直接运行时才会出现的错误,怎么调试呀?? 请问在华为VC和C/c++那个用的多?? 关于术语转换的问题?
只有当鼠标在你的对话框之内时windows才会将鼠标消息发给你的应用程序,
你的对话框消息处理过程才会对它进行处理(当然如果你进行了鼠标捕捉除外),
上面你的程序在wm_mousemove消息处理程序中实现这样的功能是有问题的,因为
你的对话框只可能接收到鼠标在对话框范围之内的鼠标移动消息,当鼠标移出对话框
之后,你的程序不可能收到wm_mousemove消息了,所以你的OnMouseMove()函数中
的else后的部分永远都不可能得到执行。
//set track mousre event
TRACKMOUSEEVENT TMEStruct = {
sizeof(TRACKMOUSEEVENT),
TME_LEAVE,
m_hWnd,
0
};
_TrackMouseEvent(&TMEStruct);
//cancel track mouse event
TRACKMOUSEEVENT TMEStruct = {
sizeof(TRACKMOUSEEVENT),
TME_CANCEL | TME_LEAVE,
m_hWnd,
0
};
_TrackMouseEvent(&TMEStruct);
然后就可以在窗口中手工重载WM_MOUSELEAVE消息,此消息在鼠标离开窗口时就会发给窗口.
好象只能响应else 的语句了。鼠标放上去,没有反应。 void CRf001Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
GetWindowRect(&rect);
ClientToScreen(&point); if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
void CRf001Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
GetWindowRect(&rect);
// ClientToScreen(&point); if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
//GetWindowRect(&rect);
// ClientToScreen(&point);
GetCapture(.....)
if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
GetWindowRect(&rect);
// ClientToScreen(&point);
GetCapture();
if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,160, 110, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
void CRf001Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
GetWindowRect(&rect);
// ClientToScreen(&point);
GetCapture(point)
if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
void CRf001Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CPoint point;
CRect rect;
GetWindowRect(&rect);
// ClientToScreen(&point);
point=GetCapture();
if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW); }
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
}
CDialog::OnTimer(nIDEvent);
}
POINT point;
CRect rect;
GetWindowRect(&rect);
::GetCursorPos(&point);
if (rect.PtInRect(point))
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100, SWP_SHOWWINDOW);
::MessageBox(0," "," ",0);
}
else
{
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100, SWP_SHOWWINDOW);
} CDialog::OnTimer(nIDEvent);
我的程序一开始出现在屏幕中央, 怎样是它一开始就显示在最上方。 再加20分。
::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, -20, 280, 20, SWP_SHOWWINDOW);
分我不要了,你放了我吧