菜单到底是不是窗口

wltg2001 2010-01-19 03:25:20
以前我认为菜单不是窗口,不过前几天在一个帖子里看到有人说菜单是窗口,并且说类名为:_T("#32768"),因为说得也不太详细,所以想问一下,有没有哪位知道,如果菜单是窗口的话,能不能子类化,如何进行子类化?
...全文
373 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
aslaka 2012-08-29
  • 打赏
  • 举报
回复
潜了这么久,上来冒个泡!
楼上讲的都有理!不过我觉得CMenu是一个特殊的窗口
qwerttrewq55 2012-08-23
  • 打赏
  • 举报
回复
个人认为菜单是资源,和图标、光标是一类的。
hilevel 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lllyyy2403 的回复:]
菜单类基于CMENU类,而CMENU类是COBJECT类的子类,
窗口类的继承关系:
CObject--->CCmdTarget--->CWnd
菜单类的继承关系
CObject--->CMENU

----------------------由此可见菜单类并非是一个窗口类,它们只是拥有一个共同的祖先COBJECT类。
[/Quote]
我也是这么想的
wltg2001 2010-01-19
  • 打赏
  • 举报
回复
多谢各位,基本上明白了,不过没实验。
cnzdgs 2010-01-19
  • 打赏
  • 举报
回复
“利用菜单的相关消息”,例如响应WM_INITMENUPOPUP消息,将某个菜单项设置为owner draw,再响应WM_DRAWITEM消息中用FindWindow等方法获取句柄。

“SetWindowHookEx”可以试一下WH_CBT和WH_CALLWNDPROC两种类型的钩子,通过GetClassName获取类名来判断。
xyytuo 2010-01-19
  • 打赏
  • 举报
回复
我觉得是窗口
清明_ 2010-01-19
  • 打赏
  • 举报
回复
好好学习
wltg2001 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 cnzdgs 的回复:]
可以从CWnd派生一个类,构造对象并用SubClassWindow子类化;也可以直接用SetWindowLong设置WNDPROC。菜单的HWND可以通过SetTimer在菜单显示后用FindWindow得到,或者利用菜单的相关消息来处理,也可以考虑用SetWindowHookEx拦截消息。
[/Quote]
如果是窗口,子类化的关键就是它的HWND的获取,“用SetTimer在菜单显示后用FindWindow得到”这个倒是好懂,后面“或者利用菜单的相关消息来处理,也可以考虑用SetWindowHookEx拦截消息”能不能说详细一点呢?
cnzdgs 2010-01-19
  • 打赏
  • 举报
回复
可以从CWnd派生一个类,构造对象并用SubClassWindow子类化;也可以直接用SetWindowLong设置WNDPROC。菜单的HWND可以通过SetTimer在菜单显示后用FindWindow得到,或者利用菜单的相关消息来处理,也可以考虑用SetWindowHookEx拦截消息。
wocow3 2010-01-19
  • 打赏
  • 举报
回复
菜单也是窗口,但是主要由系统控制,用户能操作的空间很小
crystal_dark 2010-01-19
  • 打赏
  • 举报
回复
学习
xwsn007 2010-01-19
  • 打赏
  • 举报
回复
高手们别光讨论是不是窗口啊,说说楼主关心的第二个问题:
能不能子类化,如何进行子类化? (如果菜单是个特殊窗口的话)
xwsn007 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liumenghappy 的回复:]
引用 10 楼 wangk 的回复:
是窗口,不过是特殊窗口

特殊窗口还有:

Class Description

ComboLBox The class for the list box contained in a combo box.
DDEMLEvent Windows NT/Windows 2000/Windows XP: The class for Dynamic Data Exchange Management Library (DDEML) events.
Message Windows 2000/Windows XP: The class for a message-only window.
#32768 The class for a menu.
#32769 The class for the desktop window.
#32770 The class for a dialog box.
#32771 The class for the task switch window.
#32772 Windows NT/Windows 2000/Windows XP: The class for icon titles.

哦,原来这样呀。我在网上搜到这些:
菜单其实也是一种窗口,是类名为“#32768”的窗口,我们可以通过钩子截取窗口过程,对相应的消息进行处理,需要注意的是,菜单窗口不是通过WM_PAINT和WM_NCPAINT对窗口进行绘制,而是通过WM_PRINT(整个窗口)和WM_PRINTCLIENT(客户区)进行绘制。下面介绍具体实现的过程: 。。。。。
详见网址:http://hi.baidu.com/invisiable/blog/item/8fd4902443588b044d088dc8.html
[/Quote]

验证 & 学习
job82824 2010-01-19
  • 打赏
  • 举报
回复
我觉得应该是吧,windows的所有控件都可以称为窗口的,只是有的不是从CWnd类继承的。
luhongyu2108 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jyh_baoding 的回复:]
WINDOWS所有的控件都是基于窗口的
[/Quote]
正解
jingzhongrong 2010-01-19
  • 打赏
  • 举报
回复
应该是特殊的一类窗口,类似#13楼的东西做过一次。
可以通过SetWindowLong指定GWL_WNDPROC来替换窗口过程。
xxfxiazai 2010-01-19
  • 打赏
  • 举报
回复
看到最后貌似还是没有确定的答案
xwsn007 2010-01-19
  • 打赏
  • 举报
回复
框架的菜单不是窗口,也不是控件,菜单栏跟工具栏和状态栏不一样,不算在窗口的客户区,好像由系统负责
绘制 (窗口类的范畴)
liumenghappy 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangk 的回复:]
是窗口,不过是特殊窗口

特殊窗口还有:

Class Description

ComboLBox The class for the list box contained in a combo box.
DDEMLEvent Windows NT/Windows 2000/Windows XP: The class for Dynamic Data Exchange Management Library (DDEML) events.
Message Windows 2000/Windows XP: The class for a message-only window.
#32768 The class for a menu.
#32769 The class for the desktop window.
#32770 The class for a dialog box.
#32771 The class for the task switch window.
#32772 Windows NT/Windows 2000/Windows XP: The class for icon titles.
[/Quote]
哦,原来这样呀。我在网上搜到这些:
菜单其实也是一种窗口,是类名为“#32768”的窗口,我们可以通过钩子截取窗口过程,对相应的消息进行处理,需要注意的是,菜单窗口不是通过WM_PAINT和WM_NCPAINT对窗口进行绘制,而是通过WM_PRINT(整个窗口)和WM_PRINTCLIENT(客户区)进行绘制。下面介绍具体实现的过程: 。。。。。
详见网址:http://hi.baidu.com/invisiable/blog/item/8fd4902443588b044d088dc8.html
liumenghappy 2010-01-19
  • 打赏
  • 举报
回复
应该是窗口
加载更多回复(11)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧