我不理解ScrollProc中处理WM_SETFOCUS的作用,我认为主视窗处理了WM_SETFOCUS就行了呀,而且如果我在ScrollProc中不处理WM_SETFOCUS这个消息,程序执行与原来没什么区别,为什么?大家知道在ScrollProc中处理WM_SETFOCUS的作用么?
具体情况如下,请大家耐着性子帮我看一下,谢谢了。只列出主要代码!!
卷动列 = 滚动条
讯息 = 信息
程式 = 程序
变数 = 变量
挂勾 = 钩子
为了给卷动列提供全面的键盘介面,还需要另外一些工作。首先,WndProc视窗讯息处理程式必须使卷动列拥有输入焦点,它是通过处理WM_SETFOCUS讯息来完成这一点的,该WM_SETFOCUS讯息是当卷动列获得输入焦点时其父视窗接收到的。WndProc给其中一个卷动列设定输入焦点。SetFocus (hwndScroll[idFocus]) ;
其中idFocus是一个整体变数。但是,还需要一些借助键盘尤其是Tab键,来从一个卷动列转换到另一个卷动列的方法。这比较困难,因为一旦某个卷动列拥有了输入焦点,它就处理所有的键盘输入,但卷动列只关心游标键,而忽略Tab键。解决这一两难处境的方法是「视窗子类别化」。我们将用它来给COLORS1增加使用Tab键从一个卷动列跳到另一个卷动列的功能。
视窗子类别化(Window Subclassing)
 卷动列控制项的视窗讯息处理程式是Windows内部的。但是,将GWL_WNDPROC识别字作为参数来呼叫GetWindowLong,您就可以得到这个视窗讯息处理程式的位址。另外,您可以呼叫SetWindowLong给该卷动列设定一个新的视窗讯息处理程式,这个技术叫做「视窗子类别化」,非常有用。它能让您给现存的视窗讯息处理程式设定「挂勾」,以便在自己的程式中处理一些讯息,同时将其他所有讯息传递给旧的视窗讯息处理程式。在COLORS1中对卷动讯息进行初步处理的视窗讯息处理程式叫做ScrollProc,它在COLORS1.C档案的尾部。由於ScrollProc是COLORS1中的函式,而Windows将呼叫COLORS1,所以ScrollProc必须被定义为callback函式。对三个卷动列中的每一个,COLORS1使用SetWindowLong来设定新的卷动列视窗讯息处理程式的位址,并取得现存卷动列视窗讯息处理程式的位址:OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC,
          (LONG) ScrollProc)) ;
现在,函式ScrollProc得到了Windows发送到COLORS1中三个卷动列(当然不是其他程式中的卷动列)的卷动列视窗讯息处理程式的全部讯息。ScrollProc视窗讯息处理程式在接收到Tab或者Shift-Tab键时,就将输入焦点改变到下一个(或者上一个)卷动列。它使用CallWindowProc呼叫旧的卷动列视窗讯息处理程式。           
LRESULT  CALLBACK  ScrollProc  (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)  
{  
                     int  id  =  GetWindowLong  (hwnd,  GWL_ID)  ;
  
                     switch  (message)
  
                     {  
                     case  WM_KEYDOWN  :                         if  (wParam  ==  VK_TAB)  
                 SetFocus  (GetDlgItem  (GetParent  (hwnd),    
                      (id  +  (GetKeyState  (VK_SHIFT)  <  0  ?  2  :  1))  %  3))  ;  
                            break  ;
  
                     case   WM_SETFOCUS  :  
                           idFocus  =  id  ;                      //此idFocus的用处是?  
                             break  ;  
                     }        return  CallWindowProc  (OldScroll[id],  hwnd,  message,  wParam,lParam)  ;  
}  
 还有主视窗处理程序中处理WM_SETFOCUS信息代码如下,其中idFocus是个int全局变量
                            case  WM_SETFOCUS :
           SetFocus (hwndScroll[idFocus]) ;
           return 0 ;

解决方案 »

  1.   

    昏 Scroll本身就有TAB属性你鼠标点上去后它不就有焦点了吗 
    你说的太长了 都没搞清楚你具体想了解什么 
    上面的文章是不是侯杰译的MFC Windows程序设计啊
      

  2.   

    idFocus  =  id  ;                      //此idFocus的用处是?  
    当你视图上有两个以上滚动条,鼠标单击其中一个滚动条产生WM_KEYDOWN消息 此时程序只有通过int  id  =  GetWindowLong  (hwnd,  GWL_ID)  ;
    SetFocus (hwndScroll[idFocus]) 
    来知道你单击的是那一个