如题!
SetActiveView是设置活动视图,设置成活动视图的试图可以捕获鼠标和按钮消息,那它和SetFocus作用好像一样啊

解决方案 »

  1.   

    使用的地方不一样,当你想在客户区之外捕获鼠标时,使用SetCapture.
      

  2.   

    当你想让某个控件获取焦点,使用SetFocus
      

  3.   

    SetFocus一般给控件窗口用的,使某个控件能接收键盘输入。
    SetCapture是设置某个窗口接收鼠标的输入,与setFocus类似。
      

  4.   

    1. SetActiveView是MFC框架内的一个函数, 而不是SDK中的函数, 也就是说SDK中没有ActiveView这个概念, 只有在MFC中才有
    2. SetFocus是SDK中的函数(当然MFC中也有这个, 作用是一样的), 拥有Focus的窗口能接受键盘的输入
    3. SetCapture设置当前线程的特定窗口的鼠标捕获, 也就是说当前线程一旦设定了某个窗口SetCapture, 那么在调用 ReleaseCapture 之前, 鼠标的消息都会发送到这个窗口
      

  5.   

    你的意思是SetActiveView和SetFocus作用一样?可是我在视图A中把视图B设为活动视图,然后再在视图A里调用SetFocus,这时视图A还可以截获鼠标的滚轮消息,而且这是视图B能捕获浮动工具条的按钮消息,疑惑中
      

  6.   

    其实看下MSDN的定义就知道了
    他们都还是有区别的
    SetCapture
    This function sets the mouse or style capture to a specified window that belongs to the current thread. After you call this function for a window, the window captures mouse input that occurs while the mouse cursor remains within the window. The window also captures mouse input that occurs when the user presses a mouse button while the mouse cursor is located within the window and continues to hold the mouse button down while moving the mouse. Only one window at a time can capture the mouse or stylus. SetFocus Function
    The SetFocus function sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue.
      

  7.   

    你的意思是SetActiveView和SetFocus作用一样?
    在MFC中SetActiveView函数中调用了SetFocus, 所以你的ActiveView就能捕获键盘消息. 另外鼠标中键滚动消息是发送给拥有Focus的窗口的视图B能捕获浮动工具条的按钮消息
    主要是因为视图b仍是ActiveView, 而MFC中浮动工具条会发送给当前的ActiveView
      

  8.   

    有道理,怪不得这时虽然试图B是活动视图,但只有视图A才能响应鼠标中键呢。可是还是有点不明白,除了鼠标和键盘消息,被SetFocus视图A为什么不能截获其他按键消息呢?
      

  9.   


    其他消息你是指比如工具栏, 菜单栏消息吧
    在MFC框架中, 那些是将消息发送给ActiveView, 而不是发送给当前拥有Focus的窗口的
      

  10.   

    sandyandy:我自己总结了一下,你看对不?
    1、工具栏、菜单栏按钮消息,即所谓的命令消息,它们的消息传递的方式是拐弯上溯(侯俊杰老师的说法),消息会先到view那里,这里view就是MFC的活动视图,用SetActiveView来设置
    2、鼠标、键盘消息是一般windows消息,它们消息传递的方式是直线上溯,消息会到拥有Focus的视图那里然后再请教你一个问题:
    对于我说的第二种情况,如果没有视图拥有Foucs,那消息会到哪里呢?是发给活动视图,还是发给鼠标点击时位于最上端的试图?
      

  11.   

    键盘消息,鼠标中键的消息特殊, 是发给拥有focus的窗口鼠标左击, 右击等信息发送到鼠标下的窗口, 即WindowFromPoint(ptCursor)
      

  12.   

    这个WindowFromPoint得到的窗口句柄,应该和鼠标左击, 右击时发送消息pMsg->hwnd一样吧
      

  13.   

    SetFocus 和SetActiveView得区别弄明白了,还有个SetCapture,这个函数我不常用,好像跟SetFocus一样啊? 
      

  14.   

    SetCapture主要是可以让一个窗口获得一种能力,
    这种能力是
    当鼠标不在窗口区域或范围内移动时让窗口依然可以感知到鼠标在移动.
      

  15.   

    SetFocus通常是针对子窗口的,键盘输入焦点。SetActiveView这个都和view挂上了,显示是mfc里的东西,控制当前活动view的
      

  16.   

    你的意思是说如果视图A被SetCapture,那么即使在视图B中点击鼠标,这个鼠标消息也由视图A获取吗
      

  17.   


    没错,不过你在窗口区域外点击的后会解除当前对视图A的captrue状态的.
      

  18.   

    这样的话感觉又和SetFocus一样了
      

  19.   

    被SetFocus的视图不是也可以在鼠标不在这个视图内时获取鼠标消息吗
      

  20.   

    MARK,希望像这样的帖子越来越多
      

  21.   

    oldn_CC_bird:麻烦你说下原因,谢了
      

  22.   

    你看msdn啊,
    setfocus从来没说过自己有captrue mouse的功能.
    但他可以capture keyboard input;
    而setCaptrue和它相反可以capture mouse input 但不能capture keyboard的,
    这样说应该更清晰一些
      

  23.   

    自己的总结:
    1、工具栏、菜单栏按钮消息,即所谓的命令消息,它们的消息传递的方式是拐弯上溯(侯俊杰老师的说法),消息会先到view那里,这里view就是MFC的活动视图,用SetActiveView来设置。
    2、鼠标、键盘消息是一般windows消息,它们消息传递的方式是直线上溯。其中,滚轮、键盘消息会传到拥有Focus的视图那里,用setfocus来设置,如果没有设置Focus,则会传到ActiveView那里;单击、双击、右键等消息会传到拥有Capture的试图那里,用SetCapture来设置,如果没有设置,则会到WindowFromPoint(获取包含指定点的窗口的句柄)那里。
    有什么不足的还请各个补充一下,感激不尽!