DWORD dwStyleOld, dwStyleNew;
dwStyleOld=GetWindowLong(hButtonWnd,GWL_STYLE);
dwStyleNew=WS_CHILD|WS_VISIBLE|BS_OWNERDRAW;
SetWindowLong(hButtonWnd,GWL_STYLE,dwStyleNew);注意:它的WM_DRAWITEM消息是发给button的父窗口,不是button本身!

解决方案 »

  1.   

    谢谢,谢谢!但是你不设置BUTTON的CALLBACK函数吗?
      

  2.   

    一旦我调用了SetWindowLong(hBtndown[1],GWL_WNDPROC,(LONG)OwnDrawProc),WM_DRAWITEM便不再发出了,不管是父窗口还是BUTTON本身都收不到这个消息;我把它注释起来后,主窗口便收到这个消息了,这是怎么回事啊?
      

  3.   

    关键在自画Button的真正内存结构是怎样的,如果只是简单的继承当然消息处理函数还是父类的,要自己构造生成button的内存资源结构。
      

  4.   

    你子类化应定义自己的处理函数,建议用new 类
      

  5.   

    to KeepLoading:
    不要设BUTTON的CALLBACK函数,
    在父窗口的处理函数中处理就行了。
      

  6.   

    WM_CREATE:
        ...
        hButton = CreateWindow(....BS_OWNERDRAW | WS_CHILD | WS_VISIBLE ....);
        ButtonWnd = (WNDPROC)SetWindowLong(hButton,GWL_WNDPROC,(LONG)ButtonProc);
        ...
    WM_DRAWITEM:
        return TRUE;
    ....
    BOOL CALLBACK ButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
        switch(message){
            ....
            WM_DRAWITEM:
                return TRUE;
        }
        return ::CallWindowProc(ButtonWnd,hwnd,message,wParam,lParam);
    }
    只要我调用SetWindowLong(),主窗口过程就收不到WM_DRAWITEM了,BUTTON的窗口过程也收不到,我就连整个BUTTON都出不来了!我不可能用WM_PAINT来做这个事吧!总之烦死了!谁要是真的想帮我请加我的QQ把:29139202,稽首为谢了!!
      

  7.   

    qq's problem, i can't send you the project..
    or you can leave your email..