Пример #1
0
void CFrameWnd::OnContextHelp()
/*****************************/
{
    if( !m_bHelpMode && CanEnterHelpMode() ) {
        m_bHelpMode = TRUE;
        ::SetCursor( _HelpCursor );
        
        UINT nIDOld = (UINT)::SendMessage( m_hWnd, WM_SETMESSAGESTRING,
                                           AFX_IDS_HELPMODEMESSAGE, 0L );
        if( nIDOld == 0 ) {
            nIDOld = AFX_IDS_IDLEMESSAGE;
        }
        
        CWinApp *pApp = AfxGetApp();
        ASSERT( pApp != NULL );
        
        MSG         msg;
        LONG        lCount = 0L;
        DWORD_PTR   dwHelpId = 0L;
        for( ;; ) {
            while( !::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
                if( pApp->OnIdle( lCount ) ) {
                    lCount++;
                } else {
                    ::WaitMessage();
                }
            }
            ::GetMessage( &msg, NULL, 0, 0 );
            if( msg.message == WM_EXITHELPMODE ) {
                break;
            } else if( msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE ) {
                break;
            } else if( (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) ||
                       msg.message == WM_SYSCOMMAND ) {
                if( !pApp->PreTranslateMessage( &msg ) ) {
                    ::TranslateMessage( &msg );
                    if( msg.message != WM_SYSKEYDOWN && msg.message != WM_SYSKEYUP &&
                        msg.message != WM_SYSCHAR && msg.message != WM_SYSDEADCHAR &&
                        msg.message != WM_SYSCOMMAND ) {
                        continue;
                    }
                }
            } else if( msg.message == WM_LBUTTONDOWN ||
                       msg.message == WM_NCLBUTTONDOWN ) {
                int nHitTest = (int)::SendMessage( msg.hwnd, WM_NCHITTEST, 0,
                                                   MAKELPARAM( msg.pt.x, msg.pt.y ) );
                if( nHitTest == HTCLIENT ) {
                    HWND hWnd = msg.hwnd;
                    while( hWnd != NULL && dwHelpId == 0L ) {
                        CPoint point( msg.pt );
                        ::ScreenToClient( hWnd, &point );
                        dwHelpId = (DWORD_PTR)::SendMessage( hWnd, WM_HELPHITTEST, 0,
                                                             MAKELPARAM( point.x,
                                                                         point.y ) );
                        hWnd = ::GetParent( hWnd );
                    }
                    break;
                } else if( nHitTest >= 0 && nHitTest != HTMENU &&
                           nHitTest != HTSYSMENU ) {
                    dwHelpId = HID_BASE_NCAREAS + nHitTest;
                    break;
                }
            }
            ::DispatchMessage( &msg );
        }
        m_bHelpMode = FALSE;
        ::SendMessage( m_hWnd, WM_SETMESSAGESTRING, nIDOld, 0L );

        POINT point;
        ::GetCursorPos( &point );

        HWND hWndCursor = ::WindowFromPoint( point );
        if( hWndCursor != NULL ) {
            int nHitTest = (int)::SendMessage( hWndCursor, WM_NCHITTEST, 0,
                                                 MAKELPARAM( point.x, point.y ) );
            ::SendMessage( hWndCursor, WM_SETCURSOR, (WPARAM)hWndCursor,
                           MAKELPARAM( nHitTest, WM_MOUSEMOVE ) );
        } else {
            HCURSOR hCursor = ::LoadCursor( NULL, IDC_ARROW );
            ::SetCursor( hCursor );
        }

        if( dwHelpId != 0L ) {
            pApp->WinHelpInternal( dwHelpId );
        }
    }
}