用SetCapture捕获鼠标消息

初次接触SetCapture一直不知道这个函数到底有什么作用,后来反复看了几遍书后才稍微理出了一点儿头绪。
我用TRACE宏对SetCapture、GetCapture和ReleaseCapture这三个函数作了测试:
void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
    ::SetCapture(this->GetSafeHwnd());
}
void CMainWindow::OnLButtonUp(UINT nFlags, CPoint point)
{
   
    if (GetCapture() == this)
    {
        TRACE(_T("123\n"));
    }
    else
    {
        TRACE(_T("456\n"));
    }
    ::ReleaseCapture();
}
写这段代码,我本意是想当在窗口中点击并释放鼠标时,在调试窗口中输出“123”;在窗口中点击鼠标但在窗口外释放鼠标时,输出“456”,但我完全错了。由于我在OnLButtonDown消息中已经捕获了鼠标,而我的TRACE输出语句又是在::ReleaseCapture函数执行之前,所以不管在什么情形下释放鼠标左键,永远都只会输出“123”。而将::ReleaseCapture函数放在OnLButtonUp消息的最前面执行,又会永远只输出“456”。
于是我又作了一个测试,交OnLButtonDown消息中的SetCapture和OnLButtonUp消息中的ReleaseCapture注释掉,却又发现TRACE永远都只输出“456”,原来是在没用使用SetCapture捕捉鼠标的情况下,GetCapture永远都只会返回NULL。
由此得出结论,SetCapture和ReleaseCapture必须成对出现。

posted @ 2009-04-25 23:55  冷寒生  阅读(298)  评论(0编辑  收藏  举报
IT知识库