通过什么样的办法可以实现呢?

解决方案 »

  1.   

    比较困难把。你应该认识到所有的句柄只是一个标识而已,窗口的概念也不是仅仅指的就是主窗口,按钮也是窗口,所以区分起来有一定的难度。使用GetClassLong这个API可以从窗口句柄获得一些窗口的信息,但是还是要做一些判断或者是尝试的,没有亲自尝试过,参考:
    函数功能:该函数返回与指定窗口相关的WNDCLASSEX结构的指定32位值。  
     
           函数原型:DWORD  GetClassLong(HWND  hWnd,int  nlndex);  
     
           参数:  
     
           hWnd:窗口句柄间接给出的窗口所属的类。  
     
           nlndex:指定要恢复的32位值。从额外的类存储空间恢复一个32位的值,指定的一个大于等于0的被恢复值的偏移量。有效值为从0开始到额外类存储空间字节数一4。例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要从WNDCLASSEX结构中恢复任何值,需要指定下面值之一:  
     
           GCSW原子:获得一个唯一标识窗口类的原子值,该值与RegisterClassEx函数的返回值相同。  
     
           GCL_CBWNDEXTRA:获得与类中的每个窗口相关的额外窗口中内存空间的字节大小,进入该存储空间的方法请参看GetWindwoLong。  
     
           GCL_HBRBACKGROUND:获得与类有关的背景刷子的句柄。  
     
           GCL_HCURSOR:获得与类有关的光标的句柄。  
     
           GCL_HICON:获得与类有关的图标的句柄。  
     
           GCL_HICONSM:获得与类有关的小图标的句柄。  
     
           GCL_HMOUDLE:获得注册该类的模块的句柄。  
     
           GCL_MENUNAME:获得菜单名字符串的地址,该字符串标识了与类有关的菜单资源。  
     
           GCL_STYLE:获得窗口类的风格位。  
     
           GCL_WNDRPOC:获得与类有关的窗口过程的地址。  
     
           返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。  
      

  2.   

    int GetClassName(
      HWND hWnd,           // handle of window
      LPTSTR lpClassName,  // address of buffer for class name
      int nMaxCount        // size of buffer, in characters
    );
    取得classname如果classname 是 “BUTTON”,则是按钮
      

  3.   

    楼上的那个API在正常的情况下应该是可以的,但是如果在一些特殊的情况下是不对的。你可以使用Spy++看看金山词霸的按钮就知道了。呵呵,这个API获得的ClassName应该是在CreateWindow的时候传入的ClassName,如果你在编程的时候修改了这个那么这个API也无能为力!
      

  4.   

    哦,先谢谢各位,我想寻找一个窗体里的所有的按钮,都改成OwnerDraw风格,然后自己画它,现在还有一个问题,有没有办法让MessageBox弹出的对话框的按钮也改成OwnerDraw风格?
      

  5.   

    MessageBox中的按钮??建议你还是好好看看界面库设计方面的问题。界面库一般都是使用两种方法:1、提供重载的类,实现自画。
    2、通过HOOK技术,实现自画。你的要求可能需要通过HOOK实现相关的操作。
      

  6.   

    还有一个问题啊,为什么我双击按钮时,只会产生一次WM_DRAWITEM消息
      

  7.   

    你要做界面库?呵呵
    需要使用HOOK技术!
      

  8.   

    参考:
    http://www.vckbase.com/document/viewdoc/?id=1235
    http://www.vckbase.com/document/viewdoc/?id=817
      

  9.   

    为什么要用hook?
    我觉得窗体子类化就可以做到啊。还有上面的那两个参考好像也不能改变MessageBox的按钮风格啊