怎样根据一个控件的句柄判断这个控件是否是按钮? 通过什么样的办法可以实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 比较困难把。你应该认识到所有的句柄只是一个标识而已,窗口的概念也不是仅仅指的就是主窗口,按钮也是窗口,所以区分起来有一定的难度。使用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函数。 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”,则是按钮 楼上的那个API在正常的情况下应该是可以的,但是如果在一些特殊的情况下是不对的。你可以使用Spy++看看金山词霸的按钮就知道了。呵呵,这个API获得的ClassName应该是在CreateWindow的时候传入的ClassName,如果你在编程的时候修改了这个那么这个API也无能为力! 哦,先谢谢各位,我想寻找一个窗体里的所有的按钮,都改成OwnerDraw风格,然后自己画它,现在还有一个问题,有没有办法让MessageBox弹出的对话框的按钮也改成OwnerDraw风格? MessageBox中的按钮??建议你还是好好看看界面库设计方面的问题。界面库一般都是使用两种方法:1、提供重载的类,实现自画。2、通过HOOK技术,实现自画。你的要求可能需要通过HOOK实现相关的操作。 还有一个问题啊,为什么我双击按钮时,只会产生一次WM_DRAWITEM消息 你要做界面库?呵呵需要使用HOOK技术! 参考:http://www.vckbase.com/document/viewdoc/?id=1235http://www.vckbase.com/document/viewdoc/?id=817 为什么要用hook?我觉得窗体子类化就可以做到啊。还有上面的那两个参考好像也不能改变MessageBox的按钮风格啊 有关DXF文件的问题 问三个线程的简单问题 求教 用EDIT的SetBkColor()设置背景颜色时受字体大小影响,请问怎么使背景颜色铺满整个EDIT的编辑框 这是我按书上编写的window程序,有几个错误,请指教? VC初学者问--关于基于对话框的应用程序实现问题! 请问:怎么在视图中根据不同位置,响应提示窗口(Tooltip)??? 关于句柄的问题 超强面试 求教在GDI+中,测量字符串准确长度的办法 CListCtrl::EnsureVisible()可以使指定的item可见,但是如何把它提到当前区域的第一条呢? 如何动态生成菜单 数据度取问题
函数功能:该函数返回与指定窗口相关的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函数。
HWND hWnd, // handle of window
LPTSTR lpClassName, // address of buffer for class name
int nMaxCount // size of buffer, in characters
);
取得classname如果classname 是 “BUTTON”,则是按钮
2、通过HOOK技术,实现自画。你的要求可能需要通过HOOK实现相关的操作。
需要使用HOOK技术!
http://www.vckbase.com/document/viewdoc/?id=1235
http://www.vckbase.com/document/viewdoc/?id=817
我觉得窗体子类化就可以做到啊。还有上面的那两个参考好像也不能改变MessageBox的按钮风格啊