windows有个消息叫“WM_CTLCOLORSTATIC”,一个控件准备绘制的时候向父窗口发此消息,父窗口可以通过处理这个消息改变此控件的字体和颜色等当父窗口的消息处理函数在处理完毕后,会return一个brush句柄。现在问题来了:我hook了这个消息,也就是这个消息由我的callback函数来处理了,并不由父窗口的消息函数来处理了,我如何“返回”这个brush?如果我不能正确“返回”这个brush,绘制是不正常的。另外:我不想修改父窗口的消息处理函数,我想我根本不用关心父窗口如何,否则我就不要hook这个消息了。

解决方案 »

  1.   

    自己创建一个Brush,自己负责最后销毁它
      

  2.   

    好象只能用替换WindowProc的方法。
      

  3.   

    cnzdgs,具体怎么说来着?想想看确实比较没辙ghz,创建/销毁brush我都知道啊,关键如何像父窗口的处理过程那样 *返回* 一个brush
      

  4.   

    父窗口默认也是这么做的。似乎这个默认的BRUSH是系统提供的
      

  5.   

    你HOOK了这个消息??
    如果是标准的HOOK.你又不想处理.直接调用下一个HOOK就行了.
    如果你想自己处理,直接返回一个HBRUSH就行了.
    会有什么问题???
      

  6.   

    他觉得自己创建一个BRUSH返回比较亏,还是用别人的好
      

  7.   

    我hook了这个消息,我当然想处理它,但按照正常的处理(在父窗口的处理函数中完成),在处理完毕后要返回一个brush,然而,现在不是在父窗口的处理函数中,而是在我定义的hook回调函数中,你认为能直接返回这个brush么?我不创建brush也行 return ::GetStockObject(NULL_BRUSH); 这样既可,但这是在父窗口处理函数中的实现,在我的hook回调函数中这样是没有作用的。我的问题就是如何来返回这个HBRUSH
      

  8.   

    或者不往下传递,或者调用完下一层的CallWindowProc之后,return 一个BRUSH不行吗?
      

  9.   

    //...
    hook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, GetCurrentThreadId());
    LRESULT CALLBACK CallWndProc(int code, WPARAM wParam, LPARAM lParam)
    {
    CWPSTRUCT *pMsg= (CWPSTRUCT *)lParam;
    if(pMsg->message==WM_CTLCOLORSTATIC)
    {

    //Blah blah blah...
    return GetStockObject(NULL_BRUSH); //No effort here
    }
    return CallNextHookEx(hook, code, wParam, lParam);
    }
      

  10.   

    return GetStockObject(NULL_BRUSH); //No effort here
    知道NULL_BRUSH是什么意思吗?自己创建一个别的BRUSH试试
      

  11.   

    CallWindowProc 当然可以,但我就得修改父窗口的消息处理函数来响应WM_COLORCTLSTATIC了,如果这样的话我何必hook,hook就是企图单独处理这个消息,对于父窗口我可以根本不关心。比如WM_DRAWITEM这个消息处理起来就方便得多,因为不需要有什么特别的返回,我hook这个消息,然后对窗口进行绘制就是了。
      

  12.   

    NULL_BRUSH 使得背景不被填充,实现透明控件的一种方法,而现在这么一来背景是被填充成系统默认的灰色。
      

  13.   

    我之前做过很多类似的尝试,结论是只能通过设置WindowProc的方式。
    SetWindowsHookEx可以得到消息和返回值,但不能修改,传给Hook函数的结构看起来是“单向值传递”。
      

  14.   

    55555……难道问题真的就这样无解了吗?我狗急跳墙想出这个思路,cnzdgs看看成不:在父窗口处理WM_COLORCTLSTATIC之前,用SetWindowLong 修改父窗口的 WindowProc,这个WindowProc是我写的一个全局的函数,这个函数只处理WM_COLORCTLSTATIC这个消息,它返回NULL_BRUSH句柄在处理完这个消息之后,我再调用SetWindowLong把父窗口的WindowsProc 改回去。这样就需要我安装两个钩子,一个WH_CALLWNDPROC,一个WH_CALLWNDPROCRET虽然这样就不符合我刚才说的“不关心父窗口”的规则,但看起来父窗口确实不需要动,看起来如此……
      

  15.   

    应该可以。在自己的WindowProc中恢复原窗口函数就可以了,不必再用WH_CALLWNDPROCRET。
      

  16.   

    搞定了,可以临时修改父窗口WINPROC的,利用这个方法,就能实现看起来很整洁的代码了 ^o^